diff options
author | Darius Jahandarie <djahandarie@gmail.com> | 2023-11-08 03:11:35 +0900 |
---|---|---|
committer | Darius Jahandarie <djahandarie@gmail.com> | 2023-11-08 03:23:17 +0900 |
commit | 0f4d36938fd0d844f548aa5a7f7e7842df8dfb41 (patch) | |
tree | 5b6be3620a557d0b9177047003f6d742d9d2a32d /test/test-dom-text-scanner.js | |
parent | ef79eab44bfd000792c610b968b5ceefd41e76a0 (diff) |
Switch to vitest for ESM support; other fixes
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); } |