From 589822a8c2643426da87f5f44f8a79da679908e8 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 28 Oct 2024 17:24:15 +0200 Subject: [PATCH] tbel_test_doc: add Helper functions: pad, numberToRadixString, parseHex, parseBytes --- .../service/script/TbelInvokeDocsIoTest.java | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) diff --git a/application/src/test/java/org/thingsboard/server/service/script/TbelInvokeDocsIoTest.java b/application/src/test/java/org/thingsboard/server/service/script/TbelInvokeDocsIoTest.java index a519fa1cd7..9a621bbc14 100644 --- a/application/src/test/java/org/thingsboard/server/service/script/TbelInvokeDocsIoTest.java +++ b/application/src/test/java/org/thingsboard/server/service/script/TbelInvokeDocsIoTest.java @@ -1203,6 +1203,7 @@ class TbelInvokeDocsIoTest extends AbstractTbelInvokeTest { invokeScript(evalScript(decoderStr), msgStr); }).hasMessageContaining(message); } + @Test public void printUnsignedBytes_Test() throws ExecutionException, InterruptedException { msgStr = "{}"; @@ -1224,6 +1225,249 @@ class TbelInvokeDocsIoTest extends AbstractTbelInvokeTest { assertEquals(expected, actual); } + @Test + public void pad_Test() throws ExecutionException, InterruptedException { + msgStr = "{}"; + // padStart + decoderStr = """ + var str1 = "010011"; + var str2 ="1001010011"; + var fullNumber = "203439900FFCD5581"; + var last4Digits = fullNumber.substring(11); + return { + padStart1: padStart(str1, 8, '0'), + padStart2: padStart(str2, 8, '0'), + padStart16: padStart(str2, 16, '*'), + padStartFullNumber: padStart(last4Digits, fullNumber.length(), '*') + } + """; + LinkedHashMap expected = new LinkedHashMap<>(); + expected.put("padStart1", "00010011"); + expected.put("padStart2", "1001010011"); + expected.put("padStart16", "******1001010011"); + expected.put("padStartFullNumber", "***********CD5581"); + Object actual = invokeScript(evalScript(decoderStr), msgStr); + assertEquals(expected, actual); + // padEnd + decoderStr = """ + var str1 = "010011"; + var str2 ="1001010011"; + var fullNumber = "203439900FFCD5581"; + var last4Digits = fullNumber.substring(0, 11); + return { + padEnd1: padEnd(str1, 8, '0'), + padEnd2: padEnd(str2, 8, '0'), + padEnd16: padEnd(str2, 16, '*'), + padEndFullNumber: padEnd(last4Digits, fullNumber.length(), '*') + } + """; + expected = new LinkedHashMap<>(); + expected.put("padEnd1", "01001100"); + expected.put("padEnd2", "1001010011"); + expected.put("padEnd16", "1001010011******"); + expected.put("padEndFullNumber", "203439900FF******"); + actual = invokeScript(evalScript(decoderStr), msgStr); + assertEquals(expected, actual); + } + + @Test + public void numberToRadixStringIntLongFloatDouble_Test() throws ExecutionException, InterruptedException { + msgStr = "{}"; + decoderStr = """ + var i = 0x7FFFFFFF; + return { + "intToHex1": intToHex(i, true, true), + "intToHex2": intToHex(171, true, false), + "intToHex3": intToHex(0xABCDEF, false, true, 4), + "intToHex4": intToHex(0xABCD, false, false, 2), + "longToHex1": longToHex(9223372036854775807, true, true), + "longToHex2": longToHex(0x7A12BCD3, true, true, 4), + "longToHex3": longToHex(0x7A12BCD3, false, false, 4), + "floatToHex1": floatToHex(123456789.00), + "floatToHex2": floatToHex(123456789.00, false), + "doubleToHex1": doubleToHex(1729.1729d), + "doubleToHex2": doubleToHex(1729.1729d, false) + } + """; + LinkedHashMap expected = new LinkedHashMap<>(); + expected.put("intToHex1", "0x7FFFFFFF"); + expected.put("intToHex2", "AB"); + expected.put("intToHex3", "0xCDAB"); + expected.put("intToHex4", "AB"); + expected.put("longToHex1", "0x7FFFFFFFFFFFFFFF"); + expected.put("longToHex2", "0xBCD3"); + expected.put("longToHex3", "127A"); + expected.put("floatToHex1", "0x4CEB79A3"); + expected.put("floatToHex2", "0xA379EB4C"); + expected.put("doubleToHex1", "0x409B04B10CB295EA"); + expected.put("doubleToHex2", "0xEA95B20CB1049B40"); + Object actual = invokeScript(evalScript(decoderStr), msgStr); + assertEquals(expected, actual); + } + + @Test + public void intLongToRadixString_Test() throws ExecutionException, InterruptedException { + msgStr = "{}"; + decoderStr = """ + return { + "bin1": intLongToRadixString(58, 2), + "bin2": intLongToRadixString(9223372036854775807, 2), + "octal1": intLongToRadixString(13158, 8), + "octal2": intLongToRadixString(-13158, 8), + "decimal": intLongToRadixString(-13158, 10), + "hexDecimal1": intLongToRadixString(13158, 16), + "hexDecimal2": intLongToRadixString(-13158, 16), + "hexDecimal3": intLongToRadixString(9223372036854775807, 16), + "hexDecimal4": intLongToRadixString(-13158, 16, true, true) + } + """; + LinkedHashMap expected = new LinkedHashMap<>(); + expected.put("bin1", "00111010"); + expected.put("bin2", "0111111111111111111111111111111111111111111111111111111111111111"); + expected.put("octal1", "31546"); + expected.put("octal2", "1777777777777777746232"); + expected.put("decimal", "-13158"); + expected.put("hexDecimal1", "3366"); + expected.put("hexDecimal2", "FFCC9A"); + expected.put("hexDecimal3", "7FFFFFFFFFFFFFFF"); + expected.put("hexDecimal4", "0xFFCC9A"); + Object actual = invokeScript(evalScript(decoderStr), msgStr); + assertEquals(expected, actual); + } + + @Test + public void parseHex_Test() throws ExecutionException, InterruptedException { + msgStr = "{}"; + decoderStr = """ + return { + "hexToInt1": parseHexToInt("BBAA"), + "hexToInt2": parseHexToInt("BBAA", true), + "hexToInt3": parseHexToInt("AABB", false), + "hexToInt4": parseHexToInt("BBAA", false), + "hexToFloat1": parseHexToFloat("41EA62CC"), + "hexToFloat2": parseHexToFloat("41EA62CC", true), + "hexToFloat3": parseHexToFloat("41EA62CC", false), + "hexToFloat4": parseHexToFloat("CC62EA41", false), + "hexIntLongToFloat1": parseHexIntLongToFloat("0x0A", true), + "hexIntLongToFloat2": parseHexIntLongToFloat("0x0A", false), + "hexIntLongToFloat3": parseHexIntLongToFloat("0x00000A", true), + "hexIntLongToFloat4": parseHexIntLongToFloat("0x0A0000", false), + "hexIntLongToFloat5": parseHexIntLongToFloat("0x000A0A", true), + "hexIntLongToFloat6": parseHexIntLongToFloat("0x0A0A00", false), + "hexToDouble1": parseHexToDouble("409B04B10CB295EA"), + "hexToDouble2": parseHexToDouble("409B04B10CB295EA", false), + "hexToDouble3": parseHexToDouble("409B04B10CB295EA", true), + "hexToDouble4": parseHexToDouble("EA95B20CB1049B40", false) + } + """; + LinkedHashMap expected = new LinkedHashMap<>(); + expected.put("hexToInt1", 48042); + expected.put("hexToInt2", 48042); + expected.put("hexToInt3", 48042); + expected.put("hexToInt4", 43707); + expected.put("hexToFloat1", 29.29824f); + expected.put("hexToFloat2", 29.29824f); + expected.put("hexToFloat3", -5.948442E7f); + expected.put("hexToFloat4", 29.29824f); + expected.put("hexIntLongToFloat1", 10.0f); + expected.put("hexIntLongToFloat2", 10.0f); + expected.put("hexIntLongToFloat3", 10.0f); + expected.put("hexIntLongToFloat4", 10.0f); + expected.put("hexIntLongToFloat5", 2570.0f); + expected.put("hexIntLongToFloat6", 2570.0f); + expected.put("hexToDouble1", 1729.1729); + expected.put("hexToDouble2", -2.7208640774822924E205); + expected.put("hexToDouble3", 1729.1729); + expected.put("hexToDouble4", 1729.1729); + Object actual = invokeScript(evalScript(decoderStr), msgStr); + assertEquals(expected, actual); + } + + @Test + public void parseBytes_Test() throws ExecutionException, InterruptedException { + byte[] bytesExecutionArrayList = new byte[]{(byte) 0xAA, (byte) 0xBB, (byte) 0xCC, (byte) 0xDD}; + msgStr = "{}"; + decoderStr = """ + var bytes = [0xBB, 0xAA]; + var list = [-69, 83]; + var intValByte = [0xAA, 0xBB, 0xCC, 0xDD]; + var longValByte = [64, -101, 4, -79, 12, -78, -107, -22]; + var bytesFloat = [0x0A]; + var floatValByte = [0x41, 0xEA, 0x62, 0xCC]; + var floatValList = [65, -22, 98, -52]; + var intValByteFromInt = [0x00, 0x00, 0x00, 0x0A]; + var dataAT101 = "0x01756403671B01048836BF7701F000090722050000"; + var byteAT101 = hexToBytes(dataAT101); + var offsetLatInt = 9; + var coordinatesAsHex = "0x32D009423F23B300B0106E08D96B6C00"; + var coordinatesasBytes = hexToBytes(coordinatesAsHex); + var offsetLatLong = 0; + var factor = 1e15; + var bytesExecutionArrayList = [0xAA, 0xBB, 0xCC, 0xDD]; + return { + "bytesToHex1": bytesToHex(bytes), + "bytesToHex2": bytesToHex(list), + "bytesToInt1": parseBytesToInt(intValByte, 0, 3), + "bytesToInt2": parseBytesToInt(intValByte, 0, 3, true), + "bytesToInt3": parseBytesToInt(intValByte, 0, 3, false), + "bytesToLong1": parseBytesToLong(longValByte, 0, 8), + "bytesToLong2": parseBytesToLong(longValByte, 0, 8, false), + "bytesToFloat1": parseBytesToFloat(bytesFloat), + "bytesToFloat2": parseBytesToFloat(floatValByte, 0), + "bytesToFloat3": parseBytesToFloat(floatValByte, 0, 2, false), + "bytesToFloat4": parseBytesToFloat(floatValByte, 0, 2, true), + "bytesToFloat5": parseBytesToFloat(floatValByte, 0, 3, false), + "bytesToFloat6": parseBytesToFloat(floatValByte, 0, 3, true), + "bytesToFloat7": parseBytesToFloat(floatValByte, 0, 4, false), + "bytesToFloat8": parseBytesToFloat(floatValList, 0), + "bytesToFloat9": parseBytesToFloat(floatValList, 0, 4, false), + "bytesIntToFloat1": parseBytesIntToFloat(intValByteFromInt, 3, 1, true), + "bytesIntToFloat2": parseBytesIntToFloat(intValByteFromInt, 3, 1, false), + "bytesIntToFloat3": parseBytesIntToFloat(intValByteFromInt, 2, 2, true), + "bytesIntToFloat4": parseBytesIntToFloat(intValByteFromInt, 2, 2, false), + "bytesIntToFloat5": parseBytesIntToFloat(intValByteFromInt, 0, 4, true), + "bytesIntToFloat6": parseBytesIntToFloat(intValByteFromInt, 0, 4, false), + "bytesIntToFloat7": parseBytesIntToFloat(byteAT101, offsetLatInt, 4, false) / 1000000, + "bytesIntToFloat8": parseBytesIntToFloat(byteAT101, offsetLatInt + 4, 4, false) / 1000000, + "bytesLongToDouble1": parseBytesLongToDouble(coordinatesasBytes, offsetLatLong, 8, false) / factor, + "bytesLongToDouble2": parseBytesLongToDouble(coordinatesasBytes, offsetLatLong + 8, 8, false) / factor, + "bytesLongToExecutionArrayList": bytesToExecutionArrayList(bytesExecutionArrayList) + + } + """; + LinkedHashMap expected = new LinkedHashMap<>(); + expected.put("bytesToHex1", "BBAA"); + expected.put("bytesToHex2", "BB53"); + expected.put("bytesToInt1", 11189196); + expected.put("bytesToInt2", 11189196); + expected.put("bytesToInt3", 13417386); + expected.put("bytesToLong1", 4655319798286292458L); + expected.put("bytesToLong2", -1543131529725306048L); + expected.put("bytesToFloat1", 1.4E-44f); + expected.put("bytesToFloat2", 29.29824f); + expected.put("bytesToFloat3", 8.4034E-41f); + expected.put("bytesToFloat4", 2.3646E-41f); + expected.put("bytesToFloat5", 9.083913E-39f); + expected.put("bytesToFloat6", 6.053388E-39f); + expected.put("bytesToFloat7", -5.948442E7f); + expected.put("bytesToFloat8", 29.29824f); + expected.put("bytesToFloat9", -5.948442E7f); + expected.put("bytesIntToFloat1", 10.0f); + expected.put("bytesIntToFloat2", 10.0f); + expected.put("bytesIntToFloat3", 10.0f); + expected.put("bytesIntToFloat4", 2560.0f); + expected.put("bytesIntToFloat5", 10.0f); + expected.put("bytesIntToFloat6", 1.6777216E8f); + expected.put("bytesIntToFloat7", 24.62495f); + expected.put("bytesIntToFloat8", 118.030576f); + expected.put("bytesLongToDouble1", 50.422775429058610d); + expected.put("bytesLongToDouble2", 30.517877378257072d); + expected.put("bytesLongToExecutionArrayList", bytesToList(bytesExecutionArrayList)); + Object actual = invokeScript(evalScript(decoderStr), msgStr); + assertEquals(expected, actual); + } + + // parseBinaryArray private List splice(List oldList, int start, int deleteCount, Object... values) { start = initStartIndex(oldList, start);