From e9a1a7ff4b68711796f3fae25abf752940e170d9 Mon Sep 17 00:00:00 2001 From: Sabine Date: Mon, 18 May 2026 13:59:29 +0200 Subject: [PATCH 1/4] feat(developer): add/edit descriptions of tests in header of tests --- .../src/kmc-convert/test/data/Test.keylayout | 4 +- .../kmc-convert/test/data/Test_C0.keylayout | 2 +- .../test/data/Test_C0_C1_C2_C3.keylayout | 4 +- .../kmc-convert/test/data/Test_C1.keylayout | 2 +- .../kmc-convert/test/data/Test_C2.keylayout | 4 +- .../test/data/Test_C2_several.keylayout | 2 +- .../test/data/Test_ambiguous_keys.keylayout | 4 +- .../test/data/Test_characters.keylayout | 4 +- ...ifferentAmountOfKeysInBehaviours.keylayout | 4 +- .../data/Test_differentEncodings.keylayout | 4 +- .../test/data/Test_duplicate_keys.keylayout | 4 +- .../Test_duplicate_missing_keycode.keylayout | 2 +- .../Test_duplicate_missing_keys.keylayout | 59 ------------------- .../test/data/Test_maxKeyCode.keylayout | 4 +- .../test/data/Test_messages.keylayout | 2 +- .../Test_messages_controlCharacter.keylayout | 2 +- .../data/Test_messages_superior_C2.keylayout | 5 +- .../data/Test_messages_superior_C3.keylayout | 3 +- .../test/data/Test_modifier.keylayout | 4 +- .../test/data/Test_modifierNoCaps.keylayout | 4 +- ...eyMapThanKeyMapselectAndJisERROR.keylayout | 5 +- ..._moreKeyMapThanKeyMapselectERROR.keylayout | 5 +- ..._moreKeymapSelectThanKeymapERROR.keylayout | 4 +- .../test/data/Test_nr_elements.keylayout | 45 -------------- .../test/data/Test_onlyOneKeymap.keylayout | 2 +- .../test/data/Test_undefinedAction.keylayout | 4 +- .../data/Test_unsupportedCharacters.keylayout | 58 ------------------ 27 files changed, 44 insertions(+), 202 deletions(-) delete mode 100644 developer/src/kmc-convert/test/data/Test_duplicate_missing_keys.keylayout delete mode 100644 developer/src/kmc-convert/test/data/Test_nr_elements.keylayout delete mode 100644 developer/src/kmc-convert/test/data/Test_unsupportedCharacters.keylayout diff --git a/developer/src/kmc-convert/test/data/Test.keylayout b/developer/src/kmc-convert/test/data/Test.keylayout index 76fd91b4db..78312614c7 100644 --- a/developer/src/kmc-convert/test/data/Test.keylayout +++ b/developer/src/kmc-convert/test/data/Test.keylayout @@ -1,11 +1,11 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_C0.keylayout b/developer/src/kmc-convert/test/data/Test_C0.keylayout index d8c49ea62a..4ccd43f030 100644 --- a/developer/src/kmc-convert/test/data/Test_C0.keylayout +++ b/developer/src/kmc-convert/test/data/Test_C0.keylayout @@ -1,5 +1,5 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_C1.keylayout b/developer/src/kmc-convert/test/data/Test_C1.keylayout index e785e58ca1..a41175483e 100644 --- a/developer/src/kmc-convert/test/data/Test_C1.keylayout +++ b/developer/src/kmc-convert/test/data/Test_C1.keylayout @@ -1,5 +1,5 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_C2_several.keylayout b/developer/src/kmc-convert/test/data/Test_C2_several.keylayout index d51369c934..bd3319f17e 100644 --- a/developer/src/kmc-convert/test/data/Test_C2_several.keylayout +++ b/developer/src/kmc-convert/test/data/Test_C2_several.keylayout @@ -1,5 +1,5 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_characters.keylayout b/developer/src/kmc-convert/test/data/Test_characters.keylayout index 2aae8f1bb4..20fd9aa04f 100644 --- a/developer/src/kmc-convert/test/data/Test_characters.keylayout +++ b/developer/src/kmc-convert/test/data/Test_characters.keylayout @@ -1,11 +1,11 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_differentAmountOfKeysInBehaviours.keylayout b/developer/src/kmc-convert/test/data/Test_differentAmountOfKeysInBehaviours.keylayout index 4b770866cd..f00e804f7e 100644 --- a/developer/src/kmc-convert/test/data/Test_differentAmountOfKeysInBehaviours.keylayout +++ b/developer/src/kmc-convert/test/data/Test_differentAmountOfKeysInBehaviours.keylayout @@ -1,12 +1,12 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_differentEncodings.keylayout b/developer/src/kmc-convert/test/data/Test_differentEncodings.keylayout index c526f8c2af..1868fce990 100644 --- a/developer/src/kmc-convert/test/data/Test_differentEncodings.keylayout +++ b/developer/src/kmc-convert/test/data/Test_differentEncodings.keylayout @@ -1,12 +1,12 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_duplicate_keys.keylayout b/developer/src/kmc-convert/test/data/Test_duplicate_keys.keylayout index a5cb09069b..bc47ed3fad 100644 --- a/developer/src/kmc-convert/test/data/Test_duplicate_keys.keylayout +++ b/developer/src/kmc-convert/test/data/Test_duplicate_keys.keylayout @@ -1,12 +1,12 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_duplicate_missing_keycode.keylayout b/developer/src/kmc-convert/test/data/Test_duplicate_missing_keycode.keylayout index 39da3300f4..76d9b33e6a 100644 --- a/developer/src/kmc-convert/test/data/Test_duplicate_missing_keycode.keylayout +++ b/developer/src/kmc-convert/test/data/Test_duplicate_missing_keycode.keylayout @@ -1,5 +1,5 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/developer/src/kmc-convert/test/data/Test_maxKeyCode.keylayout b/developer/src/kmc-convert/test/data/Test_maxKeyCode.keylayout index a5f9e178b9..290d19b4cc 100644 --- a/developer/src/kmc-convert/test/data/Test_maxKeyCode.keylayout +++ b/developer/src/kmc-convert/test/data/Test_maxKeyCode.keylayout @@ -1,12 +1,12 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_messages.keylayout b/developer/src/kmc-convert/test/data/Test_messages.keylayout index 5d8d1b8682..656b292344 100644 --- a/developer/src/kmc-convert/test/data/Test_messages.keylayout +++ b/developer/src/kmc-convert/test/data/Test_messages.keylayout @@ -1,5 +1,5 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_messages_superior_C3.keylayout b/developer/src/kmc-convert/test/data/Test_messages_superior_C3.keylayout index f95afe40db..e9fe2efc04 100644 --- a/developer/src/kmc-convert/test/data/Test_messages_superior_C3.keylayout +++ b/developer/src/kmc-convert/test/data/Test_messages_superior_C3.keylayout @@ -6,7 +6,8 @@ Generated by S. Schmitt - tests C3 rules + tests if rules contain an unavailable superior rule (e.g. [ K_EQUAL] > dk(A2) ) + If that rule is not used, a dependant rule ( e.g. not dk(A2) + [K_A] > 'Â') would have no effect --> diff --git a/developer/src/kmc-convert/test/data/Test_modifier.keylayout b/developer/src/kmc-convert/test/data/Test_modifier.keylayout index 67ccf4db63..58fadb257c 100644 --- a/developer/src/kmc-convert/test/data/Test_modifier.keylayout +++ b/developer/src/kmc-convert/test/data/Test_modifier.keylayout @@ -1,11 +1,11 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_modifierNoCaps.keylayout b/developer/src/kmc-convert/test/data/Test_modifierNoCaps.keylayout index 9656413d7e..f659ac9d34 100644 --- a/developer/src/kmc-convert/test/data/Test_modifierNoCaps.keylayout +++ b/developer/src/kmc-convert/test/data/Test_modifierNoCaps.keylayout @@ -1,12 +1,12 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_moreKeyMapThanKeyMapselectERROR.keylayout b/developer/src/kmc-convert/test/data/Test_moreKeyMapThanKeyMapselectERROR.keylayout index 3bd9b5ba49..c0d3e286a9 100644 --- a/developer/src/kmc-convert/test/data/Test_moreKeyMapThanKeyMapselectERROR.keylayout +++ b/developer/src/kmc-convert/test/data/Test_moreKeyMapThanKeyMapselectERROR.keylayout @@ -1,11 +1,12 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_moreKeymapSelectThanKeymapERROR.keylayout b/developer/src/kmc-convert/test/data/Test_moreKeymapSelectThanKeymapERROR.keylayout index 25d178237c..d5edb25b91 100644 --- a/developer/src/kmc-convert/test/data/Test_moreKeymapSelectThanKeymapERROR.keylayout +++ b/developer/src/kmc-convert/test/data/Test_moreKeymapSelectThanKeymapERROR.keylayout @@ -1,11 +1,11 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_nr_elements.keylayout b/developer/src/kmc-convert/test/data/Test_nr_elements.keylayout deleted file mode 100644 index 7a32f4b3c2..0000000000 --- a/developer/src/kmc-convert/test/data/Test_nr_elements.keylayout +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/developer/src/kmc-convert/test/data/Test_onlyOneKeymap.keylayout b/developer/src/kmc-convert/test/data/Test_onlyOneKeymap.keylayout index 8f17399457..f3c9842356 100644 --- a/developer/src/kmc-convert/test/data/Test_onlyOneKeymap.keylayout +++ b/developer/src/kmc-convert/test/data/Test_onlyOneKeymap.keylayout @@ -1,5 +1,5 @@ - + diff --git a/developer/src/kmc-convert/test/data/Test_unsupportedCharacters.keylayout b/developer/src/kmc-convert/test/data/Test_unsupportedCharacters.keylayout deleted file mode 100644 index d393b332ee..0000000000 --- a/developer/src/kmc-convert/test/data/Test_unsupportedCharacters.keylayout +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 58331698cc950d47f31a4ff4329f965faedb71fd Mon Sep 17 00:00:00 2001 From: Sabine Date: Mon, 18 May 2026 14:09:07 +0200 Subject: [PATCH 2/4] feat(developer): kmc-convert comments on PR 12564 use unitTestEndpoints in tests; tests: move makePathToFixture to call of run function edit text in describe rename kmn-file-reader.tests -> keylayout-file-reader.tests message Control character: use U+xxxx without quotes --- .../keylayout-to-kmn-converter.ts | 4 +- .../src/keylayout-to-kmn/kmn-file-writer.ts | 118 ++++++++++++----- .../src/kmc-convert/test/data/keylayout.dtd | 89 ------------- ...ests.ts => keylayout-file-reader.tests.ts} | 10 +- .../test/keylayout-to-kmn-converter.tests.ts | 124 ++++++++---------- .../kmc-convert/test/kmn-file-writer.tests.ts | 16 +-- 6 files changed, 154 insertions(+), 207 deletions(-) delete mode 100644 developer/src/kmc-convert/test/data/keylayout.dtd rename developer/src/kmc-convert/test/{kmn-file-reader.tests.ts => keylayout-file-reader.tests.ts} (78%) diff --git a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts index 66c6507fb8..4c53223729 100644 --- a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts +++ b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts @@ -22,7 +22,7 @@ export interface ConverterResult extends KeymanCompilerResult { artifacts: ConverterArtifacts; }; -export interface ConverterToKmnResult extends ConverterResult { +interface ConverterToKmnResult extends ConverterResult { /* * Internal in-memory build artifacts from a successful compilation. Caller * can write these to disk with {@link Converter.write} @@ -1038,7 +1038,7 @@ export class KeylayoutToKmnConverter { } /** @internal */ - public convertBound = { + public unitTestEndpoints = { convert: this.convert.bind(this), }; } diff --git a/developer/src/kmc-convert/src/keylayout-to-kmn/kmn-file-writer.ts b/developer/src/kmc-convert/src/keylayout-to-kmn/kmn-file-writer.ts index 4471b546fb..087df39648 100644 --- a/developer/src/kmc-convert/src/keylayout-to-kmn/kmn-file-writer.ts +++ b/developer/src/kmc-convert/src/keylayout-to-kmn/kmn-file-writer.ts @@ -12,10 +12,14 @@ import { KeylayoutToKmnConverter, ProcessedData, Rule } from './keylayout-to-kmn import { ConverterMessages } from '../converter-messages.js'; import KEYMAN_VERSION from "@keymanapp/keyman-version"; -export interface messageCharacter { +interface MessageCharacter { message: string; character: string; }; +// Todo-kmc-convert edit interface +/*interface ReviewRulesResult { + warningMessage: string[]; +};*/ export class KmnFileWriter { @@ -152,7 +156,7 @@ export class KmnFileWriter { if ((outputCharacter !== undefined) || (outputCharacter !== "")) { const characterMessage = this.writeCharacterOrUnicode(outputCharacter, warnText[2]); versionOutputCharacter = characterMessage.character; - warnText[2] = characterMessage.message; + warnText[2] = characterMessage.message; } // add a warning in front of rules in case unavailable modifiers or ambiguous rules are used @@ -175,12 +179,24 @@ export class KmnFileWriter { + '\"\n'; } else { - data += warningTextToWrite - + "+ [" - + (uniqueDataRules[k].modifierKey + ' ' + uniqueDataRules[k].key).trim() - + `] > \'` - + versionOutputCharacter - + '\'\n'; + // surround all output characters with '' (e.g. + [K_A] > 'A') + // but don`t for U+xxxx in control character message (e.g. c Use of a control character + [K_A] > U+0011 ) + if (warningTextToWrite.indexOf("control character") === -1) { + data += warningTextToWrite + + "+ [" + + (uniqueDataRules[k].modifierKey + ' ' + uniqueDataRules[k].key).trim() + + `] > \'` + + versionOutputCharacter + + '\'\n'; + } + else { + data += warningTextToWrite + + "+ [" + + (uniqueDataRules[k].modifierKey + ' ' + uniqueDataRules[k].key).trim() + + `] > ` + + versionOutputCharacter + + '\n'; + } } } } @@ -205,7 +221,7 @@ export class KmnFileWriter { if ((outputCharacter !== undefined) || (outputCharacter !== "")) { const characterMessage = this.writeCharacterOrUnicode(outputCharacter, warnText[2]); versionOutputCharacter = characterMessage.character; - warnText[2] = characterMessage.message; + warnText[2] = characterMessage.message; } // add a warning in front of rules in case unavailable modifiers or ambiguous rules are used @@ -246,17 +262,28 @@ export class KmnFileWriter { + '\"\n'; } else { - data += warningTextToWrite - + "dk(A" - + (String(uniqueDataRules[k].idDeadkey) + ") + [" - + uniqueDataRules[k].modifierKey).trim() - + " " - + uniqueDataRules[k].key + "] > \'" - + versionOutputCharacter - + "\'\n"; + // surround all output characters with '' (e.g. + [K_A] > 'A') + // but don`t for U+xxxx in control character message (e.g. c Use of a control character + [K_A] > U+0011 ) + if (warningTextToWrite.indexOf("control character") === -1) { + data += warningTextToWrite + + "dk(A" + + (String(uniqueDataRules[k].idDeadkey) + ") + [" + + uniqueDataRules[k].modifierKey).trim() + + " " + + uniqueDataRules[k].key + "] > \'" + + versionOutputCharacter + + "\'\n"; + } else { + data += warningTextToWrite + + "dk(A" + + (String(uniqueDataRules[k].idDeadkey) + ") + [" + + uniqueDataRules[k].modifierKey).trim() + + " " + + uniqueDataRules[k].key + "] > " + + versionOutputCharacter + + "\n"; + } } - - } data += "\n"; } @@ -279,7 +306,7 @@ export class KmnFileWriter { if ((outputCharacter !== undefined) || (outputCharacter !== "")) { const characterMessage = this.writeCharacterOrUnicode(outputCharacter, warnText[2]); versionOutputCharacter = characterMessage.character; - warnText[2] = characterMessage.message; + warnText[2] = characterMessage.message; } // add a warning in front of rules in case unavailable modifiers or ambiguous rules are used @@ -330,15 +357,31 @@ export class KmnFileWriter { } if (!((warnText[2].length > 0) && KeylayoutToKmnConverter.SKIP_COMMENTED_LINES)) { - data += warningTextToWrite + "dk(B" - + (String(uniqueDataRules[k].idDeadkey) - + ") + [" - + uniqueDataRules[k].modifierKey).trim() - + " " - + uniqueDataRules[k].key - + "] > \'" - + versionOutputCharacter - + "\'\n"; + // surround all output characters with '' (e.g. + [K_A] > 'A') + // but don`t for U+xxxx in control character message (e.g. c Use of a control character + [K_A] > U+0011 ) + if (warningTextToWrite.indexOf("control character") === -1) { + data += warningTextToWrite + "dk(B" + + (String(uniqueDataRules[k].idDeadkey) + + ") + [" + + uniqueDataRules[k].modifierKey).trim() + + " " + + uniqueDataRules[k].key + + "] > \'" + + versionOutputCharacter + + "\'\n"; + } else { + data += warningTextToWrite + "dk(B" + + (String(uniqueDataRules[k].idDeadkey) + + ") + [" + + uniqueDataRules[k].modifierKey).trim() + + " " + + uniqueDataRules[k].key + + "] > " + + versionOutputCharacter + + "\n"; + + } + } } @@ -359,7 +402,10 @@ export class KmnFileWriter { * @param index the index of a rule in Rule[] * @return a string[] containing possible warnings for a rule */ - public reviewRules(rule: Rule[], index: number): string[] { + private reviewRules(rule: Rule[], index: number): string[] { + /*const result: ReviewRulesResult = { + warningMessage: [] + };*/ const keylayoutKmnConverter = new KeylayoutToKmnConverter(this.callbacks, this.options); const warningText: string[] = Array(3).fill(""); @@ -845,6 +891,7 @@ export class KmnFileWriter { warningText[2] = warningText[2] + extraWarning; } } + //result.warningMessage = warningText; return warningText; } @@ -856,14 +903,14 @@ export class KmnFileWriter { * a non-control character will be written as itself ( 'A', '1', '፩', '😎') * null in case of an empty string or null or undefined input */ - public writeCharacterOrUnicode(ctr: string, msg: string = ""): messageCharacter { + public writeCharacterOrUnicode(ctr: string, msg: string = ""): MessageCharacter { if ((ctr === null) || (ctr === undefined) || (ctr.length === 0)) { return null; } let versionOutputCharacter; - const out: messageCharacter = { + const out: MessageCharacter = { message: msg, character: ctr }; @@ -877,7 +924,7 @@ export class KmnFileWriter { m_uni ? parseInt(m_uni[1], 16) : m_hex ? parseInt(m_hex[1], 16) : parseInt(m_dec[1], 10) : KeylayoutToKmnConverter.MAX_CTRL_CHARACTER ); - // for control charactersin 'U+...', '&#x...' or '&#...' format as well as in "" format + // for control characters in 'U+...', '&#x...' or '&#...' format as well as in "" format if ((ctr_val < KeylayoutToKmnConverter.MAX_CTRL_CHARACTER) || (ctr.charCodeAt(0) < KeylayoutToKmnConverter.MAX_CTRL_CHARACTER)) { // for control characters in 'U+...', '&#x...' or '&#...' format @@ -1003,4 +1050,9 @@ export class KmnFileWriter { } return undefined; } + /** @internal */ + public unitTestEndpoints = { + reviewRules: this.reviewRules.bind(this), + }; } + diff --git a/developer/src/kmc-convert/test/data/keylayout.dtd b/developer/src/kmc-convert/test/data/keylayout.dtd deleted file mode 100644 index a5c7526781..0000000000 --- a/developer/src/kmc-convert/test/data/keylayout.dtd +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/developer/src/kmc-convert/test/kmn-file-reader.tests.ts b/developer/src/kmc-convert/test/keylayout-file-reader.tests.ts similarity index 78% rename from developer/src/kmc-convert/test/kmn-file-reader.tests.ts rename to developer/src/kmc-convert/test/keylayout-file-reader.tests.ts index c68e0e5241..024f9d5697 100644 --- a/developer/src/kmc-convert/test/kmn-file-reader.tests.ts +++ b/developer/src/kmc-convert/test/keylayout-file-reader.tests.ts @@ -3,7 +3,7 @@ * * Created by S. Schmitt on 2025-05-12 * - * Tests for KeylayoutToKmnConverter, KeylayoutFileReader, KmnFileWriter + * Tests for KeylayoutFileReader * */ @@ -27,23 +27,23 @@ describe('KeylayoutFileReader', function () { assert.isNotEmpty(result); }); - it('read() should return empty array on empty input', async function () { + it('read() should return null on empty input', async function () { const result = sutR.read(compilerTestCallbacks.loadFile("")); assert.isNull(result); }); - it('read() should return empty array on space as input', async function () { + it('read() should return null on space as input', async function () { const result = sutR.read(compilerTestCallbacks.loadFile(" ")); assert.isNull(result); }); - it('read() should return empty array on unavailable file name', async function () { + it('read() should return null on unavailable file name', async function () { const inputFilenameUnavailable = makePathToFixture('../data/X.keylayout'); const result = sutR.read(compilerTestCallbacks.loadFile(inputFilenameUnavailable)); assert.isNull(result); }); - it('read() should return empty array on typo in path', async function () { + it('read() should return null on typo in path', async function () { const result = sutR.read(compilerTestCallbacks.loadFile(makePathToFixture('../data|Test.keylayout'))); assert.isNull(result); }); diff --git a/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts b/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts index a7010ef1e7..31af145f92 100644 --- a/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts +++ b/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts @@ -3,7 +3,7 @@ * * Created by S. Schmitt on 2025-05-12 * - * Tests for KeylayoutToKmnConverter, KeylayoutFileReader, KmnFileWriter + * Tests for KeylayoutToKmnConverter * */ import 'mocha'; @@ -23,32 +23,30 @@ describe('KeylayoutToKmnConverter', function () { describe('RunSpecialTestFiles', function () { const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); [ - [makePathToFixture('../data/Test_C0.keylayout')], - [makePathToFixture('../data/Test_C1.keylayout')], - [makePathToFixture('../data/Test_C2.keylayout')], - [makePathToFixture('../data/Test_C2_several.keylayout')], - [makePathToFixture('../data/Test_C3.keylayout')], - [makePathToFixture('../data/Test_C3_several.keylayout')], - [makePathToFixture('../data/Test_C0_C1_C2_C3.keylayout')], - [makePathToFixture('../data/Test_maxKeyCode.keylayout')], - [makePathToFixture('../data/Test_messages.keylayout')], - [makePathToFixture('../data/Test_messages_controlCharacter.keylayout')], - [makePathToFixture('../data/Test_messages_superior_C2.keylayout')], - [makePathToFixture('../data/Test_messages_superior_C3.keylayout')], - [makePathToFixture('../data/Test_duplicate_missing_keycode.keylayout')], - [makePathToFixture('../data/Test_modifier.keylayout')], - [makePathToFixture('../data/Test_modifierNoCaps.keylayout')], - [makePathToFixture('../data/Test_differentAmountOfKeysInBehaviours.keylayout')], - [makePathToFixture('../data/Test_duplicate_missing_keys.keylayout')], - [makePathToFixture('../data/Test_duplicate_keys.keylayout')], - [makePathToFixture('../data/Test_ambiguous_keys.keylayout')], - [makePathToFixture('../data/Test_nr_elements.keylayout')], - [makePathToFixture('../data/Test.keylayout')], - [makePathToFixture('../data/Test_differentEncodings.keylayout')], - [makePathToFixture('../data/Test_ExtraWarning.keylayout')], + ['../data/Test_C0.keylayout'], + ['../data/Test_C1.keylayout'], + ['../data/Test_C2.keylayout'], + ['../data/Test_C2_several.keylayout'], + ['../data/Test_C3.keylayout'], + ['../data/Test_C3_several.keylayout'], + ['../data/Test_C0_C1_C2_C3.keylayout'], + ['../data/Test_maxKeyCode.keylayout'], + ['../data/Test_messages.keylayout'], + ['../data/Test_messages_controlCharacter.keylayout'], + ['../data/Test_messages_superior_C2.keylayout'], + ['../data/Test_messages_superior_C3.keylayout'], + ['../data/Test_duplicate_missing_keycode.keylayout'], + ['../data/Test_modifier.keylayout'], + ['../data/Test_modifierNoCaps.keylayout'], + ['../data/Test_differentAmountOfKeysInBehaviours.keylayout'], + ['../data/Test_duplicate_keys.keylayout'], + ['../data/Test_ambiguous_keys.keylayout'], + ['../data/Test.keylayout'], + ['../data/Test_differentEncodings.keylayout'], + ['../data/Test_ExtraWarning.keylayout'], ].forEach(function (files) { it(files + " should give no errors ", async function () { - sut.run(files[0]); + sut.run(makePathToFixture(files[0])); assert.isTrue(compilerTestCallbacks.messages.length === 0); }); }); @@ -57,44 +55,34 @@ describe('KeylayoutToKmnConverter', function () { describe('RunTestFiles resulting in errors ', function () { const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); [ - [makePathToFixture('../data/Test_moreKeyMapThanKeyMapselectERROR.keylayout')], - [makePathToFixture('../data/Test_moreKeyMapThanKeyMapselectAndJisERROR.keylayout')], - [makePathToFixture('../data/Test_moreKeyMapThanKeyMapselectERROR.keylayout')], - [makePathToFixture('../data/Test_MissingkeyERROR.keylayout')], - [makePathToFixture('../data/Test_MissingkeyMapERROR.keylayout')], - [makePathToFixture('../data/Test_MissingLayoutsERROR.keylayout')], - [makePathToFixture('../data/Test_MissingmodifierMapERROR.keylayout')], - [makePathToFixture('../data/Test_MissingkeyMapSetERROR.keylayout')], - [makePathToFixture('../data/Test_MissingActionsERROR.keylayout')], - [makePathToFixture('../data/Test_MissingTerminatorsERROR.keylayout')], - [makePathToFixture('../data/Test_MissingAllERROR.keylayout')], + ['../data/Test_moreKeyMapThanKeyMapselectERROR.keylayout'], + ['../data/Test_moreKeyMapThanKeyMapselectAndJisERROR.keylayout'], + ['../data/Test_moreKeyMapThanKeyMapselectERROR.keylayout'], + ['../data/Test_MissingkeyERROR.keylayout'], + ['../data/Test_MissingkeyMapERROR.keylayout'], + ['../data/Test_MissingLayoutsERROR.keylayout'], + ['../data/Test_MissingmodifierMapERROR.keylayout'], + ['../data/Test_MissingkeyMapSetERROR.keylayout'], + ['../data/Test_MissingActionsERROR.keylayout'], + ['../data/Test_MissingTerminatorsERROR.keylayout'], + ['../data/Test_MissingAllERROR.keylayout'], + ['../data/Test_characters.keylayout'], ].forEach(function (files) { it(files + " should give an error ", async function () { - sut.run(files[0]); + sut.run(makePathToFixture(files[0])); assert.isTrue(compilerTestCallbacks.messages.length > 0); }); }); }); - describe('RunSpecialTestFiles - create Error: unsupported characters', function () { - const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); - [ - [makePathToFixture('../data/Test_characters.keylayout')], - ].forEach(function (files) { - it(files + " should give Error: unsupported characters ", async function () { - sut.run(files[0]); - assert.isTrue(compilerTestCallbacks.messages.length === 1); - }); - }); - }); describe('RunSpecialTestFiles - create Error: undefined action', function () { const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); [ - [makePathToFixture('../data/Test_undefinedAction.keylayout')], + ['../data/Test_undefinedAction.keylayout'], ].forEach(function (files) { it(files + " should give Error: undefined action detected", async function () { - sut.run(files[0]); + sut.run(makePathToFixture(files[0])); assert.isTrue(compilerTestCallbacks.messages.length === 1); assert.equal(compilerTestCallbacks.messages[0].code, 5292040); }); @@ -141,15 +129,13 @@ describe('KeylayoutToKmnConverter', function () { const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); const infile = '../data/Test.keylayout'; [ - [makePathToFixture('../data/Test.kmn')], - [makePathToFixture('')], - [], - [null], - [makePathToFixture('../data/test_OtherOutputName.kmn')], - [makePathToFixture('../data/OutputXName.bb')], + ['../data/Test.kmn'], + [''], + ['../data/test_OtherOutputName.kmn'], + ['../data/OutputXName.bb'], ].forEach(function (files) { it(infile + " should run ", async function () { - await NodeAssert.doesNotReject(async () => sut.run(makePathToFixture(infile), files[0])); + await NodeAssert.doesNotReject(async () => sut.run(makePathToFixture(infile), makePathToFixture(files[0]))); assert.equal(compilerTestCallbacks.messages.length, 0); }); }); @@ -162,32 +148,32 @@ describe('KeylayoutToKmnConverter', function () { // ProcessedData from usable file const inputFilename = makePathToFixture('../data/Test.keylayout'); const read = sutR.read(compilerTestCallbacks.loadFile(inputFilename)); - const converted = sut.convertBound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); + const converted = sut.unitTestEndpoints.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); // ProcessedData from unavailable file const inputFilenameUnavailable = makePathToFixture('../data/X.keylayout'); const readUnavailable = sutR.read(compilerTestCallbacks.loadFile(inputFilenameUnavailable)); - const convertedUnavailable = sut.convertBound.convert(readUnavailable, inputFilenameUnavailable.replace(/\.keylayout$/, '.kmn')); + const convertedUnavailable = sut.unitTestEndpoints.convert(readUnavailable, inputFilenameUnavailable.replace(/\.keylayout$/, '.kmn')); // ProcessedData from empty file const inputFilenameEmpty = makePathToFixture(''); const readEmpty = sutR.read(compilerTestCallbacks.loadFile(inputFilenameEmpty)); - const convertedEmpty = sut.convertBound.convert(readEmpty, inputFilenameEmpty); + const convertedEmpty = sut.unitTestEndpoints.convert(readEmpty, inputFilenameEmpty); it('should return converted array on correct input', async function () { assert.isTrue(converted.rules.length !== 0); }); - it('should return empty on empty name as input', async function () { + it('should return null on empty name as input', async function () { assert.isNull(convertedUnavailable); }); - it('should return empty on empty input', async function () { + it('should return null on empty input', async function () { assert.isNull(convertedEmpty); }); - it('should return empty array of rules on null input', async function () { - const convertedRule = sut.convertBound.convert(null, 'ABC.kmn'); + it('should return null of rules on null input', async function () { + const convertedRule = sut.unitTestEndpoints.convert(null, 'ABC.kmn'); assert.isNull(convertedRule); }); }); @@ -197,7 +183,6 @@ describe('KeylayoutToKmnConverter', function () { [ [' ', true, 'NCAPS'], [' ', false, ''], - ['NCAPS', true, 'NCAPS'], ['NCAPS', false, ''], ['caps', true, 'CAPS'], @@ -301,7 +286,6 @@ describe('KeylayoutToKmnConverter', function () { [[['CaPs', 'xxx'], ['yyy']], true], [[['Caps?', 'xxx'], ['yyy']], false], [[['zzz', 'xxx'], ['Caps?']], false], - [[['caps?', 'xxx'], ['yyy']], false], [[['zzz', 'xxx'], ['yyy']], false], [[['shift', 'xxx'], ['caps']], true], [[['shift', 'caps'], ['yyy']], true], @@ -324,7 +308,7 @@ describe('KeylayoutToKmnConverter', function () { const sutR = new KeylayoutFileReader(compilerTestCallbacks); const inputFilename = makePathToFixture('../data/Test.keylayout'); const read = sutR.read(compilerTestCallbacks.loadFile(inputFilename)); - const converted = sut.convertBound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); + const converted = sut.unitTestEndpoints.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); [ [[{ key: '0', behavior: 0 }], [['', 'shift? caps? ']]], [[{ key: '0', behavior: 2 }], [['shift? leftShift caps? ', 'anyShift caps?', 'shift leftShift caps ', 'shift? rightShift caps? ']]], @@ -339,7 +323,7 @@ describe('KeylayoutToKmnConverter', function () { it((values[1] !== null) ? ("getModifierArrayFromKeyModifierArray('" + JSON.stringify(values[0]) + "')").padEnd(68, " ") + " should return '" + JSON.stringify(values[1]) + "'" : ("getModifierArrayFromKeyModifierArray('" + JSON.stringify(values[0]) + "')").padEnd(68, " ") + " should return '" + "null" + "'", async function () { - const result = sut.getModifierArrayFromKeyModifierArray(converted.modifiers, values[0] as unknown as KeylayoutFileData[]); + const result = sut.getModifierArrayFromKeyModifierArray(converted.modifiers, values[0] as unknown as KeylayoutFileData[]); assert.deepStrictEqual(JSON.stringify(result), JSON.stringify(values[1])); }); }); @@ -611,7 +595,7 @@ describe('KeylayoutToKmnConverter', function () { const sutR = new KeylayoutFileReader(compilerTestCallbacks); const inputFilename = makePathToFixture('../data/Test.keylayout'); const read = sutR.read(compilerTestCallbacks.loadFile(inputFilename)); - const converted = sut.convertBound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); + const converted = sut.unitTestEndpoints.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); [ ['A_1', 'A', true, [{ "outchar": "A", "actionId": "A_1", "behavior": "1", "key": "K_A", "modifier": "CAPS" }, @@ -800,7 +784,7 @@ describe('KeylayoutToKmnConverter', function () { it('data of \'' + values[0] + "' passed into createRuleData() " + 'should create an array of rules', async function () { const inputFilename = makePathToFixture(values[0][0]); const read = sutR.read(compilerTestCallbacks.loadFile(inputFilename)); - const processedData = sut.convertBound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); + const processedData = sut.unitTestEndpoints.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); assert.deepEqual(processedData.rules[0], values[1][0]); }); }); diff --git a/developer/src/kmc-convert/test/kmn-file-writer.tests.ts b/developer/src/kmc-convert/test/kmn-file-writer.tests.ts index ede21c9b9a..41405fa3c1 100644 --- a/developer/src/kmc-convert/test/kmn-file-writer.tests.ts +++ b/developer/src/kmc-convert/test/kmn-file-writer.tests.ts @@ -3,7 +3,7 @@ * * Created by S. Schmitt on 2025-05-12 * - * Tests for KeylayoutToKmnConverter, KeylayoutFileReader, KmnFileWriter + * Tests for KmnFileWriter * */ @@ -27,7 +27,7 @@ describe('KmnFileWriter', function () { const sutR = new KeylayoutFileReader(compilerTestCallbacks); const sutW = new KmnFileWriter(compilerTestCallbacks, compilerTestOptions); const read = sutR.read(compilerTestCallbacks.loadFile(inputFilename)); - const converted = sut.convertBound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); + const converted = sut.unitTestEndpoints.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); it('writeDataRules() should return true (no error) if written', async function () { const result = sutW.writeDataRules(converted); @@ -42,7 +42,7 @@ describe('KmnFileWriter', function () { const sutW = new KmnFileWriter(compilerTestCallbacks, compilerTestOptions); const inputFilename = makePathToFixture('../data/Test.keylayout'); const read = sutR.read(compilerTestCallbacks.loadFile(inputFilename)); - const converted = sut.convertBound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); + const converted = sut.unitTestEndpoints.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn')); const outExpectedFirst: string = "c ..................................................................................................................\n" @@ -150,7 +150,7 @@ describe('KmnFileWriter', function () { ].forEach(function (values: (string[] | Rule[])[], index: number) { it(('rule " ' + (values[0][0] as Rule).ruleType as string + ' "') + 'should create "' + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () { - const result: string[] = sutW.reviewRules(values[0] as Rule[], 0); + const result: string[] = sutW.unitTestEndpoints.reviewRules(values[0] as Rule[], 0); assert.equal(result[0], values[1][0]); assert.equal(result[1], values[2][0]); assert.equal(result[2], values[3][0]); @@ -315,7 +315,7 @@ describe('KmnFileWriter', function () { ].forEach(function (values: (string[] | Rule[])[], index: number) { it('rule ' + (values[0][0] as Rule).ruleType as string + ' should create " ' + ' "' + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () { - const result: string[] = sutW.reviewRules(values[0] as Rule[], 1); + const result: string[] = sutW.unitTestEndpoints.reviewRules(values[0] as Rule[], 1); assert.equal(result[0], values[1][0]); assert.equal(result[1], values[2][0]); assert.equal(result[2], values[3][0]); @@ -333,9 +333,9 @@ describe('KmnFileWriter', function () { [''], [''], ["c WARNING: ambiguous rule: later: [RALT K_B] > dk(A0) ambiguous rule: earlier: [RALT K_B] > 'X' here: PLEASE CHECK THE FOLLOWING RULE AS IT WILL NOT BE WRITTEN ! "]], - ].forEach(function (values: (string[] | Rule[])[], index: number) { - it(('rule ' + (values[0][0]as Rule).ruleType as string + ' should create " ' + ' "') + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () { - const result: string[] = sutW.reviewRules(values[0]as Rule[], 2); + ].forEach(function (values: (string[] | Rule[])[], index: number) { + it(('rule ' + (values[0][0] as Rule).ruleType as string + ' should create " ' + ' "') + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () { + const result: string[] = sutW.unitTestEndpoints.reviewRules(values[0] as Rule[], 2); assert.equal(result[0], values[1][0]); assert.equal(result[1], values[2][0]); assert.equal(result[2], values[3][0]); From b4d85280b00e082060a96ba958ae7f5b9d2574ba Mon Sep 17 00:00:00 2001 From: Sabine Date: Mon, 18 May 2026 17:58:52 +0200 Subject: [PATCH 3/4] feat(developer): kmc-convert converter messages --- .../src/kmc-convert/src/converter-messages.ts | 29 +++++++------------ developer/src/kmc-convert/src/converter.ts | 2 +- .../keylayout-to-kmn/keylayout-file-reader.ts | 6 ++-- .../keylayout-to-kmn-converter.ts | 7 ++--- .../test/keylayout-to-kmn-converter.tests.ts | 5 ++-- 5 files changed, 20 insertions(+), 29 deletions(-) diff --git a/developer/src/kmc-convert/src/converter-messages.ts b/developer/src/kmc-convert/src/converter-messages.ts index 40816d2315..a915c9a068 100644 --- a/developer/src/kmc-convert/src/converter-messages.ts +++ b/developer/src/kmc-convert/src/converter-messages.ts @@ -17,12 +17,6 @@ const SevError = CompilerErrorSeverity.Error | Namespace; */ export class ConverterMessages { - static ERROR_InputFilenameIsRequired = SevError | 0x0002; - static Error_InputFilenameIsRequired = () => m( - this.ERROR_InputFilenameIsRequired, - `An input filename is required for keyboard conversion.` - ); - static ERROR_FileNotFound = SevError | 0x0003; static Error_FileNotFound = (o: { inputFilename: string; }) => m( this.ERROR_FileNotFound, @@ -42,27 +36,21 @@ export class ConverterMessages { ); static ERROR_UnableToRead = SevError | 0x0006; - static Error_UnableToRead = () => m( + static Error_UnableToRead = (o: { errorText: string; }) => m( this.ERROR_UnableToRead, - `Input file could not be read.` - ); - - static ERROR_UnableToParse = SevError | 0x000C; - static Error_UnableToParse = () => m( - this.ERROR_UnableToParse, - `Input data could not be parsed.` + `Input file could not be read. ${def(o.errorText)}` ); static ERROR_UnsupportedCharactersDetected = SevError | 0x0007; - static Error_UnsupportedCharactersDetected = (o: { inputFilename: string, keymapIndex: string, key: string, KeyName: string, output: string; }) => m( + static Error_UnsupportedCharactersDetected = (o: { keymapIndex: string, key: string, KeyName: string, output: string; }) => m( this.ERROR_UnsupportedCharactersDetected, - `Input file ${def(o.inputFilename)} contains unsupported character '${def(o.output)}' at keyMap index ${def(o.keymapIndex)} on Keycode ${def(o.key)} (${def(o.KeyName)})` + `Input file contains unsupported character '${def(o.output)}' at keyMap index ${def(o.keymapIndex)} on Keycode ${def(o.key)} (${def(o.KeyName)})` ); static ERROR_UndefinedActionDetected = SevError | 0x0008; - static Error_UndefinedActionDetected = (o: { inputFilename: string, action: string, KeyName: string, keymapIndex: string; }) => m( + static Error_UndefinedActionDetected = (o: { action: string, KeyName: string, keymapIndex: string; }) => m( this.ERROR_UndefinedActionDetected, - `${def(o.inputFilename)}: Action id ${def(o.action)} of key ${def(o.KeyName)} in keymapIndex ${def(o.keymapIndex)} is not defined` + `Action id ${def(o.action)} of key ${def(o.KeyName)} in keymapIndex ${def(o.keymapIndex)} is not defined` ); static ERROR_NoConverterFound = SevError | 0x0009; @@ -83,4 +71,9 @@ export class ConverterMessages { `Output file for '${def(o.outputFilename)}' could not be written. ${def(o.errorText)}` ); + static ERROR_UnableToParse = SevError | 0x000C; + static Error_UnableToParse = () => m( + this.ERROR_UnableToParse, + `Input data could not be parsed.` + ); } diff --git a/developer/src/kmc-convert/src/converter.ts b/developer/src/kmc-convert/src/converter.ts index 63da75dd81..f60e2c285e 100644 --- a/developer/src/kmc-convert/src/converter.ts +++ b/developer/src/kmc-convert/src/converter.ts @@ -64,7 +64,7 @@ export class Converter implements KeymanCompiler { }; if (!inputFilename) { - this.callbacks.reportMessage(ConverterMessages.Error_InputFilenameIsRequired()); + throw new Error('Input filename is required'); return null; } diff --git a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-file-reader.ts b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-file-reader.ts index 46b4e055b3..21c6dd5bee 100644 --- a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-file-reader.ts +++ b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-file-reader.ts @@ -161,9 +161,9 @@ export class KeylayoutFileReader { this.boxArray(jsonObj.keyboard); // jsonObj now contains arrays; no single fields return jsonObj; } - catch (err) { - this.callbacks.reportMessage(ConverterMessages.Error_UnableToRead()); + catch (err: any) { + this.callbacks.reportMessage(ConverterMessages.Error_UnableToRead({ errorText: err })); return null; } } -} +}; diff --git a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts index 4c53223729..3bf79050fb 100644 --- a/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts +++ b/developer/src/kmc-convert/src/keylayout-to-kmn/keylayout-to-kmn-converter.ts @@ -111,10 +111,9 @@ export class KeylayoutToKmnConverter { async run(inputFilename: string, outputFilename?: string): Promise { if (!inputFilename) { - this.callbacks.reportMessage(ConverterMessages.Error_FileNotFound({ inputFilename })); + throw new Error('Input filename is required'); return null; } - const KeylayoutReader = new KeylayoutFileReader(this.callbacks/*, this.options*/); const binaryData = this.callbacks.loadFile(inputFilename); @@ -315,7 +314,6 @@ export class KeylayoutToKmnConverter { const b1ActionIndex: number = this.getActionIndexFromActionId(jsonObj, actionId); if (b1ActionIndex < 0) { this.callbacks.reportMessage(ConverterMessages.Error_UndefinedActionDetected({ - inputFilename: jsonObj.keyboard['name'] + ".keylayout", action: actionId, KeyName: this.mapUkeleleKeycodeToVK(Number(jsonObj.keyboard.keyMapSet[0].keyMap[i].key[j]['code'])), keymapIndex: jsonObj.keyboard.keyMapSet[0].keyMap[i]['index'] @@ -484,9 +482,8 @@ export class KeylayoutToKmnConverter { } } else { this.callbacks.reportMessage(ConverterMessages.Error_UnsupportedCharactersDetected({ - inputFilename: jsonObj.keyboard['name'] + ".keylayout", keymapIndex: jsonObj.keyboard.keyMapSet[0].keyMap[i]['index'], - output: jsonObj.keyboard.keyMapSet[0].keyMap[i].key[j]['output'], + output: jsonObj.keyboard.keyMapSet[0].keyMap[i].key[j]['output'] ?? '', key: jsonObj.keyboard.keyMapSet[0].keyMap[i].key[j]['code'], KeyName: this.mapUkeleleKeycodeToVK(Number(jsonObj.keyboard.keyMapSet[0].keyMap[i].key[j]['code'])) })); diff --git a/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts b/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts index 31af145f92..e42d7255b3 100644 --- a/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts +++ b/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts @@ -92,7 +92,7 @@ describe('KeylayoutToKmnConverter', function () { describe('run() ', function () { const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); - it('run() should throw on null input file name and null output file name', async function () { + it(') should throw on null input file name and null output file name', async function () { // note, could use 'chai as promised' library to make this more fluent: const result = sut.run(null, null); assert.isNotNull(result); @@ -119,7 +119,8 @@ describe('KeylayoutToKmnConverter', function () { const result = sut.run(inputFilename, null); assert.isNotNull(result); assert.equal(compilerTestCallbacks.messages.length, 2); - assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_UnableToRead()); + //assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_UnableToRead()); + assert.isTrue(compilerTestCallbacks.hasMessage(ConverterMessages.ERROR_UnableToRead)); assert.equal(compilerTestCallbacks.messages[1].code, 5292037); }); }); From f8b0892e59d7d236a6b1d734e06c3019400f1ccd Mon Sep 17 00:00:00 2001 From: Sabine Date: Tue, 19 May 2026 09:19:58 +0200 Subject: [PATCH 4/4] feat(developer): remove 3 tests --- .../test/keylayout-to-kmn-converter.tests.ts | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts b/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts index e42d7255b3..989ac91e7c 100644 --- a/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts +++ b/developer/src/kmc-convert/test/keylayout-to-kmn-converter.tests.ts @@ -92,28 +92,6 @@ describe('KeylayoutToKmnConverter', function () { describe('run() ', function () { const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions); - it(') should throw on null input file name and null output file name', async function () { - // note, could use 'chai as promised' library to make this more fluent: - const result = sut.run(null, null); - assert.isNotNull(result); - assert.equal(compilerTestCallbacks.messages.length, 1); - assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_FileNotFound({ inputFilename: null })); - }); - - it('run() should throw on null input file name and empty output file name', async function () { - const result = sut.run(null, ''); - assert.isNotNull(result); - assert.equal(compilerTestCallbacks.messages.length, 1); - assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_FileNotFound({ inputFilename: null })); - }); - - it('run() should throw on null input file name and unknown output file name', async function () { - const result = sut.run(null, 'X'); - assert.isNotNull(result); - assert.equal(compilerTestCallbacks.messages.length, 1); - assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_FileNotFound({ inputFilename: null })); - }); - it('run() should throw on unavailable input file name and null output file name', async function () { const inputFilename = makePathToFixture('../data/Unavailable.keylayout'); const result = sut.run(inputFilename, null);