bu5hm4n pushed a commit to branch master.

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

commit 54c524f7f6186bffcfc3059e8268fabf618a9797
Author: Marcel Hollerbach <m...@marcel-hollerbach.de>
Date:   Tue Aug 6 19:55:40 2019 +0200

    introduce efl_ui_multi_selectable and efl_ui_single_selectable
    
    right now they are just thin wrappers from what have been in
    efl_ui_collection. This is just a first effort, the interfaces have to
    be equipped with more and better API, more events, and tests.
    
    ref T8057
    
    Reviewed-by: SangHyeon Jade Lee <sh10233....@samsung.com>
    Differential Revision: https://phab.enlightenment.org/D9515
---
 src/examples/elementary/efl_ui_list_example_1.c    |   6 +-
 src/lib/efl/Efl.h                                  |   1 -
 src/lib/efl/interfaces/efl_interfaces_main.c       |   2 +-
 src/lib/efl/interfaces/meson.build                 |   1 -
 src/lib/elementary/Efl_Ui.h                        |   2 +
 src/lib/elementary/efl_ui_collection.c             |   6 +-
 src/lib/elementary/efl_ui_collection.eo            |  16 +-
 src/lib/elementary/efl_ui_item.c                   |   2 +
 .../efl_ui_multi_selectable.eo                     |  11 +-
 src/lib/elementary/efl_ui_single_selectable.eo     |  17 ++
 src/lib/elementary/meson.build                     |   2 +
 .../elementary/efl_ui_test_collection_common.c     | 208 +-----------------
 .../elementary/spec/efl_test_multi_selectable.c    | 239 +++++++++++++++++++++
 .../elementary/spec/efl_test_single_selectable.c   |  56 +++++
 src/tests/elementary/spec/efl_ui_spec_suite.h      |   2 +
 src/tests/elementary/spec/meson.build              |   2 +
 16 files changed, 341 insertions(+), 232 deletions(-)

diff --git a/src/examples/elementary/efl_ui_list_example_1.c 
b/src/examples/elementary/efl_ui_list_example_1.c
index bb8aa4011f..efac2de088 100644
--- a/src/examples/elementary/efl_ui_list_example_1.c
+++ b/src/examples/elementary/efl_ui_list_example_1.c
@@ -30,7 +30,7 @@ _list_selected(void *data EINA_UNUSED, const Efl_Event *ev)
   Eo *item = ev->info, *tmp;
   printf("list item [%p:%d] is %s\n", item, efl_ui_item_index_get(item), 
(efl_ui_selectable_selected_get(item)? "selected" : "unselected"));
 
-  Eina_Iterator *selects = efl_ui_collection_selected_items_get(list);
+  Eina_Iterator *selects = efl_ui_selected_items_get(list);
 
   EINA_ITERATOR_FOREACH(selects, tmp)
      printf("selected [%p:%d] ", tmp, efl_ui_item_index_get(tmp));
