diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/test-core.js | 169 | 
1 files changed, 169 insertions, 0 deletions
| diff --git a/test/test-core.js b/test/test-core.js new file mode 100644 index 00000000..d4a880d1 --- /dev/null +++ b/test/test-core.js @@ -0,0 +1,169 @@ +/* + * 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 crypto = require('crypto'); +const {VM} = require('./yomichan-vm'); + +const vm = new VM({ +    crypto: { +        getRandomValues: (array) => { +            const buffer = crypto.randomBytes(array.byteLength); +            buffer.copy(array); +            return array; +        } +    } +}); +vm.execute([ +    'mixed/js/core.js' +]); +const [DynamicProperty] = vm.get(['DynamicProperty']); + + +function testDynamicProperty() { +    const data = [ +        { +            initialValue: 0, +            operations: [ +                { +                    operation: null, +                    expectedDefaultValue: 0, +                    expectedValue: 0, +                    expectedOverrideCount: 0, +                    expeectedEventOccurred: false +                }, +                { +                    operation: 'set.defaultValue', +                    args: [1], +                    expectedDefaultValue: 1, +                    expectedValue: 1, +                    expectedOverrideCount: 0, +                    expeectedEventOccurred: true +                }, +                { +                    operation: 'set.defaultValue', +                    args: [1], +                    expectedDefaultValue: 1, +                    expectedValue: 1, +                    expectedOverrideCount: 0, +                    expeectedEventOccurred: false +                }, +                { +                    operation: 'set.defaultValue', +                    args: [0], +                    expectedDefaultValue: 0, +                    expectedValue: 0, +                    expectedOverrideCount: 0, +                    expeectedEventOccurred: true +                }, +                { +                    operation: 'setOverride', +                    args: [8], +                    expectedDefaultValue: 0, +                    expectedValue: 8, +                    expectedOverrideCount: 1, +                    expeectedEventOccurred: true +                }, +                { +                    operation: 'setOverride', +                    args: [16], +                    expectedDefaultValue: 0, +                    expectedValue: 8, +                    expectedOverrideCount: 2, +                    expeectedEventOccurred: false +                }, +                { +                    operation: 'setOverride', +                    args: [32, 1], +                    expectedDefaultValue: 0, +                    expectedValue: 32, +                    expectedOverrideCount: 3, +                    expeectedEventOccurred: true +                }, +                { +                    operation: 'setOverride', +                    args: [64, -1], +                    expectedDefaultValue: 0, +                    expectedValue: 32, +                    expectedOverrideCount: 4, +                    expeectedEventOccurred: false +                }, +                { +                    operation: 'clearOverride', +                    args: [-4], +                    expectedDefaultValue: 0, +                    expectedValue: 32, +                    expectedOverrideCount: 3, +                    expeectedEventOccurred: false +                }, +                { +                    operation: 'clearOverride', +                    args: [-3], +                    expectedDefaultValue: 0, +                    expectedValue: 32, +                    expectedOverrideCount: 2, +                    expeectedEventOccurred: false +                }, +                { +                    operation: 'clearOverride', +                    args: [-2], +                    expectedDefaultValue: 0, +                    expectedValue: 64, +                    expectedOverrideCount: 1, +                    expeectedEventOccurred: true +                }, +                { +                    operation: 'clearOverride', +                    args: [-1], +                    expectedDefaultValue: 0, +                    expectedValue: 0, +                    expectedOverrideCount: 0, +                    expeectedEventOccurred: true +                } +            ] +        } +    ]; + +    for (const {initialValue, operations} of data) { +        const property = new DynamicProperty(initialValue); +        const overrideTokens = []; +        let eventOccurred = false; +        const onChange = () => { eventOccurred = true; }; +        property.on('change', onChange); +        for (const {operation, args, expectedDefaultValue, expectedValue, expectedOverrideCount, expeectedEventOccurred} of operations) { +            eventOccurred = false; +            switch (operation) { +                case 'set.defaultValue': property.defaultValue = args[0]; break; +                case 'setOverride': overrideTokens.push(property.setOverride(...args)); break; +                case 'clearOverride': property.clearOverride(overrideTokens[overrideTokens.length + args[0]]); break; +            } +            assert.strictEqual(eventOccurred, expeectedEventOccurred); +            assert.strictEqual(property.defaultValue, expectedDefaultValue); +            assert.strictEqual(property.value, expectedValue); +            assert.strictEqual(property.overrideCount, expectedOverrideCount); +        } +        property.off('change', onChange); +    } +} + + +function main() { +    testDynamicProperty(); +} + + +if (require.main === module) { main(); } |