Merge pull request #12804 from thingsboard/tbel_new_ver_Unmodif_FunctionDate

tbel_Unmodifiable
This commit is contained in:
Andrew Shvayka 2025-03-06 16:22:00 +02:00 committed by GitHub
commit 6e9a4234ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 200 additions and 4 deletions

View File

@ -21,6 +21,7 @@ import org.thingsboard.script.api.tbel.TbDate;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.Comparator;
@ -146,6 +147,31 @@ class TbelInvokeDocsIoTest extends AbstractTbelInvokeTest {
assertEquals(expected, actual);
}
@Test
public void mapsImplicitIterationWithoutEntrySet() throws ExecutionException, InterruptedException {
msgStr = msgMapStr;
decoderStr = """
foreach(element : msg){
if(element.getKey() == null){
return raiseError("Bad getKey");
}
if(element.key == null){
return raiseError("Bad key");
}
if(element.getValue() == null){
return raiseError("Bad getValue");
}
if(element.value == null){
return raiseError("Bad value");
}
}
return msg;
""";
LinkedHashMap<String, Object> expected = expectedMap;
Object actual = invokeScript(evalScript(decoderStr), msgStr);
assertEquals(expected, actual);
}
@Test
public void mapsGetInfoSize_Test() throws ExecutionException, InterruptedException {
msgStr = msgMapStr;
@ -660,14 +686,13 @@ class TbelInvokeDocsIoTest extends AbstractTbelInvokeTest {
""";
decoderStr = """
var list = msg.list;
var listAdd = ["thigsboard", 4, 67];
return {
list: list.clone(),
length: list.length(),
memorySize: list.memorySize(),
indOf1: list.indexOf("B", 1),
indOf2: list.indexOf(2, 2),
sStr: list.validateClazzInArrayIsOnlyString()
sStr: list.validateClazzInArrayIsOnlyNumber()
}
""";
ArrayList list = new ArrayList<>(List.of(67, 2, 2, 2));
@ -677,7 +702,7 @@ class TbelInvokeDocsIoTest extends AbstractTbelInvokeTest {
expected.put("memorySize", 32L);
expected.put("indOf1", -1);
expected.put("indOf2", 2);
expected.put("sStr", false);
expected.put("sStr", true);
Object actual = invokeScript(evalScript(decoderStr), msgStr);
assertEquals(expected, actual);
}
@ -2148,6 +2173,177 @@ class TbelInvokeDocsIoTest extends AbstractTbelInvokeTest {
assertEquals(expected, actual);
}
@Test
public void toUnmodifiableExecutionArrayList_Test() throws ExecutionException, InterruptedException {
msgStr = "{}";
decoderStr = String.format("""
var original = [];
original.add(0x35);
var unmodifiable = original.toUnmodifiable();
msg.result = unmodifiable;
return {msg: msg};
""");
LinkedHashMap<String, Object> expected = new LinkedHashMap<>();
List expectedList = Arrays.asList(0x35);
LinkedHashMap<String, Object> expectedResult = new LinkedHashMap<>();
expectedResult.put("result", expectedList);
expected.put("msg", expectedResult);
Object actual = invokeScript(evalScript(decoderStr), msgStr);
assertEquals(expected, actual);
decoderStr = String.format("""
var original = [];
original.add(0x67);
var unmodifiable = original.toUnmodifiable();
unmodifiable.add(0x35);
msg.result = unmodifiable;
return {msg: msg};
""");
assertThatThrownBy(() -> {
invokeScript(evalScript(decoderStr), msgStr);
}).hasMessageContaining("Error: unmodifiable.add(0x35): List is unmodifiable");
}
@Test
public void toUnmodifiableExecutionHashMap_Test() throws ExecutionException, InterruptedException {
msgStr = "{}";
decoderStr = String.format("""
var original = {};
original.putIfAbsent("entry1", 73);
var unmodifiable = original.toUnmodifiable();
msg.result = unmodifiable;
return {msg: msg};
""");
LinkedHashMap<String, Object> expected = new LinkedHashMap<>();
LinkedHashMap<String, Object> expectedMap = new LinkedHashMap<>(Map.of("entry1", 73));
LinkedHashMap<String, Object> expectedResult = new LinkedHashMap<>();
expectedResult.put("result", expectedMap);
expected.put("msg", expectedResult);
Object actual = invokeScript(evalScript(decoderStr), msgStr);
assertEquals(expected, actual);
decoderStr = String.format("""
var original = {};
original.humidity = 73;
var unmodifiable = original.toUnmodifiable();
unmodifiable.put("temperature1", 96);
msg.result = unmodifiable;
return {msg: msg};
""");
assertThatThrownBy(() -> {
invokeScript(evalScript(decoderStr), msgStr);
}).hasMessageContaining("Error: unmodifiable.put(\"temperature1\", 96): Map is unmodifiable");
}
@Test
public void tbDateFunction_Test() throws ExecutionException, InterruptedException {
String stringDateUTC = "2024-01-01T10:00:00.00Z";
TbDate d = new TbDate(stringDateUTC);
msgStr = "{}";
decoderStr = String.format("""
var d = new Date("%s"); // TZ => "UTC"
var dIsoY1 = d.toISOString(); // return 2024-01-01T10:00:00Z
d.addYears(1);
var dIsoY2 = d.toISOString(); // return 2025-01-01T10:00:00Z
d.addYears(-2);
var dIsoY3 = d.toISOString(); // return 2023-01-01T10:00:00Z
d.addMonths(2);
var dIsoM1 = d.toISOString(); // return 2023-03-01T10:00:00Z
d.addMonths(10);
var dIsoM2 = d.toISOString(); // return 2024-01-01T10:00:00Z
d.addMonths(-13);
var dIsoM3 = d.toISOString(); // return 2022-12-01T10:00:00Z
d.addWeeks(4);
var dIsoW1 = d.toISOString(); // return 2022-12-29T10:00:00Z
d.addWeeks(-5);
var dIsoW2 = d.toISOString(); // return 2022-11-24T10:00:00Z
d.addDays(6);
var dIsoD1 = d.toISOString(); // return 2022-11-30T10:00:00Z
d.addDays(45);
var dIsoD2 = d.toISOString(); // return 2023-01-14T10:00:00Z
d.addDays(-50);
var dIsoD3 = d.toISOString(); // return 2022-11-25T10:00:00Z
d.addHours(23);
var dIsoH1 = d.toISOString(); // return 2022-11-26T09:00:00Z
d.addHours(-47);
var dIsoH2 = d.toISOString(); // return 2022-11-24T10:00:00Z
d.addMinutes(59);
var dIsoMin1 = d.toISOString(); // return 2022-11-24T10:59:00Z
d.addMinutes(-60);
var dIsoMin2 = d.toISOString(); // return 2022-11-24T09:59:00Z
d.addSeconds(59);
var dIsoS1 = d.toISOString(); // return 2022-11-24T09:59:59Z
d.addSeconds(-60);
var dIsoS2 = d.toISOString(); // return 2022-11-24T09:58:59Z
d.addNanos(999999);
var dIsoN1 = d.toISOString(); // return 2022-11-24T09:58:59.000999999Z
d.addNanos(-1000000);
var dIsoN2 = d.toISOString(); // return 2022-11-24T09:58:58.999999999Z
return {
"dIsoY1": dIsoY1,
"dIsoY2": dIsoY2,
"dIsoY3": dIsoY3,
"dIsoM1": dIsoM1,
"dIsoM2": dIsoM2,
"dIsoM3": dIsoM3,
"dIsoW1": dIsoW1,
"dIsoW2": dIsoW2,
"dIsoD1": dIsoD1,
"dIsoD2": dIsoD2,
"dIsoD3": dIsoD3,
"dIsoH1": dIsoH1,
"dIsoH2": dIsoH2,
"dIsoMin1": dIsoMin1,
"dIsoMin2": dIsoMin2,
"dIsoS1": dIsoS1,
"dIsoS2": dIsoS2,
"dIsoN1": dIsoN1,
"dIsoN2": dIsoN2
}
""", stringDateUTC);
LinkedHashMap<String, Object> expected = new LinkedHashMap<>();
expected.put("dIsoY1", d.toISOString());
d.addYears(1);
expected.put("dIsoY2", d.toISOString());
d.addYears(-2);
expected.put("dIsoY3", d.toISOString());
d.addMonths(2);
expected.put("dIsoM1", d.toISOString());
d.addMonths(10);
expected.put("dIsoM2", d.toISOString());
d.addMonths(-13);
expected.put("dIsoM3", d.toISOString());
d.addWeeks(4);
expected.put("dIsoW1", d.toISOString());
d.addWeeks(-5);
expected.put("dIsoW2", d.toISOString());
d.addDays(6);
expected.put("dIsoD1", d.toISOString());
d.addDays(45);
expected.put("dIsoD2", d.toISOString());
d.addDays(-50);
expected.put("dIsoD3", d.toISOString());
d.addHours(23);
expected.put("dIsoH1", d.toISOString());
d.addHours(-47);
expected.put("dIsoH2", d.toISOString());
d.addMinutes(59);
expected.put("dIsoMin1", d.toISOString());
d.addMinutes(-60);
expected.put("dIsoMin2", d.toISOString());
d.addSeconds(59);
expected.put("dIsoS1", d.toISOString());
d.addSeconds(-60);
expected.put("dIsoS2", d.toISOString());
d.addNanos(999999);
expected.put("dIsoN1", d.toISOString());
d.addNanos(-1000000);
expected.put("dIsoN2", d.toISOString());
Object actual = invokeScript(evalScript(decoderStr), msgStr);
assertEquals(expected, actual);
}
private List splice(List oldList, int start, int deleteCount, Object... values) {
start = initStartIndex(oldList, start);

View File

@ -83,7 +83,7 @@
<zookeeper.version>3.9.2</zookeeper.version>
<protobuf.version>3.25.5</protobuf.version> <!-- A Major v4 does not support by the pubsub yet-->
<grpc.version>1.63.0</grpc.version>
<tbel.version>1.2.5</tbel.version>
<tbel.version>1.2.6</tbel.version>
<lombok.version>1.18.32</lombok.version>
<paho.client.version>1.2.5</paho.client.version>
<paho.mqttv5.client.version>1.2.5</paho.mqttv5.client.version>