diff options
| -rw-r--r-- | .github/workflows/ci.yml | 8 | ||||
| -rw-r--r-- | package.json | 5 | ||||
| -rw-r--r-- | test/test-schema.js | 236 | 
3 files changed, 245 insertions, 4 deletions
| diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 40bc005d..c65d254b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,11 @@ jobs:        run: npm ci      - name: Build        run: npm run build --if-present -    - name: Run tests -      run: npm test +    - name: Lint +      run: npm run test-lint +      env: +        CI: true +    - name: Tests +      run: npm run test-code        env:          CI: true diff --git a/package.json b/package.json index 8e71de59..b486c25d 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@          "test": "test"      },      "scripts": { -        "test": "npm run test-lint", -        "test-lint": "eslint ." +        "test": "npm run test-lint && npm run test-code", +        "test-lint": "eslint .", +        "test-code": "node ./test/test-schema.js"      },      "repository": {          "type": "git", diff --git a/test/test-schema.js b/test/test-schema.js new file mode 100644 index 00000000..2f294e43 --- /dev/null +++ b/test/test-schema.js @@ -0,0 +1,236 @@ +const fs = require('fs'); +const path = require('path'); +const assert = require('assert'); + +const jsonSchemaFileName = path.join(__dirname, '../ext/bg/js/json-schema.js'); +const jsonSchemaFileSource = fs.readFileSync(jsonSchemaFileName, {encoding: 'utf8'}); +const JsonSchema = Function(`'use strict';${jsonSchemaFileSource};return 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, schema) => { +        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); +        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); +        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); +        assert.deepStrictEqual(actual, expected); +    } +} + + +function main() { +    testValidate1(); +    testGetValidValueOrDefault1(); +    testGetValidValueOrDefault2(); +    testGetValidValueOrDefault3(); +} + + +main(); |