-
Notifications
You must be signed in to change notification settings - Fork 3
/
test.ts
113 lines (109 loc) · 3.04 KB
/
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
112
113
import * as path from "https://deno.land/std@0.95.0/path/mod.ts";
import {
assertEquals,
assertThrows,
} from "https://deno.land/std@0.95.0/testing/asserts.ts";
import { ImportMap, resolveImportMap, resolveModuleSpecifier } from "./mod.ts";
import { isImportMap } from "./_util.ts";
interface TestData {
importMap: ImportMap;
importMapBaseURL: string;
baseURL: string;
expectedResults?: Record<string, unknown>;
expectedParsedImportMap?: ImportMap;
tests?: Record<string, TestData>;
}
function runTests(
name: string,
{
importMap,
importMapBaseURL,
baseURL,
expectedResults,
expectedParsedImportMap,
}: TestData,
) {
Deno.test({
name,
fn: () => {
if (
!isImportMap(importMap)
) {
assertThrows(() => {
resolveImportMap(
importMap,
new URL(importMapBaseURL),
);
});
} else if (expectedParsedImportMap === null) {
assertThrows(() => {
resolveImportMap(
importMap,
new URL(importMapBaseURL),
);
});
} else {
const resolvedImportMap = resolveImportMap(
importMap,
new URL(importMapBaseURL),
);
if (expectedParsedImportMap) {
assertEquals(resolvedImportMap, expectedParsedImportMap);
}
if (expectedResults) {
for (
const [key, expectedResult] of Object.entries(expectedResults)
) {
if (expectedResult === null) {
assertThrows(() => {
resolveModuleSpecifier(
key,
resolvedImportMap,
new URL(baseURL),
);
});
} else {
const resolvedModuleSpecifier = resolveModuleSpecifier(
key,
resolvedImportMap,
new URL(baseURL),
);
assertEquals(resolvedModuleSpecifier, expectedResult);
}
}
}
}
},
});
}
function createTests(name: string, data: TestData) {
const {
tests,
importMap,
importMapBaseURL,
baseURL,
} = data;
if (tests) {
for (const [testName, test] of Object.entries(tests)) {
const combinedName = `${name} → ${testName}`;
const inheritedTestData = {
importMap: test.importMap || importMap,
importMapBaseURL: test.importMapBaseURL || importMapBaseURL,
baseURL: test.baseURL || baseURL,
expectedParsedImportMap: test.expectedParsedImportMap,
expectedResults: test.expectedResults,
tests: test.tests,
};
createTests(combinedName, inheritedTestData);
}
} else {
runTests(name, data);
}
}
// testdata from https://github.com/web-platform-tests/wpt/tree/master/import-maps/data-driven/resources
const testdataDir = "testdata";
for await (const { name: fileName } of Deno.readDir(testdataDir)) {
const file = await Deno.readTextFile(path.join(testdataDir, fileName));
const data = JSON.parse(file);
createTests(fileName, data);
}