|
|
|
@ -1,12 +1,12 @@ |
|
|
|
/** |
|
|
|
* Copyright © 2016-2023 The Thingsboard Authors |
|
|
|
* |
|
|
|
* <p> |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
|
* You may obtain a copy of the License at |
|
|
|
* |
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
* |
|
|
|
* <p> |
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
* <p> |
|
|
|
* Unless required by applicable law or agreed to in writing, software |
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
|
|
@ -15,17 +15,50 @@ |
|
|
|
*/ |
|
|
|
package org.thingsboard.script.api.tbel; |
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.junit.After; |
|
|
|
import org.junit.Assert; |
|
|
|
import org.junit.Before; |
|
|
|
import org.junit.Test; |
|
|
|
import org.mvel2.ExecutionContext; |
|
|
|
import org.mvel2.ParserContext; |
|
|
|
import org.mvel2.SandboxedParserConfiguration; |
|
|
|
import org.mvel2.execution.ExecutionArrayList; |
|
|
|
import org.mvel2.execution.ExecutionHashMap; |
|
|
|
|
|
|
|
import java.nio.ByteBuffer; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.Calendar; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Random; |
|
|
|
|
|
|
|
@Slf4j |
|
|
|
|
|
|
|
public class TbUtilsTest { |
|
|
|
|
|
|
|
private ExecutionContext ctx; |
|
|
|
|
|
|
|
@Before |
|
|
|
public void before() { |
|
|
|
SandboxedParserConfiguration parserConfig = ParserContext.enableSandboxedMode(); |
|
|
|
parserConfig.addImport("JSON", TbJson.class); |
|
|
|
parserConfig.registerDataType("Date", TbDate.class, date -> 8L); |
|
|
|
parserConfig.registerDataType("Random", Random.class, date -> 8L); |
|
|
|
parserConfig.registerDataType("Calendar", Calendar.class, date -> 8L); |
|
|
|
try { |
|
|
|
TbUtils.register(parserConfig); |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("Cannot register functions", e); |
|
|
|
} |
|
|
|
ctx = new ExecutionContext(parserConfig); |
|
|
|
Assert.assertNotNull(ctx); |
|
|
|
} |
|
|
|
|
|
|
|
@After |
|
|
|
public void after() { |
|
|
|
ctx.stop(); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void parseHexToInt() { |
|
|
|
Assert.assertEquals(0xAB, TbUtils.parseHexToInt("AB")); |
|
|
|
@ -91,35 +124,35 @@ public class TbUtilsTest { |
|
|
|
|
|
|
|
@Test |
|
|
|
public void toFlatMap() { |
|
|
|
HashMap<String, Object> inputMap = new HashMap<>(); |
|
|
|
ExecutionHashMap<String, Object> inputMap = new ExecutionHashMap<>(16, ctx); |
|
|
|
inputMap.put("name", "Alice"); |
|
|
|
inputMap.put("age", 30); |
|
|
|
inputMap.put("devices", List.of( |
|
|
|
new HashMap<String, Object>() {{ |
|
|
|
inputMap.put("devices", new ExecutionArrayList<>(List.of( |
|
|
|
new ExecutionHashMap<>(16, ctx) {{ |
|
|
|
put("id", "dev001"); |
|
|
|
put("type", "sensor"); |
|
|
|
}}, |
|
|
|
new HashMap<String, Object>() {{ |
|
|
|
new ExecutionHashMap<>(16, ctx) {{ |
|
|
|
put("id", "dev002"); |
|
|
|
put("type", "actuator"); |
|
|
|
}} |
|
|
|
)); |
|
|
|
inputMap.put("settings", new HashMap<String, Object>() {{ |
|
|
|
), ctx)); |
|
|
|
inputMap.put("settings", new ExecutionHashMap<>(16, ctx) {{ |
|
|
|
put("notifications", true); |
|
|
|
put("timezone", "UTC-5"); |
|
|
|
put("params", new HashMap<String, Object>() {{ |
|
|
|
put("params", new ExecutionHashMap<>(16, ctx) {{ |
|
|
|
put("param1", "value1"); |
|
|
|
put("param2", "value2"); |
|
|
|
put("param3", new HashMap<String, Object>() {{ |
|
|
|
put("param3", new ExecutionHashMap<>(16, ctx) {{ |
|
|
|
put("subParam1", "value1"); |
|
|
|
put("subParam2", "value2"); |
|
|
|
}}); |
|
|
|
}}); |
|
|
|
}}); |
|
|
|
ExecutionArrayList<String> excludeList = new ExecutionArrayList<>(ctx); |
|
|
|
excludeList.addAll(List.of("age", "id", "param1", "subParam2")); |
|
|
|
|
|
|
|
List<String> excludeList = List.of("age", "id", "param1", "subParam2"); |
|
|
|
|
|
|
|
HashMap<String, Object> expectedMapWithPath = new HashMap<>(); |
|
|
|
ExecutionHashMap<String, Object> expectedMapWithPath = new ExecutionHashMap<>(16, ctx); |
|
|
|
expectedMapWithPath.put("name", "Alice"); |
|
|
|
expectedMapWithPath.put("devices.0.type", "sensor"); |
|
|
|
expectedMapWithPath.put("devices.1.type", "actuator"); |
|
|
|
@ -128,12 +161,11 @@ public class TbUtilsTest { |
|
|
|
expectedMapWithPath.put("settings.params.param2", "value2"); |
|
|
|
expectedMapWithPath.put("settings.params.param3.subParam1", "value1"); |
|
|
|
|
|
|
|
HashMap<String, Object> actualMapWithPaths = new HashMap<>(); |
|
|
|
TbUtils.toFlatMap(inputMap, actualMapWithPaths, excludeList, true); |
|
|
|
ExecutionHashMap<String, Object> actualMapWithPaths = TbUtils.toFlatMap(ctx, inputMap, excludeList, true); |
|
|
|
|
|
|
|
Assert.assertEquals(expectedMapWithPath, actualMapWithPaths); |
|
|
|
|
|
|
|
HashMap<String, Object> expectedMapWithoutPaths = new HashMap<>(); |
|
|
|
ExecutionHashMap<String, Object> expectedMapWithoutPaths = new ExecutionHashMap<>(16, ctx); |
|
|
|
expectedMapWithoutPaths.put("timezone", "UTC-5"); |
|
|
|
expectedMapWithoutPaths.put("name", "Alice"); |
|
|
|
expectedMapWithoutPaths.put("id", "dev002"); |
|
|
|
@ -145,14 +177,12 @@ public class TbUtilsTest { |
|
|
|
expectedMapWithoutPaths.put("age", 30); |
|
|
|
expectedMapWithoutPaths.put("param2", "value2"); |
|
|
|
|
|
|
|
HashMap<String, Object> actualMapWithoutPaths = new HashMap<>(); |
|
|
|
TbUtils.toFlatMap(inputMap, actualMapWithoutPaths, new ArrayList<>(), false); |
|
|
|
ExecutionHashMap<String, Object> actualMapWithoutPaths = TbUtils.toFlatMap(ctx, inputMap, false); |
|
|
|
|
|
|
|
Assert.assertEquals(expectedMapWithoutPaths, actualMapWithoutPaths); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static String keyToValue(String key, String extraSymbol) { |
|
|
|
return key + "Value" + (extraSymbol == null ? "" : extraSymbol); |
|
|
|
} |
|
|
|
|