@@ -82,7 +82,7 @@ _anim_radio_changed(void *data, const Efl_Event *ev 
EINA_UNUSED)
 static void
 _scrl_btn_clicked(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
 {
-  Efl_Ui_List_Default_Item *item = 
efl_ui_collection_last_selected_item_get(priv_d.list);
+  Efl_Ui_List_Default_Item *item = 
efl_ui_single_selectable_last_selected_get(priv_d.list);
   printf("show [%d:%p] [%d]\n", efl_ui_item_index_get(item), item, 
priv_d.anim);
   efl_ui_collection_item_scroll(priv_d.list, item, priv_d.anim);
 }
@@ -90,7 +90,7 @@ _scrl_btn_clicked(void *data EINA_UNUSED, const Efl_Event *ev 
EINA_UNUSED)
 static void
 _scrl_align_btn_clicked(void *data EINA_UNUSED, const Efl_Event *ev 
EINA_UNUSED)
 {
-  Efl_Ui_List_Default_Item *item = 
efl_ui_collection_last_selected_item_get(priv_d.list);
+  Efl_Ui_List_Default_Item *item = 
efl_ui_single_selectable_last_selected_get(priv_d.list);
   double align = efl_ui_range_value_get(priv_d.slider);
   printf("show [%d:%p] [%.2lf], [%d]\n", efl_ui_item_index_get(item), item, 
align, priv_d.anim);
   efl_ui_collection_item_scroll_align(priv_d.list, item, align, priv_d.anim);
diff --git a/src/lib/efl/Efl.h b/src/lib/efl/Efl.h
index c1c934f6b0..a75b683b52 100644
--- a/src/lib/efl/Efl.h
+++ b/src/lib/efl/Efl.h
@@ -109,7 +109,6 @@ typedef Efl_Gfx_Path_Command_Type Efl_Gfx_Path_Command;
 #include "interfaces/efl_ui_scrollable_interactive.eo.h"
 #include "interfaces/efl_ui_text_selectable.eo.h"
 #include "interfaces/efl_ui_container_selectable.eo.h"
-#include "interfaces/efl_ui_multi_selectable.eo.h"
 #include "interfaces/efl_ui_zoom.eo.h"
 
 #include "interfaces/efl_screen.eo.h"
diff --git a/src/lib/efl/interfaces/efl_interfaces_main.c 
b/src/lib/efl/interfaces/efl_interfaces_main.c
index 141a2904a7..47c143c120 100644
--- a/src/lib/efl/interfaces/efl_interfaces_main.c
+++ b/src/lib/efl/interfaces/efl_interfaces_main.c
@@ -77,7 +77,7 @@
 #include "interfaces/efl_ui_scrollbar.eo.c"
 #include "interfaces/efl_ui_container_selectable.eo.c"
 #include "interfaces/efl_ui_text_selectable.eo.c"
-#include "interfaces/efl_ui_multi_selectable.eo.c"
+
 #include "interfaces/efl_ui_zoom.eo.c"
 
 #include "interfaces/efl_cached_item.eo.c"
diff --git a/src/lib/efl/interfaces/meson.build 
b/src/lib/efl/interfaces/meson.build
index 7467882665..992915c69e 100644
--- a/src/lib/efl/interfaces/meson.build
+++ b/src/lib/efl/interfaces/meson.build
@@ -84,7 +84,6 @@ pub_eo_files = [
   'efl_ui_property_bind.eo',
   'efl_ui_factory.eo',
   'efl_ui_factory_bind.eo',
-  'efl_ui_multi_selectable.eo',
   'efl_screen.eo',
   'efl_io_closer.eo',
   'efl_io_positioner.eo',
diff --git a/src/lib/elementary/Efl_Ui.h b/src/lib/elementary/Efl_Ui.h
index a54ee690fa..9683ee74d0 100644
--- a/src/lib/elementary/Efl_Ui.h
+++ b/src/lib/elementary/Efl_Ui.h
@@ -260,6 +260,8 @@ typedef Eo Efl_Ui_Spotlight_Indicator;
 # include <efl_ui_grid_default_item.eo.h>
 # include <efl_ui_list_placeholder_item.eo.h>
 # include <efl_ui_selectable.eo.h>
+# include <efl_ui_single_selectable.eo.h>
+# include <efl_ui_multi_selectable.eo.h>
 # include <efl_ui_popup.eo.h>
 # include <efl_ui_alert_popup.eo.h>
 # include <efl_ui_scroll_alert_popup.eo.h>
diff --git a/src/lib/elementary/efl_ui_collection.c 
b/src/lib/elementary/efl_ui_collection.c
index f1c5b568c3..1889067a5e 100644
--- a/src/lib/elementary/efl_ui_collection.c
+++ b/src/lib/elementary/efl_ui_collection.c
@@ -251,14 +251,14 @@ _efl_ui_collection_item_scroll_align(Eo *obj, 
Efl_Ui_Collection_Data *pd, Efl_Ui
    _item_scroll_internal(obj, pd, item, align, animation);
 }
 
-EOLIAN static Efl_Ui_Item*
-_efl_ui_collection_last_selected_item_get(const Eo *obj EINA_UNUSED, 
Efl_Ui_Collection_Data *pd)
+EOLIAN static Efl_Ui_Selectable*
+_efl_ui_collection_efl_ui_single_selectable_last_selected_get(const Eo *obj 
EINA_UNUSED, Efl_Ui_Collection_Data *pd)
 {
    return eina_list_last_data_get(pd->selected);
 }
 
 EOLIAN static Eina_Iterator*
-_efl_ui_collection_selected_items_get(Eo *obj EINA_UNUSED, 
Efl_Ui_Collection_Data *pd)
+_efl_ui_collection_efl_ui_multi_selectable_selected_items_get(Eo *obj 
EINA_UNUSED, Efl_Ui_Collection_Data *pd)
 {
    return eina_list_iterator_new(pd->selected);
 }
diff --git a/src/lib/elementary/efl_ui_collection.eo 
b/src/lib/elementary/efl_ui_collection.eo
index 679ef39062..a3e302e320 100644
--- a/src/lib/elementary/efl_ui_collection.eo
+++ b/src/lib/elementary/efl_ui_collection.eo
@@ -32,18 +32,6 @@ class @beta Efl.Ui.Collection extends Efl.Ui.Layout_Base 
implements
             @in animation: bool; [[If you want to have an animation or not.]]
          }
       }
-      @property last_selected_item {
-         [[The item that was selected most recently.
-         ]]
-         get {}
-         values {
-            item: Efl.Ui.Item; [[The latest selected item.]]
-         }
-      }
-      selected_items_get {
-         [[Get the selected items iterator. The iterator sequence will be 
decided by selection.]]
-         return: iterator<Efl.Ui.Item> @owned @no_unused; [[User has to free 
the iterator after usage.]]
-      }
       @property position_manager {
          [[Position manager object that handles placement of items.]]
          values {
@@ -73,10 +61,12 @@ class @beta Efl.Ui.Collection extends Efl.Ui.Layout_Base 
implements
       Efl.Pack_Linear.pack_index_get;
       Efl.Pack_Linear.pack_content_get;
       Efl.Ui.Scrollable_Interactive.match_content { set; }
-      Efl.Ui.Multi_Selectable.select_mode {get; set;}
       Efl.Ui.Widget_Focus_Manager.focus_manager_create;
       Efl.Ui.Widget.focus_state_apply;
       Efl.Ui.Focus.Manager.move;
+      Efl.Ui.Single_Selectable.last_selected { get; }
+      Efl.Ui.Multi_Selectable.selected_items_get;
+      Efl.Ui.Multi_Selectable.select_mode {get; set;}
    }
    events {
       item,pressed : Efl.Ui.Item; [[A $press event occurred over an item.]]
diff --git a/src/lib/elementary/efl_ui_item.c b/src/lib/elementary/efl_ui_item.c
index 1ccc987759..6e88a84f10 100644
--- a/src/lib/elementary/efl_ui_item.c
+++ b/src/lib/elementary/efl_ui_item.c
@@ -273,3 +273,5 @@ _efl_ui_item_container_get(const Eo *obj EINA_UNUSED, 
Efl_Ui_Item_Data *pd)
 
 #include "efl_ui_item.eo.c"
 #include "efl_ui_selectable.eo.c"
+#include "efl_ui_multi_selectable.eo.c"
+#include "efl_ui_single_selectable.eo.c"
diff --git a/src/lib/efl/interfaces/efl_ui_multi_selectable.eo 
b/src/lib/elementary/efl_ui_multi_selectable.eo
similarity index 57%
rename from src/lib/efl/interfaces/efl_ui_multi_selectable.eo
rename to src/lib/elementary/efl_ui_multi_selectable.eo
index 2f7eac4788..3957fe332e 100644
--- a/src/lib/efl/interfaces/efl_ui_multi_selectable.eo
+++ b/src/lib/elementary/efl_ui_multi_selectable.eo
@@ -8,10 +8,11 @@ enum @beta Efl.Ui.Select_Mode {
    none [[Last value of select mode. child cannot be selected at all.]]
 }
 
-interface @beta Efl.Ui.Multi_Selectable
+interface @beta Efl.Ui.Multi_Selectable extends Efl.Ui.Single_Selectable
 {
-   [[Efl UI Multi selectable interface.
-     The container have to control select property of multiple chidren.]]
+   [[Interface for getting access to a range of selected items.
+
+     The implementor of this interface provides the possibility to select 
multiple Selectables. (If not, only Efl.Ui.Single_Selectable should be 
implemented)]]
    c_prefix: efl_ui;
    methods
    {
@@ -23,5 +24,9 @@ interface @beta Efl.Ui.Multi_Selectable
             mode: Efl.Ui.Select_Mode; [[Type of selection of children]]
          }
       }
+      selected_items_get {
+         [[Get the selected items in a iterator. The iterator sequence will be 
decided by selection.]]
+         return: iterator<Efl.Ui.Selectable> @owned @no_unused; [[User has to 
free the iterator after usage.]]
+      }
    }
 }
diff --git a/src/lib/elementary/efl_ui_single_selectable.eo 
b/src/lib/elementary/efl_ui_single_selectable.eo
new file mode 100644
index 0000000000..c2777ff106
--- /dev/null
+++ b/src/lib/elementary/efl_ui_single_selectable.eo
@@ -0,0 +1,17 @@
+interface @beta Efl.Ui.Single_Selectable {
+   [[Interface for getting access to a single selected item in the implementor.
+
+     The implementor is free to allow a specific number of selectables beeing 
selected or not. This interface just covers always the latest selected 
selectable.
+   ]]
+   methods {
+      @property last_selected {
+        [[The selectable that was selected most recently.]]
+        get {
+
+        }
+        values {
+          selectable : Efl.Ui.Selectable; [[The latest selected item.]]
+        }
+      }
+   }
+}
diff --git a/src/lib/elementary/meson.build b/src/lib/elementary/meson.build
index e42223682b..06cad2bff3 100644
--- a/src/lib/elementary/meson.build
+++ b/src/lib/elementary/meson.build
@@ -183,6 +183,8 @@ pub_eo_files = [
   'efl_ui_position_manager_list.eo',
   'efl_ui_position_manager_grid.eo',
   'efl_ui_selectable.eo',
+  'efl_ui_multi_selectable.eo',
+  'efl_ui_single_selectable.eo',
 ]
 
 foreach eo_file : pub_eo_files
diff --git a/src/tests/elementary/efl_ui_test_collection_common.c 
b/src/tests/elementary/efl_ui_test_collection_common.c
index 746b86d938..7be3c7c532 100644
--- a/src/tests/elementary/efl_ui_test_collection_common.c
+++ b/src/tests/elementary/efl_ui_test_collection_common.c
@@ -22,212 +22,6 @@ fill_items(const Efl_Class *klass)
     }
 }
 
