diff options
Diffstat (limited to 'src/tests/efl/efl_test_model_container.c')
-rw-r--r-- | src/tests/efl/efl_test_model_container.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/tests/efl/efl_test_model_container.c b/src/tests/efl/efl_test_model_container.c new file mode 100644 index 0000000000..5710ef2337 --- /dev/null +++ b/src/tests/efl/efl_test_model_container.c @@ -0,0 +1,171 @@ +/* EFL - EFL library + * Copyright (C) 2013 Cedric Bail + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; + * if not, see <http://www.gnu.org/licenses/>. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "efl_suite.h" + +#include <Efl.h> +#include <Ecore.h> + +typedef struct _Test_Container_Data { + int item_count; + Eina_Bool pass_flag; + Eina_Bool fail_flag; +} Test_Container_Data; + +typedef struct _Test_Container_Item_Data { + Test_Container_Data* test_data; + unsigned int index; +} Test_Container_Item_Data; + +const int base_int[7] = {10, 11, 12, 13, 14, 0, 16}; +const char * const base_str[7] = {"A", "B", "C", "D", "E", "", "GH"}; + +static void +_future_error_then(void *data EINA_UNUSED, Efl_Event const* event EINA_UNUSED) +{ + ck_abort_msg("Promise failed"); +} + +static void +_container_property_get_then(void *data, Efl_Event const *event) +{ + Eina_Accessor *value_itt = (Eina_Accessor*)((Efl_Future_Event_Success*)event->info)->value; + Test_Container_Item_Data *test_item_data = data; + Eina_Value *value_int = NULL; + Eina_Value *value_str = NULL; + int cmp_int = 0; + const char *cmp_str = NULL; + + test_item_data->test_data->item_count++; + + if (!value_itt || !eina_accessor_data_get(value_itt, 0, (void**)&value_int) || + !eina_accessor_data_get(value_itt, 1, (void**)&value_str)) + { + test_item_data->test_data->fail_flag = EINA_TRUE; + ecore_main_loop_quit(); + return; + } + + eina_value_get(value_int, &cmp_int); + eina_value_get(value_str, &cmp_str); + + if (cmp_int != base_int[test_item_data->index] || + strcmp(cmp_str, base_str[test_item_data->index]) != 0) + { + test_item_data->test_data->fail_flag = EINA_TRUE; + } + + if (test_item_data->test_data->item_count == 7) + { + test_item_data->test_data->pass_flag = EINA_TRUE; + } + ecore_main_loop_quit(); +} + +static void +_children_slice_future_then(void *data, Efl_Event const *event) +{ + Eina_Accessor *children_accessor = (Eina_Accessor *)((Efl_Future_Event_Success*)event->info)->value; + unsigned int i = 0; + Efl_Model *child; + + if (children_accessor) + { + EINA_ACCESSOR_FOREACH(children_accessor, i, child) + { + Efl_Future *futures[3] = {NULL,}; + Efl_Future *future_all = NULL; + Test_Container_Item_Data *test_item_data = calloc(1, sizeof(Test_Container_Item_Data)); + + test_item_data->test_data = data; + test_item_data->index = i; + + futures[0] = efl_model_property_get(child, "test_p_int"); + futures[1] = efl_model_property_get(child, "test_p_str"); + + future_all = efl_future_all(futures[0], futures[1]); + efl_future_then(future_all, _container_property_get_then, _future_error_then, NULL, test_item_data); + } + } +} + + +START_TEST(efl_test_model_container_values) +{ + Efl_Model_Container* model; + Efl_Future *future; + Test_Container_Data test_data; + int **cmp_int; + const char **cmp_str; + int i; + + fail_if(!ecore_init(), "ERROR: Cannot init Ecore!\n"); + fail_if(!efl_object_init(), "ERROR: Cannot init EO!\n"); + + cmp_int = calloc(8, sizeof(int*)); + cmp_str = calloc(8, sizeof(const char*)); + for (i = 0; i < 7; ++i) + { + cmp_int[i] = calloc(1, sizeof(int)); + *(cmp_int[i]) = base_int[i]; + cmp_str[i] = strdup(base_str[i]); + } + + model = efl_add(EFL_MODEL_CONTAINER_CLASS, NULL); + + efl_model_container_child_property_add(model, "test_p_int", EINA_VALUE_TYPE_INT, + eina_carray_iterator_new((void**)cmp_int)); + + efl_model_container_child_property_add(model, "test_p_str", EINA_VALUE_TYPE_STRING, + eina_carray_iterator_new((void**)cmp_str)); + + for (i = 0; i < 7; ++i) + { + free(cmp_int[i]); + free((void*)cmp_str[i]); + } + free(cmp_int); + free(cmp_str); + + future = efl_model_children_slice_get(model, 0, 0); + + test_data.item_count = 0; + test_data.pass_flag = EINA_FALSE; + test_data.fail_flag = EINA_FALSE; + + efl_future_then(future, _children_slice_future_then, _future_error_then, NULL, &test_data); + + ecore_main_loop_iterate(); + + ck_assert(!!test_data.pass_flag); + ck_assert(!test_data.fail_flag); + + ecore_shutdown(); +} +END_TEST + + +void +efl_test_case_model_container(TCase *tc) +{ + tcase_add_test(tc, efl_test_model_container_values); +} |