DataModel.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <doctest.h>
  2. #include "../../../Source/Core/DataModel.cpp"
  3. using namespace Rml;
  4. TEST_CASE("Data variables")
  5. {
  6. using IntVector = std::vector<int>;
  7. struct FunData {
  8. int i = 99;
  9. String x = "hello";
  10. IntVector magic = { 3, 5, 7, 11, 13 };
  11. };
  12. using FunArray = std::array<FunData, 3>;
  13. struct SmartData {
  14. bool valid = true;
  15. FunData fun;
  16. FunArray more_fun;
  17. };
  18. DataModel model;
  19. DataTypeRegister types;
  20. DataModelConstructor handle(&model, &types);
  21. // Setup data type register
  22. {
  23. handle.RegisterArray<IntVector>();
  24. if (auto fun_handle = handle.RegisterStruct<FunData>())
  25. {
  26. fun_handle.RegisterMember("i", &FunData::i);
  27. fun_handle.RegisterMember("x", &FunData::x);
  28. fun_handle.RegisterMember("magic", &FunData::magic);
  29. }
  30. handle.RegisterArray<FunArray>();
  31. if (auto smart_handle = handle.RegisterStruct<SmartData>())
  32. {
  33. smart_handle.RegisterMember("valid", &SmartData::valid);
  34. smart_handle.RegisterMember("fun", &SmartData::fun);
  35. smart_handle.RegisterMember("more_fun", &SmartData::more_fun);
  36. }
  37. }
  38. SmartData data;
  39. data.fun.x = "Hello, we're in SmartData!";
  40. handle.Bind("data", &data);
  41. // Test data addresses, setters and assignments and assignments
  42. {
  43. std::vector<String> test_addresses = { "data.more_fun[1].magic[3]", "data.more_fun[1].magic.size", "data.fun.x", "data.valid" };
  44. std::vector<String> expected_results = { ToString(data.more_fun[1].magic[3]), ToString(int(data.more_fun[1].magic.size())), ToString(data.fun.x), ToString(data.valid) };
  45. std::vector<String> results;
  46. for (auto& str_address : test_addresses)
  47. {
  48. DataAddress address = ParseAddress(str_address);
  49. Variant result;
  50. if (model.GetVariableInto(address, result))
  51. results.push_back(result.Get<String>());
  52. }
  53. CHECK(results == expected_results);
  54. REQUIRE(model.GetVariable(ParseAddress("data.more_fun[1].magic[1]")).Set(Variant(String("199"))));
  55. CHECK(data.more_fun[1].magic[1] == 199);
  56. data.fun.magic = { 99, 190, 55, 2000, 50, 60, 70, 80, 90 };
  57. Variant get_result;
  58. const int magic_size = int(data.fun.magic.size());
  59. REQUIRE(model.GetVariable(ParseAddress("data.fun.magic.size")).Get(get_result));
  60. CHECK(get_result.Get<String>() == ToString(magic_size));
  61. CHECK(model.GetVariable(ParseAddress("data.fun.magic")).Size() == magic_size);
  62. REQUIRE(model.GetVariable(ParseAddress("data.fun.magic[8]")).Get(get_result));
  63. CHECK(get_result.Get<String>() == "90");
  64. }
  65. }