--- /dev/null
+#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);
+}