diff options
Diffstat (limited to 'test/test-dom-text-scanner.js')
| -rw-r--r-- | test/test-dom-text-scanner.js | 188 | 
1 files changed, 0 insertions, 188 deletions
| diff --git a/test/test-dom-text-scanner.js b/test/test-dom-text-scanner.js deleted file mode 100644 index 37017b01..00000000 --- a/test/test-dom-text-scanner.js +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2023  Yomitan Authors - * Copyright (C) 2020-2022  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 fs = require('fs'); -const path = require('path'); -const assert = require('assert'); -const {JSDOM} = require('jsdom'); -const {testMain} = require('../dev/util'); -const {VM} = require('../dev/vm'); - - -function createJSDOM(fileName) { -    const domSource = fs.readFileSync(fileName, {encoding: 'utf8'}); -    return new JSDOM(domSource); -} - -function querySelectorTextNode(element, selector) { -    let textIndex = -1; -    const match = /::text$|::nth-text\((\d+)\)$/.exec(selector); -    if (match !== null) { -        textIndex = (match[1] ? parseInt(match[1], 10) - 1 : 0); -        selector = selector.substring(0, selector.length - match[0].length); -    } -    const result = element.querySelector(selector); -    if (textIndex < 0) { -        return result; -    } -    for (let n = result.firstChild; n !== null; n = n.nextSibling) { -        if (n.nodeType === n.constructor.TEXT_NODE) { -            if (textIndex === 0) { -                return n; -            } -            --textIndex; -        } -    } -    return null; -} - - -function getComputedFontSizeInPixels(window, getComputedStyle, element) { -    for (; element !== null; element = element.parentNode) { -        if (element.nodeType === window.Node.ELEMENT_NODE) { -            const fontSize = getComputedStyle(element).fontSize; -            if (fontSize.endsWith('px')) { -                const value = parseFloat(fontSize.substring(0, fontSize.length - 2)); -                return value; -            } -        } -    } -    const defaultFontSize = 14; -    return defaultFontSize; -} - -function createAbsoluteGetComputedStyle(window) { -    // Wrapper to convert em units to px units -    const getComputedStyleOld = window.getComputedStyle.bind(window); -    return (element, ...args) => { -        const style = getComputedStyleOld(element, ...args); -        return new Proxy(style, { -            get: (target, property) => { -                let result = target[property]; -                if (typeof result === 'string') { -                    result = result.replace(/([-+]?\d(?:\.\d)?(?:[eE][-+]?\d+)?)em/g, (g0, g1) => { -                        const fontSize = getComputedFontSizeInPixels(window, getComputedStyleOld, element); -                        return `${parseFloat(g1) * fontSize}px`; -                    }); -                } -                return result; -            } -        }); -    }; -} - - -async function testDomTextScanner(dom, {DOMTextScanner}) { -    const document = dom.window.document; -    for (const testElement of document.querySelectorAll('y-test')) { -        let testData = JSON.parse(testElement.dataset.testData); -        if (!Array.isArray(testData)) { -            testData = [testData]; -        } -        for (const testDataItem of testData) { -            let { -                node, -                offset, -                length, -                forcePreserveWhitespace, -                generateLayoutContent, -                reversible, -                expected: { -                    node: expectedNode, -                    offset: expectedOffset, -                    content: expectedContent, -                    remainder: expectedRemainder -                } -            } = testDataItem; - -            node = querySelectorTextNode(testElement, node); -            expectedNode = querySelectorTextNode(testElement, expectedNode); - -            // Standard test -            { -                const scanner = new DOMTextScanner(node, offset, forcePreserveWhitespace, generateLayoutContent); -                scanner.seek(length); - -                const {node: actualNode1, offset: actualOffset1, content: actualContent1, remainder: actualRemainder1} = scanner; -                assert.strictEqual(actualContent1, expectedContent); -                assert.strictEqual(actualOffset1, expectedOffset); -                assert.strictEqual(actualNode1, expectedNode); -                assert.strictEqual(actualRemainder1, expectedRemainder || 0); -            } - -            // Substring tests -            for (let i = 1; i <= length; ++i) { -                const scanner = new DOMTextScanner(node, offset, forcePreserveWhitespace, generateLayoutContent); -                scanner.seek(length - i); - -                const {content: actualContent} = scanner; -                assert.strictEqual(actualContent, expectedContent.substring(0, expectedContent.length - i)); -            } - -            if (reversible === false) { continue; } - -            // Reversed test -            { -                const scanner = new DOMTextScanner(expectedNode, expectedOffset, forcePreserveWhitespace, generateLayoutContent); -                scanner.seek(-length); - -                const {content: actualContent} = scanner; -                assert.strictEqual(actualContent, expectedContent); -            } - -            // Reversed substring tests -            for (let i = 1; i <= length; ++i) { -                const scanner = new DOMTextScanner(expectedNode, expectedOffset, forcePreserveWhitespace, generateLayoutContent); -                scanner.seek(-(length - i)); - -                const {content: actualContent} = scanner; -                assert.strictEqual(actualContent, expectedContent.substring(i)); -            } -        } -    } -} - - -async function testDocument1() { -    const dom = createJSDOM(path.join(__dirname, 'data', 'html', 'test-dom-text-scanner.html')); -    const window = dom.window; -    try { -        const {document, Node, Range} = window; - -        window.getComputedStyle = createAbsoluteGetComputedStyle(window); - -        const vm = new VM({document, window, Range, Node}); -        vm.execute([ -            'js/data/sandbox/string-util.js', -            'js/dom/dom-text-scanner.js' -        ]); -        const DOMTextScanner = vm.get('DOMTextScanner'); - -        await testDomTextScanner(dom, {DOMTextScanner}); -    } finally { -        window.close(); -    } -} - - -async function main() { -    await testDocument1(); -} - - -if (require.main === module) { testMain(main); } |