-static void
-_set_pointer_quit(void *data, const Efl_Event *ev)
+void efl_ui_test_item_container_common_add(TCase *tc EINA_UNUSED)
 {
-   Efl_Ui_Item **b = data;
-
-   ck_assert_ptr_eq(*b, NULL);
-   *b = ev->info;
-}
-
-static void
-_iterator_to_array(Eina_Array **arr, Eina_Iterator *iter)
-{
-   Efl_Ui_Widget *widget;
-
-   *arr = eina_array_new(10);
-
-   EINA_ITERATOR_FOREACH(iter, widget)
-     {
-        eina_array_push(*arr, widget);
-     }
-   eina_iterator_free(iter);
-}
-
-EFL_START_TEST(test_multi_select)
-{
-   Efl_Ui_Item *selected = NULL;
-   Efl_Ui_Item *unselected = NULL;
-   Eina_Array *arr_selected;
-   efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_MULTI);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-   fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 0));
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 0)), EINA_TRUE);
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 2)), EINA_TRUE);
-   ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), 
efl_pack_content_get(item_container, 2));
-   _iterator_to_array(&arr_selected, 
efl_ui_collection_selected_items_get(item_container));
-   ck_assert_int_eq(eina_array_count(arr_selected), 2);
-   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), 
efl_pack_content_get(item_container, 0));
-   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 1), 
efl_pack_content_get(item_container, 2));
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, NULL);
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-}
-EFL_END_TEST
-
-EFL_START_TEST(test_multi_select_removal)
-{
-   Efl_Ui_Item *selected = NULL;
-   Efl_Ui_Item *unselected = NULL;
-   Eina_Array *arr_selected;
-   efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_MULTI);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-   fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), 
EINA_TRUE);
-   selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), 
EINA_FALSE);
-   ck_assert_ptr_eq(selected, NULL);
-   ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 0));
-   selected = NULL;
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_FALSE);
-   ck_assert_ptr_eq(selected, NULL);
-   ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 2));
-   selected = NULL;
-   unselected = NULL;
-
-   ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), 
NULL);
-   _iterator_to_array(&arr_selected, 
efl_ui_collection_selected_items_get(item_container));
-   ck_assert_int_eq(eina_array_count(arr_selected), 0);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-}
-EFL_END_TEST
-
-EFL_START_TEST(test_single_select)
-{
-   Efl_Ui_Item *selected = NULL;
-   Efl_Ui_Item *unselected = NULL;
-   Eina_Array *arr_selected;
-
-   efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_SINGLE);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-   fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 0));
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
-   ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 0));
-   selected = NULL;
-   unselected = NULL;
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 0)), EINA_FALSE);
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 2)), EINA_TRUE);
-   ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), 
efl_pack_content_get(item_container, 2));
-   _iterator_to_array(&arr_selected, 
efl_ui_collection_selected_items_get(item_container));
-   ck_assert_int_eq(eina_array_count(arr_selected), 1);
-   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), 
efl_pack_content_get(item_container, 2));
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, NULL);
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-}
-EFL_END_TEST
-
-EFL_START_TEST(test_single_select_always)
-{
-   Efl_Ui_Item *selected = NULL;
-   Efl_Ui_Item *unselected = NULL;
-   Eina_Array *arr_selected;
-
-   efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_SINGLE_ALWAYS);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-   fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 0));
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
-   ck_assert_ptr_eq(unselected, efl_pack_content_get(item_container, 0));
-   selected = NULL;
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, efl_pack_content_get(item_container, 2));
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 0)), EINA_FALSE);
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 2)), EINA_TRUE);
-   ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), 
efl_pack_content_get(item_container, 2));
-   _iterator_to_array(&arr_selected, 
efl_ui_collection_selected_items_get(item_container));
-   ck_assert_int_eq(eina_array_count(arr_selected), 1);
-   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), 
efl_pack_content_get(item_container, 2));
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-}
-EFL_END_TEST
-
-EFL_START_TEST(test_none_select)
-{
-   Efl_Ui_Item *selected = NULL;
-   Efl_Ui_Item *unselected = NULL;
-   Eina_Array *arr_selected;
-
-   efl_ui_select_mode_set(item_container, EFL_UI_SELECT_MODE_NONE);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_add(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-   fill_items(EFL_UI_LIST_DEFAULT_ITEM_CLASS);
-
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 0), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, NULL);
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   efl_ui_selectable_selected_set(efl_pack_content_get(item_container, 2), 
EINA_TRUE);
-   ck_assert_ptr_eq(selected, NULL);
-   ck_assert_ptr_eq(unselected, NULL);
-   selected = NULL;
-   unselected = NULL;
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 0)), EINA_FALSE);
-   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(item_container,
 2)), EINA_FALSE);
