import { expect } from 'vitest'; import type { ExampleValues } from '#shared/language/examples.ts'; import { expandVariantsForSection } from '#shared/language/grammarTables.ts'; import type { CellPart, GrammarTableDefinition, GrammarTablesDefinition, VariantsFromBaseConverter, } from '#shared/language/grammarTables.ts'; import { MorphemeValues } from '#shared/language/morphemes.ts'; const getGrammarTableDefinitions = (grammarTablesDefinition: GrammarTablesDefinition): GrammarTableDefinition[] => { let grammarTableDefinitions: (GrammarTableDefinition | string)[]; if (Array.isArray(grammarTablesDefinition)) { grammarTableDefinitions = grammarTablesDefinition; } else { grammarTableDefinitions = [...grammarTablesDefinition.simple, ...grammarTablesDefinition.comprehensive]; } return grammarTableDefinitions.filter((grammarTableDefinition) => typeof grammarTableDefinition !== 'string'); }; const getCellParts = ( grammarTablesDefinition: GrammarTablesDefinition, variantsFromBaseConverter: VariantsFromBaseConverter, exampleValues: ExampleValues, ): CellPart[] => { return getGrammarTableDefinitions(grammarTablesDefinition) .flatMap((grammarTableDefinition) => grammarTableDefinition.sections) .flatMap((sectionDefinition) => { return expandVariantsForSection(sectionDefinition.variants, variantsFromBaseConverter, exampleValues); }) .flatMap((variant) => variant.cells) .flatMap((cell) => cell); }; export const checkContainsValidMorphemes = ( grammarTablesDefinition: GrammarTablesDefinition, variantsFromBaseConverter: VariantsFromBaseConverter, morphemes: string[], ) => { for (const plural of [false, true]) { const exampleValues = { morphemeValues: new MorphemeValues({}), plural }; const cellParts = getCellParts(grammarTablesDefinition, variantsFromBaseConverter, exampleValues); for (const cellPart of cellParts) { expect(morphemes).toContain(cellPart.morpheme); expect(morphemes).toEqual(expect.arrayContaining([...cellPart.highlightsMorphemes ?? []])); } } };