summaryrefslogtreecommitdiffstats
path: root/tests/zvalidation.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/zvalidation.js')
-rw-r--r--tests/zvalidation.js227
1 files changed, 227 insertions, 0 deletions
diff --git a/tests/zvalidation.js b/tests/zvalidation.js
new file mode 100644
index 0000000..64231b0
--- /dev/null
+++ b/tests/zvalidation.js
@@ -0,0 +1,227 @@
+#!/usr/bin/env node
+
+"use strict";
+
+const tape = require('blue-tape');
+
+global.Zmodem = require('./lib/zmodem');
+
+const zcrc = Zmodem.CRC;
+
+var now = new Date();
+var now_epoch = Math.floor( now.getTime() / 1000 );
+
+var failures = [
+ [
+ 'empty name',
+ { name: "" },
+ function(t, e) {
+ t.ok( /name/.test(e.message), 'has “name”' );
+ },
+ ],
+ [
+ 'non-string name',
+ { name: 123 },
+ function(t, e) {
+ t.ok( /name/.test(e.message), 'has “name”' );
+ t.ok( /string/.test(e.message), 'has “string”' );
+ },
+ ],
+ [
+ 'non-empty serial',
+ { name: "123", serial: 0 },
+ function(t, e) {
+ t.ok( /serial/.test(e.message), 'has “serial”' );
+ },
+ ],
+ [
+ 'files_remaining === 0',
+ { name: "123", files_remaining: 0 },
+ function(t, e) {
+ t.ok( /files_remaining/.test(e.message), 'has “files_remaining”' );
+ },
+ ],
+ [
+ 'pre-epoch mtime',
+ { name: "123", mtime: new Date("1969-12-30T01:02:03Z") },
+ function(t, e) {
+ t.ok( /mtime/.test(e.message), 'has “mtime”' );
+ t.ok( /1969/.test(e.message), 'has “1969”' );
+ t.ok( /1970/.test(e.message), 'has “1970”' );
+ },
+ ],
+];
+
+["size", "mode", "mtime", "files_remaining", "bytes_remaining"].forEach( (k) => {
+ var input = { name: "the name" };
+ input[k] = "123123";
+
+ var key_regexp = new RegExp(k);
+ var value_regexp = new RegExp(input[k]);
+
+ failures.push( [
+ `string “${k}”`,
+ input,
+ function(t, e) {
+ t.ok( key_regexp.test(e.message), `has “${k}”` );
+ t.ok( value_regexp.test(e.message), 'has value' );
+ t.ok( /number/.test(e.message), 'has “number”' );
+ },
+ ] );
+
+ input = Object.assign( {}, input );
+ input[k] = -input[k];
+
+ var negative_regexp = new RegExp(input[k]);
+
+ failures.push( [
+ `negative “${k}”`,
+ input,
+ function(t, e) {
+ t.ok( key_regexp.test(e.message), `has “${k}”` );
+ t.ok( negative_regexp.test(e.message), 'has value' );
+ },
+ ] );
+
+ input = Object.assign( {}, input );
+ input[k] = -input[k] - 0.1;
+
+ var fraction_regexp = new RegExp( ("" + input[k]).replace(/\./, "\\.") );
+
+ failures.push( [
+ `fraction “${k}”`,
+ input,
+ function(t, e) {
+ t.ok( key_regexp.test(e.message), `has “${k}”` );
+ t.ok( fraction_regexp.test(e.message), 'has value' );
+ },
+ ] );
+} );
+
+
+var transformations = [
+ [
+ 'name only',
+ { name: "My name", },
+ {
+ name: "My name",
+ size: null,
+ mtime: null,
+ mode: null,
+ serial: null,
+ files_remaining: null,
+ bytes_remaining: null,
+ },
+ ],
+ [
+ 'name is all numerals',
+ { name: "0", },
+ {
+ name: "0",
+ size: null,
+ mtime: null,
+ mode: null,
+ serial: null,
+ files_remaining: null,
+ bytes_remaining: null,
+ },
+ ],
+ [
+ 'name only (undefined rather than null)',
+ {
+ name: "My name",
+ size: undefined,
+ mtime: undefined,
+ mode: undefined,
+ serial: undefined,
+ files_remaining: undefined,
+ bytes_remaining: undefined,
+ },
+ {
+ name: "My name",
+ size: null,
+ mtime: null,
+ mode: null,
+ serial: null,
+ files_remaining: null,
+ bytes_remaining: null,
+ },
+ ],
+ [
+ 'name and all numbers',
+ {
+ name: "My name",
+ size: 0,
+ mtime: 0,
+ mode: parseInt("0644", 8),
+ serial: null,
+ files_remaining: 1,
+ bytes_remaining: 0,
+ },
+ {
+ name: "My name",
+ size: 0,
+ mtime: 0,
+ mode: parseInt("100644", 8),
+ serial: null,
+ files_remaining: 1,
+ bytes_remaining: 0,
+ },
+ ],
+ [
+ 'name, zero size',
+ { name: "My name", mtime: now },
+ {
+ name: "My name",
+ size: null,
+ mtime: now_epoch,
+ mode: null,
+ serial: null,
+ files_remaining: null,
+ bytes_remaining: null,
+ },
+ ],
+ [
+ 'name, mtime as Date',
+ { name: "My name", size: 0 },
+ {
+ name: "My name",
+ size: 0,
+ mtime: null,
+ mode: null,
+ serial: null,
+ files_remaining: null,
+ bytes_remaining: null,
+ },
+ ],
+];
+
+tape('offer_parameters - failures', function(t) {
+
+ for (const [label, input, todo] of failures) {
+ let err;
+ try {
+ Zmodem.Validation.offer_parameters(input);
+ }
+ catch(e) { err = e }
+
+ t.ok( err instanceof Zmodem.Error, `throws ok: ${label}` );
+
+ todo(t, err);
+ }
+
+ t.end();
+});
+
+tape('offer_parameters - happy path', function(t) {
+
+ for (const [label, input, output] of transformations) {
+ t.deepEquals(
+ Zmodem.Validation.offer_parameters(input),
+ output,
+ label,
+ );
+ }
+
+ t.end();
+});