-
Notifications
You must be signed in to change notification settings - Fork 142
/
Copy pathbiblio.js
99 lines (87 loc) · 2.88 KB
/
biblio.js
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
var assert = require('assert');
var bibref = require('../lib/bibref');
var json = bibref.expandRefs(bibref.raw);
var tv4 = require("tv4");
var pointer = require("json-pointer");
var formats = require('tv4-formats');
function wrap(id) {
return '[[' + id + ']]';
}
function displayErr(err, obj, output) {
output.push("* " + err.message.trim());
JSON.stringify(pointer.get(obj, err.dataPath), null, 4).split("\n").forEach(function(line) {
output.push(" " + line);
});
}
function schemaMsg(err, obj) {
if (!err) return "";
var output = [""];
displayErr(err, obj, output);
if (err.subErrors) {
err.subErrors.forEach(function(s) {
displayErr(s, obj, output);
});
}
return output.join("\n");
}
function testAliasOfPointsToRealObj(obj, key) {
if ('aliasOf' in obj) {
var alias = obj.aliasOf;
test('alias ' + wrap(alias) + ' of ' + wrap(key) + ' exists', function() {
assert.ok(bibref.get(alias)[alias]);
});
}
}
function testObsoletedByPointsToUptoDateReferences(obj, key) {
if ('obsoletedBy' in obj) {
var current = obj.obsoletedBy;
current.forEach(function(id) {
test('new version ' + wrap(id) + ' of ' + wrap(key) + ' exists', function() {
var ref = bibref.get(id)[id];
assert.ok(typeof ref == "object");
});
});
}
}
function testForDuplicates(obj, key, dups) {
test(wrap(key) + ' has no duplicate', function() {
var id = key.toUpperCase(),
exists = id in dups;
if (exists) {
dups[id].push(key);
} else {
dups[id] = [ key ];
}
assert.ok(!exists, dups[id].join(', '));
});
}
suite('Validate References', function() {
test("Validate References with JSON schema.", function() {
var validator = tv4.freshApi();
validator.addFormat(formats);
var result = validator.validateResult(json, require("../schemas/raw-reference.json"));
assert(result.valid, schemaMsg(result.error, json));
});
});
suite('Verify aliases and obsoletedBy resolve', function() {
var dups = {};
Object.keys(json).forEach(function(key) {
var obj = json[key];
testForDuplicates(obj, key, dups);
if (typeof obj == 'object') {
testAliasOfPointsToRealObj(obj, key);
testObsoletedByPointsToUptoDateReferences(obj, key);
if ('versions' in obj) {
var versions = obj.versions;
Object.keys(versions).forEach(function(k) {
testAliasOfPointsToRealObj(versions[k], k);
testObsoletedByPointsToUptoDateReferences(versions[k], k);
});
}
} else {
test('is a string', function() {
assert.ok(typeof obj == "string");
});
}
});
});