enlightenment-tests: Impl E_View_Tree unit tests
authorTaeHyeon Jeong <thyeon.jeong@samsung.com>
Thu, 16 Jan 2025 02:42:18 +0000 (11:42 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Fri, 17 Jan 2025 04:41:36 +0000 (13:41 +0900)
This commit Implements unit tests for functions in e_view_tree.c

including:
- e_view_tree_init()
- e_view_tree_from_view()
- e_view_tree_try_from_view()
- e_view_tree_child_add()
- e_view_tree_child_remove()
- e_view_tree_top_get()
- e_view_tree_bottom_get()

Tests cover different scenarios and edge cases to increase the test coverage for these functions.

Change-Id: I9363194f24f43799dc975e960a9c6939c1d1f1b5

tests/Makefile.am
tests/tc-e_view_tree.cpp [new file with mode: 0644]

index dc44e85df38e834b811f870be61e503bf1976777..7d99d7ca5510fc129ccb2df49bf8190935bc4a1d 100644 (file)
@@ -19,7 +19,8 @@ enlightenment_tests_SOURCES = \
        tc-e_view_rect.cpp \
        tc-e_view_image.cpp \
        tc-e_view_event.cpp \
-       tc-e_view_layout.cpp
+       tc-e_view_layout.cpp \
+       tc-e_view_tree.cpp
 
 enlightenment_tests_CFLAGS = \
        @E_CFLAGS@ \
diff --git a/tests/tc-e_view_tree.cpp b/tests/tc-e_view_tree.cpp
new file mode 100644 (file)
index 0000000..6c80c54
--- /dev/null
@@ -0,0 +1,395 @@
+#include "tc-main.h"
+#include "evas_wrapper.h"
+
+#define E_TEST
+#include "src/bin/core/e_view_intern.h"
+#include "e_view.h"
+
+using ::testing::_;
+
+static int destroyed, child_added, child_removed;
+
+class EViewTreeTest : public ::testing::Test
+{
+public:
+   void SetUp(void) override {
+      destroyed = child_added = child_removed = 0;
+   }
+
+   void TearDown(void) override {}
+
+   static void tree_destroy(E_View_Tree *tree) {
+      ++destroyed;
+   }
+
+   static void child_add(E_View_Tree *tree, E_View *child) {
+      ++child_added;
+   }
+
+   static void child_remove(E_View_Tree *tree, E_View *child) {
+      ++child_removed;
+   }
+
+   const E_View_Tree_Impl e_view_tree_impl = {
+      .destroy = tree_destroy,
+      .child_add = child_add,
+      .child_remove = child_remove
+   };
+
+   void make_node(E_View_Tree &tree, E_View_Tree *parent = NULL) {
+      e_view_tree_init(&tree, &e_view_tree_impl, parent);
+   }
+
+   void make_node(E_View &view, E_View_Tree *parent = NULL) {
+      e_view_init(&view, E_VIEW_TYPE_RECT, NULL, NULL, parent);
+   }
+};
+
+using EViewTreeDeathTest = EViewTreeTest;
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Init)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   EXPECT_EQ(E_VIEW_TYPE_TREE, tree.view.type);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Init_With_Impl)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   EXPECT_EQ(&e_view_tree_impl, tree.impl);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Init_With_Parent)
+{
+   E_View_Tree parent, tree;
+   make_node(parent);
+   make_node(tree, &parent);
+
+   EXPECT_EQ(parent.impl, tree.impl);
+   EXPECT_EQ(1, child_added);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_From_View)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   EXPECT_EQ(&tree, e_view_tree_from_view(&tree.view));
+}
+
+TEST_F(EViewTreeDeathTest, Test_E_View_Tree_From_View_Fail)
+{
+   E_View view;
+   make_node(view);
+
+   EXPECT_DEATH_IF_SUPPORTED(e_view_tree_from_view(&view), "");
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Try_From_View)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   EXPECT_EQ(&tree, e_view_tree_try_from_view(&tree.view));
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Try_From_View_Fail)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   E_View view;
+   make_node(view, &tree);
+
+   EXPECT_EQ(NULL, e_view_tree_try_from_view(&view));
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Child_Add)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   E_View view;
+   make_node(view);
+
+   EXPECT_EQ(true, wl_list_empty(&tree.children));
+
+   e_view_tree_child_add(&tree, &view);
+
+   EXPECT_EQ(1, wl_list_length(&tree.children));
+   EXPECT_EQ(1, child_added);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Child_Add_Without_Impl)
+{
+   E_View_Tree tree;
+   e_view_tree_init(&tree, NULL, NULL);
+
+   E_View view;
+   e_view_init(&view, E_VIEW_TYPE_RECT, NULL, NULL, NULL);
+
+   EXPECT_EQ(wl_list_empty(&tree.children), true);
+
+   e_view_tree_child_add(&tree, &view);
+
+   EXPECT_EQ(1, wl_list_length(&tree.children));
+   EXPECT_EQ(0, child_added);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Child_Remove)
+{
+   E_View_Tree tree;
+   make_node(tree);
+
+   E_View view;
+   make_node(view);
+
+   e_view_tree_child_add(&tree, &view);
+
+   ASSERT_EQ(false, wl_list_empty(&tree.children));
+   ASSERT_EQ(1, child_added);
+
+   e_view_tree_child_remove(&tree, &view);
+
+   EXPECT_EQ(true, wl_list_empty(&tree.children));
+   EXPECT_EQ(1, child_removed);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Child_Remove_Without_Impl)
+{
+   E_View_Tree tree;
+   e_view_tree_init(&tree, NULL, NULL);
+
+   E_View view;
+   e_view_init(&view, E_VIEW_TYPE_RECT, NULL, NULL, NULL);
+
+   e_view_tree_child_add(&tree, &view);
+
+   ASSERT_EQ(false, wl_list_empty(&tree.children));
+   ASSERT_EQ(0, child_added);
+
+   e_view_tree_child_remove(&tree, &view);
+
+   EXPECT_EQ(true, wl_list_empty(&tree.children));
+   EXPECT_EQ(0, child_removed);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Top_Get)
+{
+   /*          root
+    *         /    \
+    *      view1   view2
+    */
+   E_View_Tree root;
+   make_node(root);
+
+   E_View view1, view2;
+   make_node(view1, &root);
+   make_node(view2, &root);
+
+   E_View *top = e_view_tree_top_get(&root);
+   EXPECT_EQ(&view2, top);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Top_Get_Using_Recursion)
+{
+   /*          root
+    *         /    \
+    *      tree1   tree2
+    *    /        /     \
+    *   view1   view2   tree3
+    *                  /     \
+    *                view3  view4
+    */
+   E_View_Tree root, tree1, tree2;
+   make_node(root);
+   make_node(tree1, &root);
+   make_node(tree2, &root);
+
+   E_View view1;
+   make_node(view1, &tree1);
+
+   E_View view2;
+   make_node(view2, &tree2);
+
+   E_View_Tree tree3;
+   make_node(tree3, &tree2);
+
+   E_View view3, view4;
+   make_node(view3, &tree3);
+   make_node(view4, &tree3);
+
+   E_View *top = e_view_tree_top_get(&root);
+   EXPECT_EQ(&view4, top);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Top_With_No_Children)
+{
+   /*          root
+    */
+   E_View_Tree root;
+   make_node(root);
+
+   E_View *top = e_view_tree_top_get(&root);
+   EXPECT_EQ(NULL, top);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Top_Get_Using_Recursion_With_No_Children)
+{
+   /*          root
+    *         /    \
+    *      tree1   tree2
+    *    /        /     \
+    *   tree3   tree4   tree5
+    */
+   E_View_Tree root, tree1, tree2;
+   make_node(root);
+   make_node(tree1, &root);
+   make_node(tree2, &root);
+
+   E_View_Tree tree3;
+   make_node(tree3, &tree1);
+
+   E_View_Tree tree4, tree5;
+   make_node(tree4, &tree2);
+   make_node(tree5, &tree2);
+
+   E_View *top = e_view_tree_top_get(&root);
+   EXPECT_EQ(NULL, top);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Top_Get_Passing_No_Children)
+{
+   /*          root
+    *         /    \
+    *      tree1   tree2
+    *    /        /     \
+    *   view1   tree3   tree4
+    */
+   E_View_Tree root, tree1, tree2;
+   make_node(root);
+   make_node(tree1, &root);
+   make_node(tree2, &root);
+
+   E_View view1;
+   make_node(view1, &tree1);
+
+   E_View_Tree tree3, tree4;
+   make_node(tree3, &tree2);
+   make_node(tree4, &tree2);
+
+   E_View *top = e_view_tree_top_get(&root);
+   EXPECT_EQ(&view1, top);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Bottom_Get)
+{
+   /*          root
+    *         /    \
+    *      view1   view2
+    */
+   E_View_Tree root;
+   make_node(root);
+
+   E_View view1, view2;
+   make_node(view1, &root);
+   make_node(view2, &root);
+
+   E_View *bottom = e_view_tree_bottom_get(&root);
+   EXPECT_EQ(&view1, bottom);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Bottom_Get_Using_Recursion)
+{
+   /*             root
+    *            /    \
+    *         tree1   tree2
+    *       /      \       \
+    *      tree3   view1   view2
+    *     /     \
+    *   view3  view4
+    */
+   E_View_Tree root, tree1, tree2;
+   make_node(root);
+   make_node(tree1, &root);
+   make_node(tree2, &root);
+
+   E_View_Tree tree3;
+   make_node(tree3, &tree1);
+
+   E_View view1;
+   make_node(view1, &tree1);
+
+   E_View view2;
+   make_node(view2, &tree2);
+
+   E_View view3, view4;
+   make_node(view3, &tree3);
+   make_node(view4, &tree3);
+
+   E_View *bottom = e_view_tree_bottom_get(&root);
+   EXPECT_EQ(&view3, bottom);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Bottom_With_No_Children)
+{
+   /*          root
+    */
+   E_View_Tree root;
+   make_node(root);
+
+   E_View *bottom = e_view_tree_bottom_get(&root);
+   EXPECT_EQ(NULL, bottom);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Bottom_Get_Using_Recursion_With_No_Children)
+{
+   /*          root
+    *         /    \
+    *      tree1   tree2
+    *    /        /     \
+    *   tree3   tree4   tree5
+    */
+   E_View_Tree root, tree1, tree2;
+   make_node(root);
+   make_node(tree1, &root);
+   make_node(tree2, &root);
+
+   E_View_Tree tree3;
+   make_node(tree3, &tree1);
+
+   E_View_Tree tree4, tree5;
+   make_node(tree4, &tree2);
+   make_node(tree5, &tree2);
+
+   E_View *bottom = e_view_tree_bottom_get(&root);
+   EXPECT_EQ(NULL, bottom);
+}
+
+TEST_F(EViewTreeTest, Test_E_View_Tree_Bottom_Get_Passing_No_Children)
+{
+   /*          root
+    *         /    \
+    *      tree1   tree2
+    *    /       \      \
+    *   tree3  tree4   view1
+    */
+   E_View_Tree root, tree1, tree2;
+   make_node(root);
+   make_node(tree1, &root);
+   make_node(tree2, &root);
+
+   E_View_Tree tree3, tree4;
+   make_node(tree3, &tree1);
+   make_node(tree4, &tree1);
+
+   E_View view1;
+   make_node(view1, &tree2);
+
+   E_View *bottom = e_view_tree_top_get(&root);
+   EXPECT_EQ(&view1, bottom);
+}