From ebb925c38e07dc50309beadfcdd11e67dacc8b68 Mon Sep 17 00:00:00 2001 From: Kirill Shumilov Date: Fri, 4 May 2018 19:32:13 +0300 Subject: [PATCH] feat(xod-tabtest, xod-arduino): add support of bytes in tabtests --- packages/xod-tabtest/src/TabData.re | 16 ++++++++++++++ packages/xod-tabtest/src/TabData.rei | 1 + packages/xod-tabtest/src/Tabtest.re | 1 + packages/xod-tabtest/src/XodProject/Pin.re | 2 ++ packages/xod-tabtest/src/XodProject/Pin.rei | 1 + packages/xod-tabtest/test/TabData_jest.re | 14 +++++++++--- .../xod/tabtest/capture-byte/patch.cpp | 9 ++++++++ .../xod/tabtest/capture-byte/patch.xodp | 22 +++++++++++++++++++ .../__lib__/xod/tabtest/inject-byte/patch.cpp | 7 ++++++ .../xod/tabtest/inject-byte/patch.xodp | 22 +++++++++++++++++++ .../xod/core/if-else(byte)/patch.test.tsv | 5 +++++ .../xod/core/if-else(number)/patch.test.tsv | 4 ++++ 12 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.cpp create mode 100644 packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.xodp create mode 100644 packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.cpp create mode 100644 packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.xodp create mode 100644 workspace/__lib__/xod/core/if-else(byte)/patch.test.tsv create mode 100644 workspace/__lib__/xod/core/if-else(number)/patch.test.tsv diff --git a/packages/xod-tabtest/src/TabData.re b/packages/xod-tabtest/src/TabData.re index 599f105d..e2cc593c 100644 --- a/packages/xod-tabtest/src/TabData.re +++ b/packages/xod-tabtest/src/TabData.re @@ -9,13 +9,27 @@ module Value = { | Number(float) | Boolean(bool) | String(string) + | Byte(int) | Invalid(string); let numberRegex = [%re {|/^[+-]?(?=.)*\d*(?:\.\d+)?$/|}]; let stringRegex = [%re {|/^".*"$/|}]; + let byteRegex = [%re {|/^[0-9a-f]{2}h|[0,1]{8}b|\d{1,3}d$/i|}]; let unquote = str => str |> Js.String.replaceByRe([%re "/^\"/"], "") |> Js.String.replaceByRe([%re "/\"$/"], ""); + let init = (str: string) : string => + String.sub(str, 0, String.length(str) - 1); + let byteStringToInt = str => + switch (str) { + | bin when Re.test(bin, [%re {|/b$/|}]) => + "0b" ++ init(bin) |. int_of_string |. (x => Byte(x)) + | hex when Re.test(hex, [%re {|/h$/|}]) => + "0x" ++ init(hex) |. int_of_string |. (x => Byte(x)) + | dec when Re.test(dec, [%re {|/d$/|}]) => + init(dec) |. int_of_string |. (x => Byte(x)) + | x => Invalid(x) + }; let parse = str => switch (str) { | "" => Empty @@ -26,6 +40,8 @@ module Value = { Number(Js.Float.fromString(numString)) | quotedString when Re.test(quotedString, stringRegex) => String(unquote(quotedString)) + | byteString when Re.test(byteString, byteRegex) => + byteStringToInt(byteString) | x => Invalid(x) }; }; diff --git a/packages/xod-tabtest/src/TabData.rei b/packages/xod-tabtest/src/TabData.rei index 432b5daf..7514526c 100644 --- a/packages/xod-tabtest/src/TabData.rei +++ b/packages/xod-tabtest/src/TabData.rei @@ -16,6 +16,7 @@ module Value: { | Number(float) | Boolean(bool) | String(string) + | Byte(int) | Invalid(string); }; diff --git a/packages/xod-tabtest/src/Tabtest.re b/packages/xod-tabtest/src/Tabtest.re index dcf0ba86..3cde6440 100644 --- a/packages/xod-tabtest/src/Tabtest.re +++ b/packages/xod-tabtest/src/Tabtest.re @@ -31,6 +31,7 @@ module Probe = { | Pulse => "pulse" | Boolean => "boolean" | Number => "number" + | Byte => "byte" | String => "string" } ); diff --git a/packages/xod-tabtest/src/XodProject/Pin.re b/packages/xod-tabtest/src/XodProject/Pin.re index 5fdb6243..4ba2873d 100644 --- a/packages/xod-tabtest/src/XodProject/Pin.re +++ b/packages/xod-tabtest/src/XodProject/Pin.re @@ -18,6 +18,7 @@ type dataType = | Pulse | Boolean | Number + | Byte | String; type direction = @@ -50,6 +51,7 @@ let getType = (pin: t) : dataType => { | "pulse" => Pulse | "boolean" => Boolean | "number" => Number + | "byte" => Byte | "string" => String | _ => Js.Exn.raiseTypeError( diff --git a/packages/xod-tabtest/src/XodProject/Pin.rei b/packages/xod-tabtest/src/XodProject/Pin.rei index ee9d6311..f65a6eeb 100644 --- a/packages/xod-tabtest/src/XodProject/Pin.rei +++ b/packages/xod-tabtest/src/XodProject/Pin.rei @@ -10,6 +10,7 @@ type dataType = | Pulse | Boolean | Number + | Byte | String; let getDirection: t => direction; diff --git a/packages/xod-tabtest/test/TabData_jest.re b/packages/xod-tabtest/test/TabData_jest.re index ee106c64..bd8190ac 100644 --- a/packages/xod-tabtest/test/TabData_jest.re +++ b/packages/xod-tabtest/test/TabData_jest.re @@ -48,17 +48,25 @@ describe("TSV parser", () => { }); test("recognizes types", () => { let tsv = - "Number\tBoolean\tString\n" - ++ "+.5\ttrue\t\"Hello\"\n" - ++ "1.3\tfalse\t\"Some \"quoted\" string\""; + "Number\tBoolean\tByte\tString\n" + ++ "+.5\ttrue\t00h\t\"Hello\"\n" + ++ "-42\ttrue\t00001101b\t\"World\"\n" + ++ "1.3\tfalse\t255d\t\"Some \"quoted\" string\""; let expected: TabData.t = [ Map.String.empty |. Map.String.set("Number", Number(0.5)) |. Map.String.set("Boolean", Boolean(true)) + |. Map.String.set("Byte", Byte(0)) |. Map.String.set("String", String("Hello")), Map.String.empty + |. Map.String.set("Number", Number(-42.0)) + |. Map.String.set("Boolean", Boolean(true)) + |. Map.String.set("Byte", Byte(13)) + |. Map.String.set("String", String("World")), + Map.String.empty |. Map.String.set("Number", Number(1.3)) |. Map.String.set("Boolean", Boolean(false)) + |. Map.String.set("Byte", Byte(255)) |. Map.String.set("String", String({|Some "quoted" string|})), ]; expect(TabData.parse(tsv)) |> toEqual(expected); diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.cpp new file mode 100644 index 00000000..861dfe4a --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.cpp @@ -0,0 +1,9 @@ +struct State { + Number lastValue; +}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + getState(ctx)->lastValue = getValue(ctx); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.xodp new file mode 100644 index 00000000..c77c2d1f --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/capture-byte/patch.xodp @@ -0,0 +1,22 @@ +{ + "description": "Capturing probe for tabular test framework", + "nodes": [ + { + "id": "B1iYZOzoZ", + "position": { + "x": 34, + "y": 102 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + }, + { + "id": "HkXK-dGob", + "label": "VAL", + "position": { + "x": 34, + "y": 0 + }, + "type": "xod/patch-nodes/input-byte" + } + ] +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.cpp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.cpp new file mode 100644 index 00000000..76ac39cf --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.cpp @@ -0,0 +1,7 @@ +struct State {}; + +{{ GENERATED_CODE }} + +void evaluate(Context ctx) { + emitValue(ctx, getValue(ctx)); +} diff --git a/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.xodp b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.xodp new file mode 100644 index 00000000..6e8fa940 --- /dev/null +++ b/packages/xod-tabtest/workspace/__lib__/xod/tabtest/inject-byte/patch.xodp @@ -0,0 +1,22 @@ +{ + "nodes": [ + { + "boundLiterals": {}, + "id": "B1x2RV3eZ", + "label": "VAL", + "position": { + "x": 10, + "y": 120 + }, + "type": "xod/patch-nodes/output-byte" + }, + { + "id": "H1PnRN2lW", + "position": { + "x": 10, + "y": 16 + }, + "type": "xod/patch-nodes/not-implemented-in-xod" + } + ] +} diff --git a/workspace/__lib__/xod/core/if-else(byte)/patch.test.tsv b/workspace/__lib__/xod/core/if-else(byte)/patch.test.tsv new file mode 100644 index 00000000..bd999cfe --- /dev/null +++ b/workspace/__lib__/xod/core/if-else(byte)/patch.test.tsv @@ -0,0 +1,5 @@ +COND T F R +false 00h FFh FFh +true 00h FFh 00h +false 32d 42d 42d +true 00001101b 01001100b 00001101b diff --git a/workspace/__lib__/xod/core/if-else(number)/patch.test.tsv b/workspace/__lib__/xod/core/if-else(number)/patch.test.tsv new file mode 100644 index 00000000..656a5867 --- /dev/null +++ b/workspace/__lib__/xod/core/if-else(number)/patch.test.tsv @@ -0,0 +1,4 @@ +COND T F R +false 0.5 1.25 1.25 +false 10 20 20 +true 10 20 10