-   ck_assert_ptr_eq(efl_ui_collection_last_selected_item_get(item_container), 
NULL);
-   _iterator_to_array(&arr_selected, 
efl_ui_collection_selected_items_get(item_container));
-   ck_assert_int_eq(eina_array_count(arr_selected), 0);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
-   efl_event_callback_del(item_container, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
-}
-EFL_END_TEST
-
-void efl_ui_test_item_container_common_add(TCase *tc)
-{
-   tcase_add_test(tc, test_multi_select);
-   tcase_add_test(tc, test_multi_select_removal);
-   tcase_add_test(tc, test_single_select);
-   tcase_add_test(tc, test_none_select);
-   tcase_add_test(tc, test_single_select_always);
 }
diff --git a/src/tests/elementary/spec/efl_test_multi_selectable.c 
b/src/tests/elementary/spec/efl_test_multi_selectable.c
new file mode 100644
index 0000000000..38c9a9a59e
--- /dev/null
+++ b/src/tests/elementary/spec/efl_test_multi_selectable.c
@@ -0,0 +1,239 @@
+#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.Multi_Selectable",
+       "test-widgets": ["Efl.Ui.Grid", "Efl.Ui.List"],
+       "custom-mapping" : {
+          "Efl.Ui.Grid" : "EFL_UI_GRID_DEFAULT_ITEM_CLASS",
+          "Efl.Ui.List" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS"
+        }
+      }
+
+   spec-meta-end */
+
+
+static void
+_setup(void)
+{
+   Eo *c[3];
+
+   for (int i = 0; i < 3; ++i)
+     {
+        c[i] = create_test_widget();
+        efl_pack_end(widget, c[i]);
+     }
+}
+
+static void
+_set_pointer_quit(void *data, const Efl_Event *ev)
+{
+   Efl_Ui_Item **b = data;
+
+   ck_assert_ptr_eq(*b, NULL);
+   *b = ev->info;
+}
+
+static void
+_iterator_to_array(Eina_Array **arr, Eina_Iterator *iter)
+{
+   Efl_Ui_Widget *widget;
+
+   *arr = eina_array_new(10);
+
+   EINA_ITERATOR_FOREACH(iter, widget)
+     {
+        eina_array_push(*arr, widget);
+     }
+   eina_iterator_free(iter);
+}
+
+EFL_START_TEST(test_multi_select)
+{
+   Efl_Ui_Item *selected = NULL;
+   Efl_Ui_Item *unselected = NULL;
+   Eina_Array *arr_selected;
+   efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_MULTI);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 0));
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
0)), EINA_TRUE);
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
2)), EINA_TRUE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), 
efl_pack_content_get(widget, 2));
+   _iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
+   ck_assert_int_eq(eina_array_count(arr_selected), 2);
+   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), 
efl_pack_content_get(widget, 0));
+   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 1), 
efl_pack_content_get(widget, 2));
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, NULL);
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+}
+EFL_END_TEST
+
+EFL_START_TEST(test_multi_select_removal)
+{
+   Efl_Ui_Item *selected = NULL;
+   Efl_Ui_Item *unselected = NULL;
+   Eina_Array *arr_selected;
+   efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_MULTI);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
+   selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   selected = NULL;//No need to ckeck the flag, we asserted in the tcase before
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_FALSE);
+   ck_assert_ptr_eq(selected, NULL);
+   ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 0));
+   selected = NULL;
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_FALSE);
+   ck_assert_ptr_eq(selected, NULL);
+   ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 2));
+   selected = NULL;
+   unselected = NULL;
+
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), NULL);
+   _iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
+   ck_assert_int_eq(eina_array_count(arr_selected), 0);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+}
+EFL_END_TEST
+
+EFL_START_TEST(test_single_select)
+{
+   Efl_Ui_Item *selected = NULL;
+   Efl_Ui_Item *unselected = NULL;
+   Eina_Array *arr_selected;
+
+   efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_SINGLE);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 0));
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
+   ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 0));
+   selected = NULL;
+   unselected = NULL;
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
0)), EINA_FALSE);
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
2)), EINA_TRUE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), 
efl_pack_content_get(widget, 2));
+   _iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
+   ck_assert_int_eq(eina_array_count(arr_selected), 1);
+   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), 
efl_pack_content_get(widget, 2));
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, NULL);
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+}
+EFL_END_TEST
+
+EFL_START_TEST(test_single_select_always)
+{
+   Efl_Ui_Item *selected = NULL;
+   Efl_Ui_Item *unselected = NULL;
+   Eina_Array *arr_selected;
+
+   efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_SINGLE_ALWAYS);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 0));
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
+   ck_assert_ptr_eq(unselected, efl_pack_content_get(widget, 0));
+   selected = NULL;
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, efl_pack_content_get(widget, 2));
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
0)), EINA_FALSE);
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
2)), EINA_TRUE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), 
efl_pack_content_get(widget, 2));
+   _iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
+   ck_assert_int_eq(eina_array_count(arr_selected), 1);
+   ck_assert_ptr_eq(eina_array_data_get(arr_selected, 0), 
efl_pack_content_get(widget, 2));
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+}
+EFL_END_TEST
+
+EFL_START_TEST(test_none_select)
+{
+   Efl_Ui_Item *selected = NULL;
+   Efl_Ui_Item *unselected = NULL;
+   Eina_Array *arr_selected;
+
+   efl_ui_select_mode_set(widget, EFL_UI_SELECT_MODE_NONE);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_add(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 0), EINA_TRUE);
+   ck_assert_ptr_eq(selected, NULL);
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   efl_ui_selectable_selected_set(efl_pack_content_get(widget, 2), EINA_TRUE);
+   ck_assert_ptr_eq(selected, NULL);
+   ck_assert_ptr_eq(unselected, NULL);
+   selected = NULL;
+   unselected = NULL;
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
0)), EINA_FALSE);
+   
ck_assert_int_eq(efl_ui_selectable_selected_get(efl_pack_content_get(widget, 
2)), EINA_FALSE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), NULL);
+   _iterator_to_array(&arr_selected, efl_ui_selected_items_get(widget));
+   ck_assert_int_eq(eina_array_count(arr_selected), 0);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_SELECTED, 
_set_pointer_quit, &selected);
+   efl_event_callback_del(widget, EFL_UI_EVENT_ITEM_UNSELECTED, 
_set_pointer_quit, &unselected);
+}
+EFL_END_TEST
+
+void
+efl_ui_multi_selectable_behavior_test(TCase *tc)
+{
+   tcase_add_checked_fixture(tc, _setup, NULL);
+   tcase_add_test(tc, test_multi_select);
+   tcase_add_test(tc, test_multi_select_removal);
+   tcase_add_test(tc, test_single_select);
+   tcase_add_test(tc, test_none_select);
+   tcase_add_test(tc, test_single_select_always);
+   efl_ui_single_selectable_behavior_test(tc);
+}
diff --git a/src/tests/elementary/spec/efl_test_single_selectable.c 
b/src/tests/elementary/spec/efl_test_single_selectable.c
new file mode 100644
index 0000000000..c62f78afc4
--- /dev/null
+++ b/src/tests/elementary/spec/efl_test_single_selectable.c
@@ -0,0 +1,56 @@
+#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.Single_Selectable",
+       "test-widgets": ["Efl.Ui.Grid", "Efl.Ui.List"],
+       "custom-mapping" : {
+          "Efl.Ui.Grid" : "EFL_UI_GRID_DEFAULT_ITEM_CLASS",
+          "Efl.Ui.List" : "EFL_UI_LIST_DEFAULT_ITEM_CLASS"
+        }
+      }
+
+   spec-meta-end */
+
+static void
+_setup(void)
+{
+   Eo *c[3];
+
+   for (int i = 0; i < 3; ++i)
+     {
+        c[i] = create_test_widget();
+        if (efl_isa(c[i], EFL_UI_RADIO_CLASS))
+          efl_ui_radio_state_value_set(c[i], i+1);
+        efl_pack_end(widget, c[i]);
+     }
+}
+
+EFL_START_TEST(last_selectable_check)
+{
+   Eo *c1 = efl_pack_content_get(widget, 0);
+   Eo *c2 = efl_pack_content_get(widget, 2);
+
+   efl_ui_selectable_selected_set(c1, EINA_TRUE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), c1);
+
+   efl_ui_selectable_selected_set(c2, EINA_TRUE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), c2);
+   efl_ui_selectable_selected_set(c1, EINA_FALSE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), c2);
+   efl_ui_selectable_selected_set(c2, EINA_FALSE);
+   ck_assert_ptr_eq(efl_ui_single_selectable_last_selected_get(widget), NULL);
+}
+EFL_END_TEST
+
+void
+efl_ui_single_selectable_behavior_test(TCase *tc)
+{
+   tcase_add_checked_fixture(tc, _setup, NULL);
+   tcase_add_test(tc, last_selectable_check);
+}
diff --git a/src/tests/elementary/spec/efl_ui_spec_suite.h 
b/src/tests/elementary/spec/efl_ui_spec_suite.h
index 01be37652d..187d87b0c0 100644
--- a/src/tests/elementary/spec/efl_ui_spec_suite.h
+++ b/src/tests/elementary/spec/efl_ui_spec_suite.h
@@ -19,6 +19,8 @@ void efl_ui_format_behavior_test(TCase *tc);
 void efl_ui_range_display_behavior_test(TCase *tc);
 void efl_ui_range_display_interactive_behavior_test(TCase *tc);
 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_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 d23c3860dc..4de4037eb4 100644
--- a/src/tests/elementary/spec/meson.build
+++ b/src/tests/elementary/spec/meson.build
@@ -8,6 +8,8 @@ efl_ui_suite_behavior_test_files = files([
   'efl_test_range_display.c',
   'efl_test_range_interactive.c',
   'efl_test_ui_view.c',
+  'efl_test_single_selectable.c',
+  'efl_test_multi_selectable.c',
 ])
 
 efl_ui_suite_behavior_src = files([

-- 


Reply via email to