diff --git a/developer/src/kmc-convert/src/converter.ts b/developer/src/kmc-convert/src/converter.ts
index 8335c052db..646d0de15f 100644
--- a/developer/src/kmc-convert/src/converter.ts
+++ b/developer/src/kmc-convert/src/converter.ts
@@ -81,10 +81,9 @@ export class Converter implements KeymanCompiler {
}
const converter = new ConverterClass(this.callbacks, converterOptions);
- const artifacts = await converter.run(inputFilename, outputFilename);
+ const result = await converter.run(inputFilename, outputFilename);
// Note: any subsequent errors in conversion will have been reported by the converter
- //return artifacts ? { artifacts } : null;
- return artifacts ? artifacts : null;
+ return result ? result : 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 9d69218bb7..bd7dd4761c 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
@@ -39,8 +39,8 @@ export class KeylayoutFileReader {
/**
* If object contains attribute #text it will be removed.
- * @param o Object with possible property #text
- * @return objects that do not contain property #text
+ * @param o Object with possible property #text containing whitespaces
+ * @return objects that do not contain property #text
*/
public remove_whitespace(o: any): void {
if (o['#text']) {
@@ -50,7 +50,7 @@ export class KeylayoutFileReader {
/**
* @brief wrapper to remove whitespace and box single-entry objects into arrays
- * @param o Object with property to box/remove whitespace from
+ * @param o Object with property to box/remove whitespaces from
* @param x Name of element to box
* @return objects that contain only boxed arrays
*/
@@ -63,7 +63,7 @@ export class KeylayoutFileReader {
/**
* @brief member function to box single-entry objects into arrays
* @param source the object to be changed
- * @return objects that contain only boxed arrays
+ * @return object that contain only boxed arrays
*/
public boxArray(source: any) {
@@ -101,7 +101,7 @@ export class KeylayoutFileReader {
}
/**
- * @brief member function to parse data from a .keylayout-file and store to a json object
+ * @brief member function to parse data from a .keylayout-file and store in a json object
* we need to be able to ignore an output character of "", process an output character of " " (space) and allow surrounding whitespace in #text (which will be removed later)
* @param inputFilename the ukelele .keylayout-file to be parsed
* @return in case of success: json object containing data of the .keylayout file; else null
diff --git a/developer/src/kmc-convert/test/data/Test_characters.keylayout b/developer/src/kmc-convert/test/data/Test_characters.keylayout
index cd890d4264..3b9ccc5840 100644
--- a/developer/src/kmc-convert/test/data/Test_characters.keylayout
+++ b/developer/src/kmc-convert/test/data/Test_characters.keylayout
@@ -42,8 +42,7 @@
-
-
+
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 897fe4e935..a546b20b52 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
@@ -22,27 +22,6 @@ describe('KeylayoutToKmnConverter', function () {
compilerTestCallbacks.clear();
});
- // todo remove
- describe('RunAllFiles', function () {
- const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions);
- [
- [makePathToFixture('../data/Italian.keylayout')],
- [makePathToFixture('../data/Italian_command.keylayout')],
- [makePathToFixture('../data/Swiss_French.keylayout')],
- [makePathToFixture('../data/Spanish.keylayout')],
- [makePathToFixture('../data/Swiss_German.keylayout')],
- [makePathToFixture('../data/US.keylayout')],
- [makePathToFixture('../data/Polish.keylayout')],
- [makePathToFixture('../data/French.keylayout')],
- [makePathToFixture('../data/Latin_American.keylayout')],
- // [makePathToFixture('../data/German_complete.keylayout')],
- [makePathToFixture('../data/German_complete_reduced.keylayout')],
- // [makePathToFixture('../data/German_Standard.keylayout')],
- ].forEach(function (files_) {
- sut.run(files_[0]);
- assert.isTrue(true);
- });
- });
describe('RunTestFiles resulting in errors ', function () {
const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions);
[
@@ -178,16 +157,18 @@ describe('KeylayoutToKmnConverter', function () {
describe('convert() ', function () {
const sut = new KeylayoutToKmnConverter(compilerTestCallbacks, compilerTestOptions);
const sut_r = new KeylayoutFileReader(compilerTestCallbacks);
+
+ // ProcesData from usable file
const inputFilename = makePathToFixture('../data/Test.keylayout');
const read = sut_r.read(inputFilename);
const converted = sut.convert_bound.convert(read, inputFilename.replace(/\.keylayout$/, '.kmn'));
- // ProcesData from unavailable file name
+ // ProcesData from unavailable file
const inputFilename_unavailable = makePathToFixture('../data/X.keylayout');
const read_unavailable = sut_r.read(inputFilename_unavailable);
const converted_unavailable = sut.convert_bound.convert(read_unavailable, inputFilename_unavailable.replace(/\.keylayout$/, '.kmn'));
- // ProcesData from empty filename
+ // ProcesData from empty file
const inputFilename_empty = makePathToFixture('');
const read_empty = sut_r.read(inputFilename_empty);
const converted_empty = sut.convert_bound.convert(read_empty, inputFilename_empty);
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 9a2b4287da..202c8a544c 100644
--- a/developer/src/kmc-convert/test/kmn-file-writer.tests.ts
+++ b/developer/src/kmc-convert/test/kmn-file-writer.tests.ts
@@ -480,4 +480,347 @@ describe('KmnFileWriter', function () {
});
});
+ describe('reviewRules messages', function () {
+ const sut_w = new KmnFileWriter(compilerTestCallbacks, compilerTestOptions);
+
+ [
+ [[new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'UNAVAILABLE', 'K_A', new TextEncoder().encode('A'))],
+ [''],
+ [''],
+ ['c WARNING: unavailable modifier : here: ']],
+
+ [[new Rule("C1", '', '', 0, 0, 'CAPS', 'K_EQUAL', 0, 0, 'UNAVAILABLE', 'K_B', new TextEncoder().encode('B'))],
+ [''],
+ [''],
+ ['c WARNING: unavailable modifier : here: ']],
+
+ [[new Rule("C2", '', '', 0, 0, 'CAPS', 'K_EQUAL', 0, 0, 'UNAVAILABLE', 'K_C', new TextEncoder().encode('C'),)],
+ [''],
+ [''],
+ ['c WARNING: unavailable modifier : here: ']],
+
+ [[new Rule("C2", '', '', 0, 0, 'UNAVAILABLE_dk', 'K_EQUAL', 0, 0, 'UNAVAILABLE', 'K_C', new TextEncoder().encode('C'),)],
+ [''],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable modifier : here: ']],
+
+ [[new Rule("C3", 'UNAVAILABLE_prev_dk', 'K_D', 0, 0, 'UNAVAILABLE_dk', 'K_EQUAL', 0, 0, 'SHIFT', 'K_C', new TextEncoder().encode('D'),)],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable superior rule ( [UNAVAILABLE_dk K_EQUAL] > dk(B0) ) : here: ']],
+
+ [[new Rule("C3", 'UNAVAILABLE_prev_dk', 'K_D', 0, 0, 'UNAVAILABLE_dk', 'K_EQUAL', 0, 0, 'UNAVAIL', 'K_C', new TextEncoder().encode('D'),)],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable modifier : here: ']],
+
+ [[new Rule("C3", 'CAPS', 'K_D', 0, 0, 'RALT', 'K_EQUAL', 0, 0, 'SHIFT', 'K_C', new TextEncoder().encode('D'),)],
+ [''],
+ [''],
+ ['']],
+
+ [[new Rule("C3", 'X', 'K_X', 0, 0, 'Y', 'K_Y', 0, 0, 'SHIFT', 'K_Z', new TextEncoder().encode('D'),)],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable modifier : here: '],
+ ['c WARNING: unavailable superior rule ( [Y K_Y] > dk(B0) ) : here: ']],
+
+ ].forEach(function (values: any, index: number) {
+ it(('rule " ' + values[0][0].rule_type + ' "') + 'should create "' + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () {
+ const result: string[] = sut_w.reviewRules(values[0], 0);
+ assert.equal(result[0], values[1][0]);
+ assert.equal(result[1], values[2][0]);
+ assert.equal(result[2], values[3][0]);
+ });
+ });
+ });
+
+ describe('reviewRules messages duplicate and ambiguous', function () {
+
+ const sut_w = new KmnFileWriter(compilerTestCallbacks, compilerTestOptions);
+ [
+ //all
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),],
+ ['c WARNING: duplicate rule: earlier: [LALT K_A] > dk(C0) here: '],
+ ["c WARNING: duplicate rule: earlier: dk(B0) + [SHIFT K_B] > dk(B0) here: "],
+ ["c WARNING: duplicate rule: earlier: dk(B0) + [CAPS K_C] > 'X' here: "]],
+
+ //6-6 dup
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'CTRL', 'K_D', 0, 0, 'NCAPS', 'K_E', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),],
+ [''],
+ [""],
+ ["c WARNING: duplicate rule: earlier: dk(B0) + [CAPS K_C] > 'X' here: "]],
+
+ //6-6 amb
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'CTRL', 'K_D', 0, 0, 'NCAPS', 'K_E', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('Y')),],
+ [''],
+ [""],
+ ["c WARNING: ambiguous rule: earlier: dk(B0) + [CAPS K_C] > 'X' here: "]],
+
+ // 5-5 amb
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'NCAPS', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'NCAPS', 'K_B', 0, 1, 'RALT', 'K_F', new TextEncoder().encode('X')),],
+ ['c WARNING: duplicate rule: earlier: [LALT K_A] > dk(C0) here: '],
+ ["c WARNING: ambiguous rule: earlier: dk(B0) + [NCAPS K_B] > dk(B0) here: "], [''],
+ ],
+
+ // 5-5 dup
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'NCAPS', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'NCAPS', 'K_B', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('X')),],
+ ['c WARNING: duplicate rule: earlier: [LALT K_A] > dk(C0) here: '],
+ ["c WARNING: duplicate rule: earlier: dk(B0) + [NCAPS K_B] > dk(B0) here: "],
+ ['']],
+
+ // 4-2 amb
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'LALT', 'K_A', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('X')),],
+ ['c WARNING: ambiguous rule: later: [LALT K_A] > dk(C0) here: '],
+ [''],
+ ['']],
+
+ // 4-4 amb
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'LALT', 'K_A', 1, 1, 'NCAPS', 'K_E', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('Y')),],
+ ['c WARNING: ambiguous rule: earlier: [LALT K_A] > dk(C0) here: '],
+ [""],
+ [''],],
+
+ // 4-4 dup
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'NCAPS', 'K_E', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('X')),],
+ ['c WARNING: duplicate rule: earlier: [LALT K_A] > dk(C0) here: '],
+ [''],
+ ['']],
+
+ // 4-2 amb
+ [[
+ new Rule("C3", 'LALT', 'K_A', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'LALT', 'K_A', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('Y')),],
+ ['c WARNING: ambiguous rule: later: [LALT K_A] > dk(C0) here: '],
+ [''],
+ ['']],
+
+ // 6-3 dup
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'CTRL', 'K_D', 0, 0, 'NCAPS', 'K_E', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),],
+ [''],
+ ["c WARNING: duplicate rule: earlier: dk(C0) + [CAPS K_C] > 'X' here: "],
+ [''],],
+
+ // 6-3 amb
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'CTRL', 'K_D', 0, 0, 'NCAPS', 'K_E', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('Y')),],
+ [''],
+ ["c WARNING: ambiguous rule: earlier: dk(C0) + [CAPS K_C] > 'X' here: "],
+ [''],],
+
+ // 2-4 amb
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C3", 'SHIFT', 'K_B', 0, 0, 'NCAPS', 'K_E', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('Y')),],
+ ['c WARNING: ambiguous rule: earlier: [SHIFT K_B] > dk(A0) here: '],
+ [''],
+ ['']],
+
+ //2-2 amb
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 1, 1, 'RALT', 'K_F', new TextEncoder().encode('Y')),],
+ [''],
+ ['c WARNING: ambiguous rule: earlier: [SHIFT K_B] > dk(C0) here: '],
+ ['']],
+
+ // 2-2 dup
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'RALT', 'K_F', new TextEncoder().encode('Y')),],
+ [''],
+ ['c WARNING: duplicate rule: earlier: [SHIFT K_B] > dk(C0) here: '],
+ ['']],
+
+ // 3-3 dup
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'NCAPS', 'K_E', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),],
+ [''],
+ [''],
+ ["c WARNING: duplicate rule: earlier: dk(A0) + [CAPS K_C] > 'X' here: "]],
+
+ // 3-3 amb
+ [[
+ new Rule("C2", '', '', 0, 0, 'SHIFT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'NCAPS', 'K_E', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('Y')),],
+ [''],
+ [''],
+ ["c WARNING: ambiguous rule: earlier: dk(A0) + [CAPS K_C] > 'X' here: "]],
+
+ // 2-1 amb
+ [[
+ new Rule("C2", '', '', 0, 0, 'RALT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'RALT', 'K_B', new TextEncoder().encode('Y'))],
+ [''],
+ [''],
+ ['c WARNING: ambiguous rule: later: [RALT K_B] > dk(A0) here: ']],
+
+ // 1-1 amb
+ [[
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('Y'))],
+ [''],
+ [''],
+ ["c WARNING: ambiguous rule: earlier: [CAPS K_C] > 'X' here: "]],
+
+ // 1-1 amb
+ [[
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('X'))],
+ [''],
+ [''],
+ ["c WARNING: duplicate rule: earlier: [CAPS K_C] > 'X' here: "]],
+
+ ].forEach(function (values: any, index: number) {
+ it('rule ' + values[0][0].rule_type + ' should create " ' + ' "' + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () {
+ const result: string[] = sut_w.reviewRules(values[0], 1);
+ assert.equal(result[0], values[1][0]);
+ assert.equal(result[1], values[2][0]);
+ assert.equal(result[2], values[3][0]);
+ });
+ });
+ });
+
+ describe('reviewRules messages duplicate and ambiguous with Extra warning', function () {
+ const sut_w = new KmnFileWriter(compilerTestCallbacks, compilerTestOptions);
+ [[[
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'RALT', 'K_B', new TextEncoder().encode('X')),
+ new Rule("C2", '', '', 0, 0, 'RALT', 'K_B', 0, 0, 'CAPS', 'K_C', new TextEncoder().encode('Y')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'RALT', 'K_B', new TextEncoder().encode('Z'))
+ ],
+ [''],
+ [''],
+ ["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: any, index: number) {
+ it(('rule ' + values[0][0].rule_type + ' should create " ' + ' "') + values[1] + ' | ' + values[2] + ' | ' + values[3] + '"', async function () {
+ const result: string[] = sut_w.reviewRules(values[0], 2);
+ assert.equal(result[0], values[1][0]);
+ assert.equal(result[1], values[2][0]);
+ assert.equal(result[2], values[3][0]);
+ });
+ });
+ });
+
+ describe('write from intermediate data array', function () {
+ const sut_w = new KmnFileWriter(compilerTestCallbacks, compilerTestOptions);
+ [
+ [
+ [ /* see ../data/Test_C0.keylayout */
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'NCAPS', 'K_A', new TextEncoder().encode('a')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_A', new TextEncoder().encode('A')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'NCAPS', 'K_S', new TextEncoder().encode('s')),
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'NCAPS', 'K_D', new TextEncoder().encode('d'))
+ ],
+ ["+ [NCAPS K_A] > 'a'\n" +
+ "+ [CAPS K_A] > 'A'\n\n" +
+ "+ [NCAPS K_S] > 's'\n\n" +
+ "+ [NCAPS K_D] > 'd'\n"]
+ ],
+ [
+ [ /* see ../data/Test_C1.keylayout */
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'NCAPS', 'K_S', new TextEncoder().encode('s')),
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_S', new TextEncoder().encode('S'))
+ ],
+ ["+ [NCAPS K_S] > 's'\n" +
+ "+ [CAPS K_S] > 'S'\n"]
+ ],
+ [
+ [ /* see ../data/Test_C2.keylayout */
+ new Rule("C2", '', '', 0, 0, 'NCAPS', 'K_U', 1, 1, 'CAPS', 'K_A', new TextEncoder().encode('Â'))
+ ],
+ ["+ [NCAPS K_U] > dk(A1)\n" +
+ "dk(A1) + [CAPS K_A] > 'Â'\n\n"]
+ ],
+ [
+ [ /* see ../data/Test_C3.keylayout */
+ new Rule("C3", 'NCAPS SHIFT', 'K_D', 2, 1, 'NCAPS', 'K_U', 1, 2, 'CAPS', 'K_A', new TextEncoder().encode('Â'))
+ ],
+ ["+ [NCAPS SHIFT K_D] > dk(A2)\n" +
+ "dk(A2) + [NCAPS K_U] > dk(B1)\n" +
+ "dk(B1) + [CAPS K_A] > 'Â'\n\n"
+ ]
+ ],
+ [
+ [ /* see ../data/Test_C0_C1_C2_C3.keylayout */
+ new Rule("C0", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_A', new TextEncoder().encode('A')),
+ new Rule("C2", '', '', 0, 0, 'NCAPS RALT', 'K_EQUAL', 1, 1, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_S', new TextEncoder().encode('S')),
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'NCAPS RALT', 'K_U', new TextEncoder().encode('S')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 1, 'CAPS', 'K_S', 2, 6, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'CAPS', 'K_U', 3, 3, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'NCAPS RALT', 'K_S', 4, 4, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'NCAPS RALT', 'K_U', 5, 5, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_S', new TextEncoder().encode('S')),
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'NCAPS RALT', 'K_U', new TextEncoder().encode('S')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'CAPS', 'K_S', 2, 0, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'CAPS', 'K_U', 3, 0, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'NCAPS RALT', 'K_S', 4, 0, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 6, 0, 'NCAPS RALT', 'K_U', 5, 0, 'CAPS', 'K_D', new TextEncoder().encode('Â')),
+ new Rule("C1", '', '', 0, 0, '', '', 0, 0, 'CAPS', 'K_U', new TextEncoder().encode('U')),
+ ],
+ ["+ [CAPS K_A] > 'A'\n" +
+ "+ [CAPS K_S] > 'S'\n\n" +
+ "+ [NCAPS RALT K_U] > 'S'\n" +
+ "+ [CAPS K_U] > 'U'\n" +
+ "+ [NCAPS RALT K_EQUAL] > dk(A1)\n" +
+ "dk(A1) + [CAPS K_D] > 'Â'\n\n" +
+ "+ [NCAPS RALT K_8] > dk(A6)\n" +
+ "dk(A6) + [CAPS K_S] > dk(B2)\n" +
+ "dk(B2) + [CAPS K_D] > 'Â'\n\n" +
+ "dk(A6) + [CAPS K_U] > dk(B3)\n" +
+ "dk(B3) + [CAPS K_D] > 'Â'\n\n" +
+ "dk(A6) + [NCAPS RALT K_S] > dk(B4)\n" +
+ "dk(B4) + [CAPS K_D] > 'Â'\n\n" +
+ "dk(A6) + [NCAPS RALT K_U] > dk(B5)\n" +
+ "dk(B5) + [CAPS K_D] > 'Â'\n\n"]
+ ],
+ [
+ [ /* see ../data/Test_C3_several.keylayout */
+ new Rule("C3", 'NCAPS RALT', 'K_8', 3, 1, 'CAPS', 'K_U', 1, 3, 'NCAPS', 'K_A', new TextEncoder().encode('â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 3, 0, 'CAPS', 'K_U', 1, 0, 'NCAPS RALT', 'K_A', new TextEncoder().encode('â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 3, 0, 'NCAPS RALT', 'K_U', 2, 2, 'NCAPS', 'K_A', new TextEncoder().encode('â')),
+ new Rule("C3", 'NCAPS RALT', 'K_8', 3, 0, 'NCAPS RALT', 'K_U', 2, 0, 'NCAPS RALT', 'K_A', new TextEncoder().encode('â'))
+ ],
+ ["+ [NCAPS RALT K_8] > dk(A3)\n" +
+ "dk(A3) + [CAPS K_U] > dk(B1)\n" +
+ "dk(B1) + [NCAPS K_A] > 'â'\n\n" +
+ "dk(B1) + [NCAPS RALT K_A] > 'â'\n\n" +
+ "dk(A3) + [NCAPS RALT K_U] > dk(B2)\n" +
+ "dk(B2) + [NCAPS K_A] > 'â'\n\n" +
+ "dk(B2) + [NCAPS RALT K_A] > 'â'\n\n"
+ ]
+ ],
+ ].forEach(function (values: any) {
+ it(('an array of Rules should create a set of kmn rules '), async function () {
+ const data: ProcesData = {
+ keylayout_filename: "",
+ kmn_filename: "",
+ arrayOf_Modifiers: [[]],
+ arrayOf_Rules: values[0]
+ };
+ const result1 = sut_w.writeData_Rules(data);
+ assert.isTrue(result1 === values[1][0]);
+ });
+ });
+ });
+
});