859 CX_TEST_ASSERT(ba.data == 2); |
859 CX_TEST_ASSERT(ba.data == 2); |
860 CX_TEST_ASSERT(ca.data == 0); |
860 CX_TEST_ASSERT(ca.data == 0); |
861 CX_TEST_ASSERT(cb.data == 0); |
861 CX_TEST_ASSERT(cb.data == 0); |
862 CX_TEST_ASSERT(cc.data == 0); |
862 CX_TEST_ASSERT(cc.data == 0); |
863 CX_TEST_ASSERT(cba.data == 0); |
863 CX_TEST_ASSERT(cba.data == 0); |
|
864 |
|
865 // now perform with other subtree |
|
866 iter = cx_tree_iterator(&c, true, tree_children(tree_node)); |
|
867 chk = 0; |
|
868 cx_foreach(tree_node*, node, iter) { |
|
869 CX_TEST_ASSERT(iter.exiting || node->data == 0); |
|
870 node->data++; |
|
871 chk++; |
|
872 CX_TEST_ASSERT(node == iter.node); |
|
873 if (node == &c) { |
|
874 CX_TEST_ASSERT(iter.depth == 1); |
|
875 } else if (node == &ca || node == &cb || node == &cc) { |
|
876 CX_TEST_ASSERT(iter.depth == 2); |
|
877 } else if (node == &cba) { |
|
878 CX_TEST_ASSERT(iter.depth == 3); |
|
879 } |
|
880 } |
|
881 CX_TEST_ASSERT(iter.counter == 5); |
|
882 CX_TEST_ASSERT(chk == 10); |
|
883 CX_TEST_ASSERT(iter.stack == NULL); |
|
884 CX_TEST_ASSERT(root.data == 0); |
|
885 CX_TEST_ASSERT(a.data == 0); |
|
886 CX_TEST_ASSERT(b.data == 2); |
|
887 CX_TEST_ASSERT(c.data == 2); |
|
888 CX_TEST_ASSERT(aa.data == 0); |
|
889 CX_TEST_ASSERT(ab.data == 0); |
|
890 CX_TEST_ASSERT(ba.data == 2); |
|
891 CX_TEST_ASSERT(ca.data == 2); |
|
892 CX_TEST_ASSERT(cb.data == 2); |
|
893 CX_TEST_ASSERT(cc.data == 2); |
|
894 CX_TEST_ASSERT(cba.data == 2); |
864 } |
895 } |
865 } |
896 } |
866 |
897 |
867 typedef struct test_xml_node { |
898 typedef struct test_xml_node { |
868 struct tree_node base; |
899 struct tree_node base; |
1102 actual_order[chk] = node; |
1133 actual_order[chk] = node; |
1103 chk++; |
1134 chk++; |
1104 } |
1135 } |
1105 CX_TEST_ASSERT(iter.counter == 4); |
1136 CX_TEST_ASSERT(iter.counter == 4); |
1106 CX_TEST_ASSERT(chk == 4); |
1137 CX_TEST_ASSERT(chk == 4); |
|
1138 CX_TEST_ASSERT(iter.queue_next == NULL); |
|
1139 CX_TEST_ASSERT(iter.queue_last == NULL); |
|
1140 for (unsigned i = 0 ; i < chk ; i++) { |
|
1141 CX_TEST_ASSERT(actual_order[i] == expected_order[i]); |
|
1142 CX_TEST_ASSERT(actual_order[i]->data == 1); |
|
1143 } |
|
1144 } |
|
1145 } |
|
1146 |
|
1147 CX_TEST(test_tree_visitor_subtree) { |
|
1148 tree_node root = {0}; |
|
1149 tree_node a = {0}; |
|
1150 tree_node b = {0}; |
|
1151 tree_node c = {0}; |
|
1152 tree_node ba = {0}; |
|
1153 tree_node bb = {0}; |
|
1154 tree_node bc = {0}; |
|
1155 tree_node bba = {0}; |
|
1156 |
|
1157 tree_node* expected_order[] = { |
|
1158 &b, &ba, &bb, &bc, &bba |
|
1159 }; |
|
1160 tree_node* actual_order[5]; |
|
1161 |
|
1162 cx_tree_link(&root, &a, tree_node_layout); |
|
1163 cx_tree_link(&root, &b, tree_node_layout); |
|
1164 cx_tree_link(&root, &c, tree_node_layout); |
|
1165 cx_tree_link(&b, &ba, tree_node_layout); |
|
1166 cx_tree_link(&b, &bb, tree_node_layout); |
|
1167 cx_tree_link(&b, &bc, tree_node_layout); |
|
1168 cx_tree_link(&bb, &bba, tree_node_layout); |
|
1169 |
|
1170 CX_TEST_DO { |
|
1171 CxTreeVisitor iter = cx_tree_visitor(&b, tree_children(tree_node)); |
|
1172 unsigned chk = 0; |
|
1173 cx_foreach(tree_node*, node, iter) { |
|
1174 CX_TEST_ASSERT(node == iter.node); |
|
1175 CX_TEST_ASSERT(node->data == 0); |
|
1176 node->data++; |
|
1177 actual_order[chk] = node; |
|
1178 chk++; |
|
1179 } |
|
1180 CX_TEST_ASSERT(iter.counter == 5); |
|
1181 CX_TEST_ASSERT(chk == 5); |
1107 CX_TEST_ASSERT(iter.queue_next == NULL); |
1182 CX_TEST_ASSERT(iter.queue_next == NULL); |
1108 CX_TEST_ASSERT(iter.queue_last == NULL); |
1183 CX_TEST_ASSERT(iter.queue_last == NULL); |
1109 for (unsigned i = 0 ; i < chk ; i++) { |
1184 for (unsigned i = 0 ; i < chk ; i++) { |
1110 CX_TEST_ASSERT(actual_order[i] == expected_order[i]); |
1185 CX_TEST_ASSERT(actual_order[i] == expected_order[i]); |
1111 CX_TEST_ASSERT(actual_order[i]->data == 1); |
1186 CX_TEST_ASSERT(actual_order[i]->data == 1); |
2278 cx_test_register(suite, test_tree_iterator_xml); |
2353 cx_test_register(suite, test_tree_iterator_xml); |
2279 cx_test_register(suite, test_tree_iterator_free_nodes); |
2354 cx_test_register(suite, test_tree_iterator_free_nodes); |
2280 cx_test_register(suite, test_tree_visitor); |
2355 cx_test_register(suite, test_tree_visitor); |
2281 cx_test_register(suite, test_tree_visitor_no_children); |
2356 cx_test_register(suite, test_tree_visitor_no_children); |
2282 cx_test_register(suite, test_tree_visitor_no_branching); |
2357 cx_test_register(suite, test_tree_visitor_no_branching); |
|
2358 cx_test_register(suite, test_tree_visitor_subtree); |
2283 cx_test_register(suite, test_tree_visitor_continue); |
2359 cx_test_register(suite, test_tree_visitor_continue); |
2284 cx_test_register(suite, test_tree_iterator_continue); |
2360 cx_test_register(suite, test_tree_iterator_continue); |
2285 cx_test_register(suite, test_tree_iterator_continue_with_exit); |
2361 cx_test_register(suite, test_tree_iterator_continue_with_exit); |
2286 cx_test_register(suite, test_tree_add_one); |
2362 cx_test_register(suite, test_tree_add_one); |
2287 cx_test_register(suite, test_tree_add_one_existing); |
2363 cx_test_register(suite, test_tree_add_one_existing); |