test_tb_node_ref_tree.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // ================================================================================
  2. // == This file is a part of Turbo Badger. (C) 2011-2014, Emil Segerås ==
  3. // == See tb_core.h for more information. ==
  4. // ================================================================================
  5. #include "tb_test.h"
  6. #include "tb_node_ref_tree.h"
  7. #include "tb_widgets_reader.h"
  8. #include "tb_layout.h"
  9. #include "tb_editfield.h"
  10. #ifdef TB_UNIT_TESTING
  11. using namespace tb;
  12. TB_TEST_GROUP(tb_node_ref_tree)
  13. {
  14. class DataListener : public TBNodeRefTreeListener
  15. {
  16. public:
  17. TBStr changed_request;
  18. int changed_counter;
  19. DataListener() : changed_counter(0) {}
  20. virtual void OnDataChanged(TBNodeRefTree *dt, const char *request)
  21. {
  22. changed_request.Set(request);
  23. changed_counter++;
  24. }
  25. };
  26. TB_TEST(change_on_set)
  27. {
  28. TBNodeRefTree dt("r");
  29. DataListener dl;
  30. dt.AddListener(&dl);
  31. dt.SetValue("mainbar>size", TBValue("10mm", TBValue::SET_AS_STATIC));
  32. TB_VERIFY_STR(dl.changed_request, "mainbar>size");
  33. dt.SetValue("mainbar>axis", TBValue("x", TBValue::SET_AS_STATIC));
  34. TB_VERIFY_STR(dl.changed_request, "mainbar>axis");
  35. dt.SetValue("mainbar>visible", TBValue(42));
  36. TB_VERIFY_STR(dl.changed_request, "mainbar>visible");
  37. TB_VERIFY_STR(dt.GetValue("mainbar>size").GetString(), "10mm");
  38. TB_VERIFY_STR(dt.GetValue("mainbar>axis").GetString(), "x");
  39. TB_VERIFY(dt.GetValue("mainbar>visible").GetInt() == 42);
  40. TB_VERIFY(dl.changed_counter == 3);
  41. dt.RemoveListener(&dl);
  42. }
  43. TB_TEST(reference_value)
  44. {
  45. TBNodeRefTree dt("test_styles");
  46. dt.ReadData("FireButton\n"
  47. " skin: 'FireButtonSkin'\n");
  48. TBWidget root;
  49. g_widgets_reader->LoadData(&root, "TBButton: id: 'fire', skin: '@test_styles>FireButton>skin'");
  50. TBWidget *button = root.GetWidgetByID(TBIDC("fire"));
  51. TB_VERIFY(button->GetSkinBg() == TBIDC("FireButtonSkin"));
  52. }
  53. TB_TEST(reference_value_recurse)
  54. {
  55. TBNodeRefTree dt1("test_foo");
  56. dt1.ReadData("foo_value: 42\n"
  57. "foo_circular: '@test_bar>bar_circular'\n");
  58. TBNodeRefTree dt2("test_bar");
  59. dt2.ReadData("bar_value: '@test_foo>foo_value'\n"
  60. "bar_circular: '@test_foo>foo_circular'\n"
  61. "bar_circular2: '@test_bar>bar_circular'\n"
  62. "bar_broken_node: '@test_foo>foo_broken_node'"
  63. "bar_broken_tree: '@test_foo>foo_broken_tree'");
  64. TBWidget root;
  65. g_widgets_reader->LoadData(&root,
  66. "TBInlineSelect: id: 'select', value: '@test_bar>bar_value'\n"
  67. "TBButton: id: 'button_circular', text: '@test_bar>bar_circular'\n"
  68. "TBButton: id: 'button_broken_node', text: '@test_bar>bar_broken_node'\n"
  69. "TBButton: id: 'button_broken_tree', text: '@test_bad_tree>foo'\n");
  70. // Reference from resource to one tree to another tree.
  71. TBWidget *select = root.GetWidgetByID(TBIDC("select"));
  72. TB_VERIFY(select->GetValue() == 42);
  73. // Reference in a circular loop. Should not freeze.
  74. TBWidget *button_circular = root.GetWidgetByID(TBIDC("button_circular"));
  75. TB_VERIFY_STR(button_circular->GetText(), "@test_bar>bar_circular");
  76. // Reference in a circular loop. Should not freeze.
  77. TB_VERIFY(TBNodeRefTree::GetValueFromTree("@test_bar>bar_circular2").GetType() == TBValue::TYPE_NULL);
  78. // References tree is wrong
  79. TB_VERIFY(TBNodeRefTree::GetValueFromTree("@test_bad_tree>does_not_exist").GetType() == TBValue::TYPE_NULL);
  80. // Reference that is broken (has no matching node).
  81. TBWidget *button_broken1 = root.GetWidgetByID(TBIDC("button_broken_node"));
  82. TB_VERIFY_STR(button_broken1->GetText(), "@test_foo>foo_broken_node");
  83. // Reference that is broken (has no matching tree).
  84. TBWidget *button_broken2 = root.GetWidgetByID(TBIDC("button_broken_tree"));
  85. TB_VERIFY_STR(button_broken2->GetText(), "@test_bad_tree>foo");
  86. }
  87. TB_TEST(reference_include)
  88. {
  89. TBNodeRefTree dt("test_styles");
  90. dt.ReadData("VeryNice\n"
  91. " skin: 'SpecialSkin'\n"
  92. " text: 'hello'\n");
  93. TBWidget root;
  94. g_widgets_reader->LoadData(&root, "TBEditField: id: 'edit'\n"
  95. " @include @test_styles>VeryNice");
  96. TBEditField *edit = root.GetWidgetByIDAndType<TBEditField>(TBIDC("edit"));
  97. TB_VERIFY(edit->GetSkinBg() == TBIDC("SpecialSkin"));
  98. TB_VERIFY_STR(edit->GetText(), "hello");
  99. }
  100. TB_TEST(reference_local_include)
  101. {
  102. TBWidget root;
  103. g_widgets_reader->LoadData(&root, "SomeDeclarations\n"
  104. " skin: 'SpecialSkin'\n"
  105. " text: 'hello'\n"
  106. "TBEditField: id: 'edit'\n"
  107. " @include SomeDeclarations");
  108. TBEditField *edit = root.GetWidgetByIDAndType<TBEditField>(TBIDC("edit"));
  109. TB_VERIFY(edit->GetSkinBg() == TBIDC("SpecialSkin"));
  110. TB_VERIFY_STR(edit->GetText(), "hello");
  111. }
  112. TB_TEST(reference_condition)
  113. {
  114. TBNodeRefTree dt("test_settings");
  115. dt.ReadData("layout\n"
  116. " landscape: 1\n");
  117. const char *layout_str =
  118. "TBLayout: id: 'layout'\n"
  119. " distribution: 'available'\n"
  120. " @if @test_settings>layout>landscape\n"
  121. " axis: 'x'\n"
  122. " spacing: 100px\n"
  123. " @else\n"
  124. " axis: 'y'\n"
  125. " spacing: 200px\n"
  126. " gravity: 'all'\n";
  127. TBWidget root1, root2;
  128. // Inflate & check
  129. g_widgets_reader->LoadData(&root1, layout_str);
  130. TBLayout *layout1 = root1.GetWidgetByIDAndType<TBLayout>(TBIDC("layout"));
  131. TB_VERIFY(layout1->GetAxis() == AXIS_X);
  132. TB_VERIFY(layout1->GetSpacing() == 100);
  133. TB_VERIFY(layout1->GetGravity() == WIDGET_GRAVITY_ALL);
  134. // Change data for condition
  135. dt.SetValue("layout>landscape", TBValue(0));
  136. // Inflate & check
  137. g_widgets_reader->LoadData(&root2, layout_str);
  138. TBLayout *layout2 = root2.GetWidgetByIDAndType<TBLayout>(TBIDC("layout"));
  139. TB_VERIFY(layout2->GetAxis() == AXIS_Y);
  140. TB_VERIFY(layout2->GetSpacing() == 200);
  141. TB_VERIFY(layout2->GetGravity() == WIDGET_GRAVITY_ALL);
  142. }
  143. TBNode *GetChildNodeFromIndex(TBNode *parent, int index)
  144. {
  145. TBNode *child = parent->GetFirstChild();
  146. while (child && index-- > 0)
  147. child = child->GetNext();
  148. return child;
  149. }
  150. TB_TEST(reference_condition_branch_insert_order)
  151. {
  152. const char *str =
  153. "A\n"
  154. " B1\n"
  155. " C1\n"
  156. " @if 1\n"
  157. " @if 1\n"
  158. " B2\n"
  159. " B3\n"
  160. " B4\n"
  161. " B5\n";
  162. TBNode node;
  163. node.ReadData(str);
  164. TBNode *a = GetChildNodeFromIndex(&node, 0);
  165. TB_VERIFY_STR(a->GetName(), "A");
  166. TB_VERIFY_STR(GetChildNodeFromIndex(a, 0)->GetName(), "B1");
  167. TB_VERIFY_STR(GetChildNodeFromIndex(GetChildNodeFromIndex(a, 0), 0)->GetName(), "C1");
  168. TB_VERIFY_STR(GetChildNodeFromIndex(a, 1)->GetName(), "B2");
  169. TB_VERIFY_STR(GetChildNodeFromIndex(a, 2)->GetName(), "B3");
  170. TB_VERIFY_STR(GetChildNodeFromIndex(a, 3)->GetName(), "B4");
  171. TB_VERIFY_STR(GetChildNodeFromIndex(a, 4)->GetName(), "B5");
  172. }
  173. }
  174. #endif // TB_UNIT_TESTING