-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.mjs
More file actions
145 lines (130 loc) · 4.32 KB
/
test.mjs
File metadata and controls
145 lines (130 loc) · 4.32 KB
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
const data_file = null; // set to null to use main file from package.json
import { readFileSync } from 'node:fs';
import t from 'tap';
import { parse, valid } from 'node-html-parser';
async function get_data(file = null) {
if (file === null) {
file = JSON.parse(readFileSync('./package.json')).main;
}
return (await import(file)).default;
}
const cdr = await get_data(data_file);
// structure / completeness
t.test('structure/completeness', t => {
t.ok('categories' in cdr);
let categories = Object.values(cdr.categories);
t.ok(categories.length === 3);
for (let cat of categories) {
t.ok('title' in cat);
t.ok('rules' in cat);
for (let rule of Object.values(cat.rules)) {
t.ok('title' in rule);
t.ok('text' in rule);
t.ok('questions' in rule);
t.ok('score_zero_text' in rule);
t.ok('skipped_text' in rule);
t.ok('score_improvement_text' in rule);
t.ok('1' in rule.questions);
t.ok('2' in rule.questions);
t.ok('3' in rule.questions);
for (let q of Object.values(rule.questions)) {
t.ok('text' in q);
}
}
}
t.end();
});
t.test('glossary completeness', t => {
t.ok('glossary' in cdr);
let terms = Object.values(cdr.glossary);
for (let term of terms) {
t.ok("title" in term);
t.ok("text" in term);
}
t.end();
});
// rule text spans
t.test('rule text spans', t => {
for (let cat of Object.values(cdr.categories)) {
for (let rule of Object.values(cat.rules)) {
// console.log(rule);
t.ok(valid(rule.text));
if ('score_zero_text' in rule) {
t.ok(valid(rule.score_zero_text));
}
if ('skipped_text' in rule) {
t.ok(valid(rule.skipped_text));
}
if ('score_improvement_text' in rule) {
t.ok(valid(rule.score_improvement_text));
}
}
}
t.end();
});
// questions text spans
t.test('question text spans', t => {
for (let cat of Object.values(cdr.categories)) {
for (let rule of Object.values(cat.rules)) {
for (let q of Object.values(rule.questions)) {
console.log(q);
t.ok(valid(q.text));
if ('text_scoring' in q) {
t.ok(valid(q.text_scoring));
}
}
}
}
t.end();
});
//
t.test('rules have title class in texts', t => {
for (let cat of Object.values(cdr.categories)) {
for (let rule of Object.values(cat.rules)) {
const rtext = parse(rule.text);
const spans = rtext.querySelectorAll('span[class]');
// console.log(rule);
t.ok(spans.length === 1);
}
}
t.end();
});
// terms in glossary
t.test('rule text terms in glossary', t => {
for (let cat of Object.values(cdr.categories)) {
for (let rule of Object.values(cat.rules)) {
const rtext = parse(rule.text);
const spans = rtext.querySelectorAll('span[data-term]');
for (let span of spans) {
let term = span.getAttribute('data-term');
// console.log(term);
t.ok(term in cdr.glossary);
}
}
}
t.end();
});
// terms in glossary
t.test('question text terms in glossary', t => {
for (let cat of Object.values(cdr.categories)) {
for (let rule of Object.values(cat.rules)) {
for (let q of Object.values(rule.questions)) {
const text = parse(q.text);
const spans = text.querySelectorAll('span[data-term]');
for (let span of spans) {
let term = span.getAttribute('data-term');
t.ok(term in cdr.glossary);
}
if ('text_scoring' in q) {
const text = parse(q.text_scoring);
const spans = text.querySelectorAll('span[data-term]');
for (let span of spans) {
let term = span.getAttribute('data-term');
t.ok(term in cdr.glossary);
}
}
}
}
}
t.end();
});