Alex Yatskov
4e5029f7ec
Yomichan is an ongoing community project. It really does take a village, and everyone who contributes code owns a part of it :)
253 lines
5.9 KiB
JavaScript
253 lines
5.9 KiB
JavaScript
/*
|
|
* Copyright (C) 2020 Yomichan Authors
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
const assert = require('assert');
|
|
const {VM} = require('./yomichan-vm');
|
|
|
|
const vm = new VM();
|
|
vm.execute('bg/js/json-schema.js');
|
|
const JsonSchema = vm.get('JsonSchema');
|
|
|
|
|
|
function testValidate1() {
|
|
const schema = {
|
|
allOf: [
|
|
{
|
|
type: 'number'
|
|
},
|
|
{
|
|
anyOf: [
|
|
{minimum: 10, maximum: 100},
|
|
{minimum: -100, maximum: -10}
|
|
]
|
|
},
|
|
{
|
|
oneOf: [
|
|
{multipleOf: 3},
|
|
{multipleOf: 5}
|
|
]
|
|
},
|
|
{
|
|
not: [
|
|
{multipleOf: 20}
|
|
]
|
|
}
|
|
]
|
|
};
|
|
|
|
const schemaValidate = (value) => {
|
|
try {
|
|
JsonSchema.validate(value, schema);
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
const jsValidate = (value) => {
|
|
return (
|
|
typeof value === 'number' &&
|
|
(
|
|
(value >= 10 && value <= 100) ||
|
|
(value >= -100 && value <= -10)
|
|
) &&
|
|
(
|
|
(
|
|
(value % 3) === 0 ||
|
|
(value % 5) === 0
|
|
) &&
|
|
(value % 15) !== 0
|
|
) &&
|
|
(value % 20) !== 0
|
|
);
|
|
};
|
|
|
|
for (let i = -111; i <= 111; i++) {
|
|
const actual = schemaValidate(i, schema);
|
|
const expected = jsValidate(i);
|
|
assert.strictEqual(actual, expected);
|
|
}
|
|
}
|
|
|
|
|
|
function testGetValidValueOrDefault1() {
|
|
// Test value defaulting on objects with additionalProperties=false
|
|
const schema = {
|
|
type: 'object',
|
|
required: ['test'],
|
|
properties: {
|
|
test: {
|
|
type: 'string',
|
|
default: 'default'
|
|
}
|
|
},
|
|
additionalProperties: false
|
|
};
|
|
|
|
const testData = [
|
|
[
|
|
void 0,
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
null,
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
0,
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
'',
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
[],
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
{},
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
{test: 'value'},
|
|
{test: 'value'}
|
|
],
|
|
[
|
|
{test2: 'value2'},
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
{test: 'value', test2: 'value2'},
|
|
{test: 'value'}
|
|
]
|
|
];
|
|
|
|
for (const [value, expected] of testData) {
|
|
const actual = JsonSchema.getValidValueOrDefault(schema, value);
|
|
vm.assert.deepStrictEqual(actual, expected);
|
|
}
|
|
}
|
|
|
|
function testGetValidValueOrDefault2() {
|
|
// Test value defaulting on objects with additionalProperties=true
|
|
const schema = {
|
|
type: 'object',
|
|
required: ['test'],
|
|
properties: {
|
|
test: {
|
|
type: 'string',
|
|
default: 'default'
|
|
}
|
|
},
|
|
additionalProperties: true
|
|
};
|
|
|
|
const testData = [
|
|
[
|
|
{},
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
{test: 'value'},
|
|
{test: 'value'}
|
|
],
|
|
[
|
|
{test2: 'value2'},
|
|
{test: 'default', test2: 'value2'}
|
|
],
|
|
[
|
|
{test: 'value', test2: 'value2'},
|
|
{test: 'value', test2: 'value2'}
|
|
]
|
|
];
|
|
|
|
for (const [value, expected] of testData) {
|
|
const actual = JsonSchema.getValidValueOrDefault(schema, value);
|
|
vm.assert.deepStrictEqual(actual, expected);
|
|
}
|
|
}
|
|
|
|
function testGetValidValueOrDefault3() {
|
|
// Test value defaulting on objects with additionalProperties={schema}
|
|
const schema = {
|
|
type: 'object',
|
|
required: ['test'],
|
|
properties: {
|
|
test: {
|
|
type: 'string',
|
|
default: 'default'
|
|
}
|
|
},
|
|
additionalProperties: {
|
|
type: 'number',
|
|
default: 10
|
|
}
|
|
};
|
|
|
|
const testData = [
|
|
[
|
|
{},
|
|
{test: 'default'}
|
|
],
|
|
[
|
|
{test: 'value'},
|
|
{test: 'value'}
|
|
],
|
|
[
|
|
{test2: 'value2'},
|
|
{test: 'default', test2: 10}
|
|
],
|
|
[
|
|
{test: 'value', test2: 'value2'},
|
|
{test: 'value', test2: 10}
|
|
],
|
|
[
|
|
{test2: 2},
|
|
{test: 'default', test2: 2}
|
|
],
|
|
[
|
|
{test: 'value', test2: 2},
|
|
{test: 'value', test2: 2}
|
|
],
|
|
[
|
|
{test: 'value', test2: 2, test3: null},
|
|
{test: 'value', test2: 2, test3: 10}
|
|
],
|
|
[
|
|
{test: 'value', test2: 2, test3: void 0},
|
|
{test: 'value', test2: 2, test3: 10}
|
|
]
|
|
];
|
|
|
|
for (const [value, expected] of testData) {
|
|
const actual = JsonSchema.getValidValueOrDefault(schema, value);
|
|
vm.assert.deepStrictEqual(actual, expected);
|
|
}
|
|
}
|
|
|
|
|
|
function main() {
|
|
testValidate1();
|
|
testGetValidValueOrDefault1();
|
|
testGetValidValueOrDefault2();
|
|
testGetValidValueOrDefault3();
|
|
}
|
|
|
|
|
|
if (require.main === module) { main(); }
|