diff options
Diffstat (limited to 'test/language-transformer-cycles.test.js')
-rw-r--r-- | test/language-transformer-cycles.test.js | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/test/language-transformer-cycles.test.js b/test/language-transformer-cycles.test.js index 751f65a6..ab14eaa4 100644 --- a/test/language-transformer-cycles.test.js +++ b/test/language-transformer-cycles.test.js @@ -15,13 +15,9 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ -import {readFileSync} from 'fs'; -import {join, dirname as pathDirname} from 'path'; -import {fileURLToPath} from 'url'; import {describe, test} from 'vitest'; -import {parseJson} from '../dev/json.js'; import {LanguageTransformer} from '../ext/js/language/language-transformer.js'; -import {getLanguageSummaries} from '../ext/js/language/languages.js'; +import {getAllLanguageTransformDescriptors} from '../ext/js/language/languages.js'; class DeinflectionNode { /** @@ -80,12 +76,12 @@ class DeinflectionNode { class RuleNode { /** * @param {string} groupName - * @param {import('language-transformer').Rule} rule + * @param {import('language-transformer').SuffixRule} rule */ constructor(groupName, rule) { /** @type {string} */ this.groupName = groupName; - /** @type {import('language-transformer').Rule} */ + /** @type {import('language-transformer').SuffixRule} */ this.rule = rule; } } @@ -104,39 +100,36 @@ function arraysAreEqual(rules1, rules2) { return true; } -const dirname = pathDirname(fileURLToPath(import.meta.url)); -const descriptors = []; -const languageSummaries = getLanguageSummaries(); -for (const {languageTransformsFile} of languageSummaries) { - if (!languageTransformsFile) { continue; } - /** @type {import('language-transformer').LanguageTransformDescriptor} */ - const descriptor = parseJson(readFileSync(join(dirname, `../ext/${languageTransformsFile}`), {encoding: 'utf8'})); - descriptors.push(descriptor); -} +const languagesWithTransforms = getAllLanguageTransformDescriptors(); -describe.each(descriptors)('Cycles Test $language', (descriptor) => { +describe.each(languagesWithTransforms)('Cycles Test $iso', ({languageTransforms}) => { test('Check for cycles', ({expect}) => { const languageTransformer = new LanguageTransformer(); - languageTransformer.addDescriptor(descriptor); + languageTransformer.addDescriptor(languageTransforms); /** @type {RuleNode[]} */ const ruleNodes = []; - for (const [groupName, reasonInfo] of Object.entries(descriptor.transforms)) { + for (const [groupName, reasonInfo] of Object.entries(languageTransforms.transforms)) { for (const rule of reasonInfo.rules) { - ruleNodes.push(new RuleNode(groupName, rule)); + if (rule.type === 'suffix') { + ruleNodes.push(new RuleNode(groupName, /** @type {import('language-transformer').SuffixRule}*/ (rule))); + } } } /** @type {DeinflectionNode[]} */ const deinflectionNodes = []; - for (const ruleNode of ruleNodes) { - deinflectionNodes.push(new DeinflectionNode(`?${ruleNode.rule.suffixIn}`, [], null, null)); + for (const {rule: {isInflected}} of ruleNodes) { + const suffixIn = isInflected.source.substring(0, isInflected.source.length - 1); + deinflectionNodes.push(new DeinflectionNode(`?${suffixIn}`, [], null, null)); } + for (let i = 0; i < deinflectionNodes.length; ++i) { const deinflectionNode = deinflectionNodes[i]; const {text, ruleNames} = deinflectionNode; for (const ruleNode of ruleNodes) { - const {suffixIn, suffixOut, conditionsIn, conditionsOut} = ruleNode.rule; + const {isInflected, deinflected: suffixOut, conditionsIn, conditionsOut} = ruleNode.rule; + const suffixIn = isInflected.source.substring(0, isInflected.source.length - 1); if ( !LanguageTransformer.conditionsMatch( languageTransformer.getConditionFlagsFromConditionTypes(ruleNames), @@ -158,12 +151,14 @@ describe.each(descriptors)('Cycles Test $language', (descriptor) => { // Cycle check if (deinflectionNode.historyIncludes(newDeinflectionNode)) { const stack = []; - for (const item of newDeinflectionNode.getHistory()) { - stack.push( - item.ruleNode === null ? - `${item.text} (start)` : - `${item.text} (${item.ruleNode.groupName}, ${item.ruleNode.rule.conditionsIn.join(',')}=>${item.ruleNode.rule.conditionsOut.join(',')}, ${item.ruleNode.rule.suffixIn}=>${item.ruleNode.rule.suffixOut})` - ); + for (const {text: itemText, ruleNode: itemNode} of newDeinflectionNode.getHistory()) { + if (itemNode !== null) { + const itemSuffixIn = itemNode.rule.isInflected.source.substring(0, itemNode.rule.isInflected.source.length - 1); + const itemSuffixOut = itemNode.rule.deinflected; + stack.push(`${itemText} (${itemNode.groupName}, ${itemNode.rule.conditionsIn.join(',')}=>${itemNode.rule.conditionsOut.join(',')}, ${itemSuffixIn}=>${itemSuffixOut})`); + } else { + stack.push(`${itemText} (start)`); + } } const message = `Cycle detected:\n ${stack.join('\n ')}`; expect.soft(true, message).toEqual(false); |