Browse Source

Data binding: Stop evaluation of the data expression on transform function failure

Add additional unit tests.
Michael Ragazzon 3 years ago
parent
commit
d9ff0b1c65
3 changed files with 21 additions and 1 deletions
  1. 1 1
      Source/Core/DataExpression.cpp
  2. 18 0
      Tests/Source/UnitTests/DataExpression.cpp
  3. 2 0
      changelog.md

+ 1 - 1
Source/Core/DataExpression.cpp

@@ -934,7 +934,7 @@ private:
 					if (i < arguments.size() - 1)
 					if (i < arguments.size() - 1)
 						arguments_str += ", ";
 						arguments_str += ", ";
 				}
 				}
-				Error(CreateString(60 + function_name.size() + arguments_str.size(), "Failed to execute %s: %s(%s)",
+				return Error(CreateString(60 + function_name.size() + arguments_str.size(), "Failed to execute %s: %s(%s)",
 					instruction == Instruction::TransformFnc ? "transform function" : "event callback", function_name.c_str(),
 					instruction == Instruction::TransformFnc ? "transform function" : "event callback", function_name.c_str(),
 					arguments_str.c_str()));
 					arguments_str.c_str()));
 			}
 			}

+ 18 - 0
Tests/Source/UnitTests/DataExpression.cpp

@@ -90,12 +90,14 @@ static bool TestAssignment(const String& expression)
 TEST_CASE("Data expressions")
 TEST_CASE("Data expressions")
 {
 {
 	float radius = 8.7f;
 	float radius = 8.7f;
+	int num_trolls = 1;
 	String color_name = "color";
 	String color_name = "color";
 	Colourb color_value = Colourb(180, 100, 255);
 	Colourb color_value = Colourb(180, 100, 255);
 
 
 	DataModelConstructor constructor(&model, &type_register);
 	DataModelConstructor constructor(&model, &type_register);
 	constructor.Bind("radius", &radius);
 	constructor.Bind("radius", &radius);
 	constructor.Bind("color_name", &color_name);
 	constructor.Bind("color_name", &color_name);
+	constructor.Bind("num_trolls", &num_trolls);
 	constructor.BindFunc("color_value", [&](Variant& variant) { variant = ToString(color_value); });
 	constructor.BindFunc("color_value", [&](Variant& variant) { variant = ToString(color_value); });
 
 
 	constructor.RegisterTransformFunc("concatenate", [](const VariantList& arguments) -> Variant {
 	constructor.RegisterTransformFunc("concatenate", [](const VariantList& arguments) -> Variant {
@@ -107,6 +109,13 @@ TEST_CASE("Data expressions")
 		StringUtilities::JoinString(result, list);
 		StringUtilities::JoinString(result, list);
 		return Variant(std::move(result));
 		return Variant(std::move(result));
 	});
 	});
+	constructor.RegisterTransformFunc("number_suffix", [](const VariantList& arguments) -> Variant {
+		if (arguments.size() != 1)
+			return {};
+		String suffix = (arguments[0].Get<double>() == 1.0 ? arguments[1] : arguments[2]).Get<String>();
+		return Variant(arguments[0].Get<String>() + ' ' + suffix);
+	});
+	DataModelHandle handle = constructor.GetModelHandle();
 
 
 	CHECK(TestExpression("3.62345 | round | format(2)") == "4.00");
 	CHECK(TestExpression("3.62345 | round | format(2)") == "4.00");
 
 
@@ -174,4 +183,13 @@ TEST_CASE("Data expressions")
 	CHECK(TestExpression("concatenate(3.6)") == "3.6");
 	CHECK(TestExpression("concatenate(3.6)") == "3.6");
 	CHECK(TestExpression("concatenate(3.6+1)") == "4.6");
 	CHECK(TestExpression("concatenate(3.6+1)") == "4.6");
 	CHECK(TestExpression("concatenate(3.6+1) | round | format(3, false)") == "5.000");
 	CHECK(TestExpression("concatenate(3.6+1) | round | format(3, false)") == "5.000");
+	CHECK(TestExpression("concatenate(3.6+1 | round, 'x')") == "5,x");
+
+	CHECK(TestExpression("num_trolls | number_suffix('troll','trolls')") == "1 troll");
+	CHECK(TestExpression("concatenate('It takes', num_trolls*3 + ' goats', 'to outsmart', num_trolls | number_suffix('troll','trolls'))") ==
+		"It takes,3 goats,to outsmart,1 troll");
+	num_trolls = 3;
+	handle.DirtyVariable("num_trolls");
+	CHECK(TestExpression("concatenate('It takes', num_trolls*3 + ' goats', 'to outsmart', num_trolls | number_suffix('troll','trolls'))") ==
+		"It takes,9 goats,to outsmart,3 trolls");
 }
 }

+ 2 - 0
changelog.md

@@ -54,6 +54,8 @@ The `<textarea>` and `<input type="text">` elements have been improved in severa
 
 
 ### Lua plugin
 ### Lua plugin
 
 
+- Add `QuerySelector` and `QuerySelectorAll` to the Lua Element API. #329 (thanks @Dakror)
+- Lua objects representing C++ pointers now compare equal if they point to the same object. #330 (thanks @Dakror)
 - Add length to proxy for element children. #315 (thanks @nimble0)
 - Add length to proxy for element children. #315 (thanks @nimble0)
 
 
 ### Layout improvements
 ### Layout improvements