zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b0ac1ec85f7290da7f8af7ddff30b3b501325ace

commit b0ac1ec85f7290da7f8af7ddff30b3b501325ace
Author: Marcel Hollerbach <[email protected]>
Date:   Mon Oct 7 09:38:12 2019 -0400

    efl_ui_spec: introduce tests that ensure we are not leaking objects
    
    Summary:
    with those two tests we are checking two things:
    - Check that there is no left out canvas object after the widget is
    invalidated but not deleted. For now this only deals with canvas
    objects.
    - Additionally this also ensures that ref;del;unref as well as simple
    del is never ever going to end up in a error, even with children beeing
    added.
    
    This pretty much mirrors the tests for legacy in
    0d48cb46d45184608bbbbafa298f0f719e35688f , except that these tests do
    not check for evas parent contsruction vs. real widget parent
    construction. Which is intendet, as none-legacy widgets do error out
    when a not widget object is passed as parent.
    Depends on D10291
    
    Reviewers: zmike
    
    Reviewed By: zmike
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D10292
---
 src/tests/elementary/spec/efl_test_basics.c   | 126 ++++++++++++++++++++++++++
 src/tests/elementary/spec/efl_ui_spec_suite.h |   1 +
 src/tests/elementary/spec/meson.build         |   1 +
 3 files changed, 128 insertions(+)

