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 36c195cd85..bd941358dd 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 @@ -103,11 +103,6 @@ export class KeylayoutToKmnConverter { return null; } - if (outputFilename === null) { - this.callbacks.reportMessage(ConverterMessages.Error_OutputFilenameIsRequired()); - return null; - } - const KeylayoutReader = new KeylayoutFileReader(this.callbacks/*, this.options*/); const jsonO: Keylayout.KeylayoutXMLSourceFile = KeylayoutReader.read(inputFilename); @@ -120,9 +115,7 @@ export class KeylayoutToKmnConverter { return null; } - outputFilename = outputFilename ?? inputFilename.replace(/\.keylayout$/, '.kmn'); - - const outArray: ProcessedData = await this.convert(jsonO, outputFilename); + const outArray: ProcessedData = await this.convert(jsonO, inputFilename); const kmnFileWriter = new KmnFileWriter(this.callbacks, this.options); @@ -130,7 +123,7 @@ export class KeylayoutToKmnConverter { const outUint8: Uint8Array = kmnFileWriter.write(outArray); const result: ConverterToKmnResult = { artifacts: { - kmn: { data: outUint8, filename: outputFilename } + kmn: { data: outUint8, filename: outArray.kmnFilename } } }; return result; @@ -141,10 +134,14 @@ export class KeylayoutToKmnConverter { * @param jsonObj containing filename, behaviour and rules of a json object * @return an ProcessedData containing all data ready to print out */ - private convert(jsonObj: any, outputfilename: string): ProcessedData { - const modifierBehavior: string[][] = []; // modifier for each behaviour - const rules: Rule[] = []; // an array of data for a kmn rule + private convert(jsonObj: any, inputfilename: string): ProcessedData { + // modifiers for each behaviour + const modifierBehavior: string[][] = []; + // an array of data for a kmn rule + const rules: Rule[] = []; + + // dataObject for all relevant data const dataObject: ProcessedData = { keylayoutFilename: "", kmnFilename: "", @@ -152,11 +149,10 @@ export class KeylayoutToKmnConverter { arrayOfRules: [] }; - if ((jsonObj !== null) && (jsonObj.hasOwnProperty("keyboard"))) { - dataObject.keylayoutFilename = outputfilename.replace(/\.kmn$/, '.keylayout'); - dataObject.kmnFilename = outputfilename; - dataObject.arrayOfModifiers = modifierBehavior; // ukelele uses behaviours e.g. 18 modifiersCombinations in 8 KeyMapSelect(behaviors) - dataObject.arrayOfRules = rules; + if ((jsonObj === null) || (!jsonObj.hasOwnProperty("keyboard"))) { + this.callbacks.reportMessage(ConverterMessages.Error_UnableToRead({ inputFilename: inputfilename })); + return dataObject; + } else { // create an array of modifier combinations and store in dataObject for (let j = 0; j < jsonObj.keyboard.modifierMap.keyMapSelect.length; j++) { @@ -166,17 +162,19 @@ export class KeylayoutToKmnConverter { } modifierBehavior.push(singleModifierSet); } + + // fill dataObject with filenames, behaviours and (initialized) rules + dataObject.keylayoutFilename = inputfilename; + dataObject.kmnFilename = inputfilename.replace(/\.kkeylayoutn$/, '.kmn');; + dataObject.arrayOfModifiers = modifierBehavior; // ukelele uses behaviours e.g. 18 modifiersCombinations in 8 KeyMapSelect(behaviors) + dataObject.arrayOfRules = rules; + // fix the amount of processable keys to the maximun nr of keys of a keyMap to avoid processing more keys than defined KeylayoutToKmnConverter.USE_KEY_COUNT = findUsedKeysCount(jsonObj); // fill rules into arrayOfRules of dataObject return this.createRuleData(dataObject, jsonObj); } - else { - const inputFilename = dataObject.keylayoutFilename; - this.callbacks.reportMessage(ConverterMessages.Error_UnableToConvert({ inputFilename })); - return dataObject; - } } /** 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 c90ec696de..6b06fdbf48 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 @@ -107,7 +107,6 @@ describe('KeylayoutToKmnConverter', function () { 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); @@ -119,38 +118,43 @@ describe('KeylayoutToKmnConverter', function () { const inputFilename = makePathToFixture('../data/Unavailable.keylayout'); const result = sut.run(inputFilename, null); assert.isNotNull(result); - assert.equal(compilerTestCallbacks.messages.length, 1); - assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_OutputFilenameIsRequired()); + assert.equal(compilerTestCallbacks.messages.length, 2); + assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_UnableToRead({ inputFilename })); + assert.equal(compilerTestCallbacks.messages[1].code, 5246984); }); - it('run() should throw on and null output file name', async function () { + it('run() should return on available input file name and null output file name', async function () { const inputFilename = makePathToFixture('../data/Test.keylayout'); const result = sut.run(inputFilename, null); assert.isNotNull(result); - assert.equal(compilerTestCallbacks.messages.length, 1); - assert.deepEqual(compilerTestCallbacks.messages[0], ConverterMessages.Error_OutputFilenameIsRequired()); + await NodeAssert.doesNotReject(async () => sut.run(inputFilename, null)); + assert.equal(compilerTestCallbacks.messages.length, 0); }); it('run() should return on correct input file name and empty output file name ', async function () { const inputFilename = makePathToFixture('../data/Test.keylayout'); await NodeAssert.doesNotReject(async () => sut.run(inputFilename, '')); + assert.equal(compilerTestCallbacks.messages.length, 0); }); it('run() should return on correct input file name and null output file name', async function () { const inputFilename = makePathToFixture('../data/Test.keylayout'); await NodeAssert.doesNotReject(async () => sut.run(inputFilename, null)); + assert.equal(compilerTestCallbacks.messages.length, 0); }); it('run() should return on correct input file name and given output file name ', async function () { const inputFilename = makePathToFixture('../data/Test.keylayout'); const outputFilename = makePathToFixture('../data/OutputName.kmn'); await NodeAssert.doesNotReject(async () => sut.run(inputFilename, outputFilename)); + assert.equal(compilerTestCallbacks.messages.length, 0); }); it('run() return on correct input file extention and unsupperted output file extention', async function () { const inputFilename = makePathToFixture('../data/Test.keylayout'); const outputFilename = makePathToFixture('../data/OutputXName.B'); await NodeAssert.doesNotReject(async () => sut.run(inputFilename, outputFilename)); + assert.equal(compilerTestCallbacks.messages.length, 0); }); }); @@ -206,14 +210,14 @@ describe('KeylayoutToKmnConverter', function () { arrayOfModifiers: [], arrayOfRules: [['C0', '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_A', 'A']] }, ''); - assert.isTrue((convertedRule .keylayoutFilename === '' - && convertedRule .arrayOfModifiers.length === 0 - && convertedRule .arrayOfRules.length === 0)); + assert.isTrue((convertedRule.keylayoutFilename === '' + && convertedRule.arrayOfModifiers.length === 0 + && convertedRule.arrayOfRules.length === 0)); }); it('should return empty array of rules on null input', async function () { const convertedRule = sut.convertBound.convert(null, 'ABC.kmn'); - assert.isTrue(convertedRule .arrayOfRules.length === 0); + assert.isTrue(convertedRule.arrayOfRules.length === 0); }); });