-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcanon_test.ts
111 lines (102 loc) · 3.44 KB
/
canon_test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import { canonicalize } from "./canon.ts";
import { fromHex } from "./hex.ts";
import {
assertEquals,
AssertionError,
} from "https://deno.land/std@0.120.0/testing/asserts.ts";
Deno.test("canonicalize(null)", () => {
assertEquals(canonicalize(null), "null");
});
Deno.test("canonicalize(boolean)", () => {
assertEquals(canonicalize(true), "true");
assertEquals(canonicalize(false), "false");
});
function doubleBE(hex: string): number {
const buffer = fromHex(hex);
const view = new DataView(buffer.buffer);
return view.getFloat64(0, false);
}
// https://tools.ietf.org/id/draft-rundgren-json-canonicalization-scheme-00.html#rfc.section.3.2.2.3 // editorconfig-checker-disable-line
Deno.test("canonicalize(number)", () => {
assertEquals(
canonicalize(doubleBE("4340000000000001")),
"9007199254740994",
);
assertEquals(
canonicalize(doubleBE("4340000000000002")),
"9007199254740996",
);
assertEquals(canonicalize(doubleBE("444b1ae4d6e2ef50")), "1e+21");
assertEquals(canonicalize(doubleBE("3eb0c6f7a0b5ed8d")), "0.000001");
assertEquals(
canonicalize(doubleBE("3eb0c6f7a0b5ed8c")),
"9.999999999999997e-7",
);
assertEquals(canonicalize(doubleBE("8000000000000000")), "0");
assertEquals(canonicalize(doubleBE("7fffffffffffffff")), "null");
assertEquals(canonicalize(doubleBE("7ff0000000000000")), "null");
assertEquals(canonicalize(doubleBE("fff0000000000000")), "null");
});
Deno.test("canonicalize(string)", () => {
assertEquals(canonicalize(""), `""`);
assertEquals(
canonicalize("predefined control chars: \b\t\n\f\r"),
`"predefined control chars: \\b\\t\\n\\f\\r"`,
);
assertEquals(
canonicalize("control chars: \u0000\u0001\u0002\u0003\u001e\u001f"),
`"control chars: \\u0000\\u0001\\u0002\\u0003\\u001e\\u001f"`,
);
assertEquals(
canonicalize(`quotes and backslashes: "\\`),
`"quotes and backslashes: \\"\\\\"`,
);
assertEquals(
canonicalize("other chars: ABC xyz 가나다 123 甲乙丙"),
`"other chars: ABC xyz 가나다 123 甲乙丙"`,
);
});
Deno.test("canonicalize(unknown[])", () => {
assertEquals(canonicalize([]), "[]");
assertEquals(canonicalize([1, 2, 3]), "[1,2,3]");
assertEquals(canonicalize([1, 2, 3, null]), "[1,2,3,null]");
assertEquals(canonicalize(["asdf", true, false]), `["asdf",true,false]`);
});
Deno.test("canonicalize(object)", () => {
assertEquals(canonicalize({}), "{}");
assertEquals(canonicalize({ a: 1, b: 2, c: 3 }), `{"a":1,"b":2,"c":3}`);
assertEquals(
canonicalize({
가나다: null,
"\r\n": true,
"": {},
'"\\': [{ a: 1, b: 2 }],
}),
`{"":{},"\\r\\n":true,"\\"\\\\":[{"a":1,"b":2}],"가나다":null}`,
);
});
Deno.test("canonicalize() [JCS compliance]", async () => {
const jcsTestData = "jcs_spec/testdata";
try {
for await (const f of Deno.readDir(`${jcsTestData}/input`)) {
if (!f.isFile) continue;
const input = await Deno.readTextFile(`${jcsTestData}/input/${f.name}`);
const inputTree = JSON.parse(input);
const output = canonicalize(inputTree);
const expected = await Deno.readTextFile(
`${jcsTestData}/output/${f.name}`,
);
if (output !== expected) {
console.error(f.name);
}
assertEquals(output, expected);
}
} catch (e) {
if (e instanceof Deno.errors.NotFound) {
throw new AssertionError(
"No JCS test suite found. Please check if submodules are initialized.",
);
}
throw e;
}
});