diff --git a/src/tests/elementary/spec/efl_test_basics.c 
b/src/tests/elementary/spec/efl_test_basics.c
new file mode 100644
index 0000000000..047e07d1d8
--- /dev/null
+++ b/src/tests/elementary/spec/efl_test_basics.c
@@ -0,0 +1,126 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Efl_Ui.h>
+#include "efl_ui_spec_suite.h"
+#include "suite_helpers.h"
+
+/* spec-meta-start
+      {"test-interface":"Efl.Ui.Widget",
+       "test-widgets": [
+             "Efl.Ui.Image",
+             "Efl.Ui.Image_Zoomable",
+             "Efl.Ui.Box",
+             "Efl.Ui.Clock",
+             "Efl.Ui.Layout",
+             "Efl.Ui.List_View",
+             "Efl.Ui.Tab_Bar",
+             "Efl.Ui.Tags",
+             "Efl.Ui.Panel",
+             "Efl.Ui.Scroller",
+             "Efl.Ui.Slider",
+             "Efl.Ui.Calendar",
+             "Efl.Ui.Check",
+             "Efl.Ui.Panes",
+             "Efl.Ui.Grid",
+             "Efl.Ui.List",
+             "Efl.Ui.Spin",
+             "Efl.Ui.Spin_Button",
+             "Efl.Ui.Spotlight.Container",
+             "Efl.Ui.Popup",
+             "Efl.Ui.Alert_Popup",
+             "Efl.Ui.Slider_Interval",
+             "Efl.Ui.Frame",
+             "Efl.Ui.Progressbar",
+             "Efl.Ui.Video",
+             "Efl.Ui.Navigation_Layout",
+             "Efl.Ui.Bg",
+             "Efl.Ui.Datepicker",
+             "Efl.Ui.Grid_Default_Item",
+             "Efl.Ui.List_Default_Item",
+             "Efl.Ui.List_Placeholder_Item",
+             "Efl.Ui.Tab_Page",
+             "Efl.Ui.Timepicker",
+             "Efl.Ui.Navigation_Bar",
+             "Efl.Ui.Relative_Layout",
+             "Efl.Ui.Animation_View",
+             "Efl.Ui.Table",
+             "Efl.Ui.Flip"
+             ],
+       "custom-mapping" : {
+          "Efl.Ui.Grid" : "EFL_UI_GRID_DEFAULT_ITEM_CLASS",
+          "Efl.Ui.List" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS",
+          "Efl.Ui.Tab_Bar" : "EFL_UI_TAB_BAR_DEFAULT_ITEM_CLASS"
+        }
+       }
+
+   spec-meta-end */
+
+EFL_START_TEST(no_leaking_canvas_object)
+{
+   Eina_List *not_invalidate = NULL;
+   Eina_Iterator *iter = eo_objects_iterator_new();
+   Eo *obj;
+
+   EINA_ITERATOR_FOREACH(iter, obj)
+     {
+        if (!efl_alive_get(obj)) continue;
+        if (!efl_isa(obj, EFL_CANVAS_OBJECT_CLASS)) continue;
+
+        not_invalidate = eina_list_append(not_invalidate, obj);
+     }
+   eina_iterator_free(iter);
+
+   //now try to will those widgets
+   if (efl_isa(widget, EFL_PACK_LINEAR_INTERFACE))
+     {
+        for (int i = 0; i < 30; ++i)
+          {
+             Efl_Ui_Widget *w = create_test_widget();
+             efl_pack_end(widget, w);
+          }
+     }
+   else if (efl_isa(widget, EFL_CONTENT_INTERFACE))
+     {
+        efl_content_set(widget, create_test_widget());
+     }
+   else if (efl_isa(widget, EFL_TEXT_INTERFACE))
+     {
+        efl_text_set(widget, "Test Things!");
+     }
+   //now reference things, and delete the widget again. This means, the widget 
will be invalidated.
+   efl_ref(widget);
+   efl_del(widget);
+   ck_assert_int_eq(efl_alive_get(widget), EINA_FALSE);
+   ck_assert_int_eq(efl_ref_count(widget), 1);
+   iter = eo_objects_iterator_new();
+
+   //now check if there are leaked objects from the widget
+   EINA_ITERATOR_FOREACH(iter, obj)
+     {
+        if (!efl_alive_get(obj)) continue;
+        if (!efl_isa(obj, EFL_CANVAS_OBJECT_CLASS)) continue;
+
+        ck_assert_ptr_ne(eina_list_data_find(not_invalidate, obj), NULL);
+     }
+   eina_iterator_free(iter);
+
+   efl_unref(widget);
+}
+EFL_END_TEST
+
+EFL_START_TEST(no_err_on_shutdown)
+{
+   efl_ref(widget);
+   efl_del(widget);
+   efl_unref(widget);
+}
+EFL_END_TEST
+
+void
+efl_ui_widget_behavior_test(TCase *tc)
+{
+   tcase_add_test(tc, no_leaking_canvas_object);
+   tcase_add_test(tc, no_err_on_shutdown);
+}
diff --git a/src/tests/elementary/spec/efl_ui_spec_suite.h 
b/src/tests/elementary/spec/efl_ui_spec_suite.h
index 10b8f3b9b1..63c8b2c125 100644
--- a/src/tests/elementary/spec/efl_ui_spec_suite.h
+++ b/src/tests/elementary/spec/efl_ui_spec_suite.h
@@ -23,6 +23,7 @@ void efl_ui_view_behavior_test(TCase *tc);
 void efl_ui_single_selectable_behavior_test(TCase *tc);
 void efl_ui_multi_selectable_behavior_test(TCase *tc);
 void efl_ui_selectable_behavior_test(TCase *tc);
+void efl_ui_widget_behavior_test(TCase *tc);
 
 void efl_test_container_content_equal(Efl_Ui_Widget **wid, unsigned int len);
 void efl_test_container_expect_evt_content_added(Efl_Ui_Widget *widget, const 
Efl_Event_Description *ev, Eina_Bool *flag, void *event_data);
diff --git a/src/tests/elementary/spec/meson.build 
b/src/tests/elementary/spec/meson.build
index 33be7aa013..8b28e2cdd2 100644
--- a/src/tests/elementary/spec/meson.build
+++ b/src/tests/elementary/spec/meson.build
@@ -12,6 +12,7 @@ efl_ui_suite_behavior_test_files = files([
   'efl_test_multi_selectable.c',
   'efl_test_selectable.c',
   'efl_test_gfx_view.c',
+  'efl_test_basics.c'
 ])
 
 efl_ui_suite_behavior_src = files([

-- 


Reply via email to