diff options
author | Cedric Bail <cedric@osg.samsung.com> | 2016-07-07 18:01:38 -0700 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2016-09-08 14:51:56 -0700 |
commit | cabaf8ca6b12549c73008aa8ac18c32ec106a304 (patch) | |
tree | 2b595045fe5a7036e11181ba03ccb0a4e86cd64f | |
parent | 2e178e09c666aeca48601e0bd730cb13bdbb3238 (diff) | |
download | efl-cabaf8ca6b12549c73008aa8ac18c32ec106a304.tar.gz |
ecore: add tests for Efl.Promise.
-rw-r--r-- | src/tests/ecore/ecore_test_promise.c | 625 |
1 files changed, 625 insertions, 0 deletions
diff --git a/src/tests/ecore/ecore_test_promise.c b/src/tests/ecore/ecore_test_promise.c index 50df5083b3..d813aca671 100644 --- a/src/tests/ecore/ecore_test_promise.c +++ b/src/tests/ecore/ecore_test_promise.c @@ -376,6 +376,618 @@ START_TEST(ecore_test_promise_progress_promise) } END_TEST +typedef struct _Future_Ok Future_Ok; +struct _Future_Ok +{ + Eina_Bool then : 1; + Eina_Bool cancel : 1; + Eina_Bool progress : 1; +}; + +static void +_then(void *data, const Efl_Event *ev) +{ + Efl_Future_Event_Success *s = ev->info; + int *value = s->value; + Future_Ok *fo = data; + + fail_if(*value != 42); + fo->then = EINA_TRUE; +} + +static void +_cancel(void *data, const Efl_Event *ev) +{ + Efl_Future_Event_Failure *f = ev->info; + Future_Ok *fo = data; + + fail_if(f->error != EINA_ERROR_FUTURE_CANCEL); + fo->cancel = EINA_TRUE; +} + +static void +_progress(void *data, const Efl_Event *ev) +{ + Efl_Future_Event_Progress *p = ev->info; + int *value = p->progress; + Future_Ok *fo = data; + + fail_if(*value != 7); + fo->progress = EINA_TRUE; +} + +static void +_death(void *data, const Efl_Event *ev EINA_UNUSED) +{ + Eina_Bool *death = data; + + *death = EINA_TRUE; +} + +// Test value set after then +START_TEST(efl_test_promise_future_success) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + f = efl_promise_future_get(p); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo)); + + fail_if(deadp || deadf); + + efl_promise_progress_set(p, &progress); + efl_promise_value_set(p, &value, NULL); + + fail_if(!fo.then || fo.cancel || !fo.progress); + fail_if(!deadf || deadp); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +START_TEST(efl_test_promise_future_cancel) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE, none = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + efl_future_use(&f, efl_promise_future_get(p)); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + efl_event_callback_add(p, EFL_PROMISE_EVENT_FUTURE_NONE, _death, &none); + + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo)); + + fail_if(deadp || deadf); + + efl_promise_progress_set(p, &progress); + efl_future_cancel(f); + + efl_promise_value_set(p, &value, NULL); + + fail_if(fo.then || !fo.cancel || !fo.progress); + fail_if(!deadf || deadp); + fail_if(!none); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +// Test value set before then +START_TEST(efl_test_promise_before_future_success) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + f = efl_promise_future_get(p); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + + efl_promise_progress_set(p, &progress); + efl_promise_value_set(p, &value, NULL); + + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo)); + + fail_if(deadp || !deadf); + fail_if(!fo.then || fo.cancel || fo.progress); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +START_TEST(efl_test_promise_before_future_cancel) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE, none = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + efl_future_use(&f, efl_promise_future_get(p)); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + efl_event_callback_add(p, EFL_PROMISE_EVENT_FUTURE_NONE, _death, &none); + + efl_promise_progress_set(p, &progress); + efl_future_cancel(f); + + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo)); + + fail_if(deadp || !deadf); + + efl_promise_value_set(p, &value, NULL); + + fail_if(fo.then || !fo.cancel || fo.progress); + fail_if(!none); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +static void +_chain_then(void *data, const Efl_Event *ev) +{ + Efl_Future_Event_Success *s = ev->info; + int *v = s->value; + Future_Ok *fo = data; + + fo->then = EINA_TRUE; + + fail_if(*v != 42); + + efl_promise_value_set(s->next, v, NULL); +} + +static void +_chain_fail(void *data, const Efl_Event *ev) +{ + Efl_Future_Event_Failure *f = ev->info; + Future_Ok *fo = data; + + fo->cancel = EINA_TRUE; + + efl_promise_failed(f->next, f->error); +} + +static void +_chain_progress(void *data, const Efl_Event *ev) +{ + Efl_Future_Event_Progress *p = ev->info; + Future_Ok *fo = data; + + fo->progress = EINA_TRUE; + + efl_promise_progress_set(p->next, p->progress); +} + +// Test chained then +START_TEST(efl_test_promise_future_chain_success) +{ + Efl_Promise *p; + Efl_Future *f1, *f2; + Future_Ok fo1 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo2 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf1 = EINA_FALSE, deadf2 = EINA_FALSE, deadp = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + f1 = efl_promise_future_get(p); + fail_if(!f1); + + efl_event_callback_add(f1, EFL_EVENT_DEL, _death, &deadf1); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + + f2 = efl_future_then(f1, _chain_then, _chain_fail, _chain_progress, &fo1); + fail_if(!f2); + + efl_event_callback_add(f2, EFL_EVENT_DEL, _death, &deadf2); + + fail_if(!efl_future_then(f2, _then, _cancel, _progress, &fo2)); + + fail_if(deadp || deadf1 || deadf2); + + efl_promise_progress_set(p, &progress); + efl_promise_value_set(p, &value, NULL); + + fail_if(!fo1.then || fo1.cancel || !fo1.progress); + fail_if(!fo2.then || fo2.cancel || !fo2.progress); + fail_if(!deadf1 || !deadf2 || deadp); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +START_TEST(efl_test_promise_future_chain_cancel) +{ + Efl_Promise *p; + Efl_Future *f1, *f2; + Future_Ok fo1 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo2 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf1 = EINA_FALSE, deadf2 = EINA_FALSE, deadp = EINA_FALSE, none = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + efl_future_use(&f1, efl_promise_future_get(p)); + fail_if(!f1); + + efl_event_callback_add(f1, EFL_EVENT_DEL, _death, &deadf1); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + efl_event_callback_add(p, EFL_PROMISE_EVENT_FUTURE_NONE, _death, &none); + + f2 = efl_future_then(f1, _chain_then, _chain_fail, _chain_progress, &fo1); + fail_if(!f2); + + efl_event_callback_add(f2, EFL_EVENT_DEL, _death, &deadf2); + + fail_if(!efl_future_then(f2, _then, _cancel, _progress, &fo2)); + + fail_if(deadp || deadf1 || deadf2); + + efl_promise_progress_set(p, &progress); + efl_future_cancel(f1); + + efl_promise_value_set(p, &value, NULL); + + fail_if(fo1.then || !fo1.cancel || !fo1.progress); + fail_if(fo2.then || !fo2.cancel || !fo2.progress); + fail_if(!deadf1 || !deadf2 || deadp); + fail_if(!none); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +// Test value set after multi then +START_TEST(efl_test_promise_future_multi_success) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo1 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo2 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + f = efl_promise_future_get(p); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + + efl_ref(f); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo1)); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo2)); + efl_unref(f); + + fail_if(deadp || deadf); + + efl_promise_progress_set(p, &progress); + efl_promise_value_set(p, &value, NULL); + + fail_if(!fo1.then || fo1.cancel || !fo1.progress); + fail_if(!fo2.then || fo2.cancel || !fo2.progress); + fail_if(!deadf || deadp); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +START_TEST(efl_test_promise_future_multi_cancel) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo1 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo2 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE, none = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + efl_future_use(&f, efl_promise_future_get(p)); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + efl_event_callback_add(p, EFL_PROMISE_EVENT_FUTURE_NONE, _death, &none); + + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo1)); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo2)); + + fail_if(deadp || deadf); + + efl_promise_progress_set(p, &progress); + efl_future_cancel(f); + + efl_promise_value_set(p, &value, NULL); + + fail_if(fo1.then || !fo1.cancel || !fo1.progress); + fail_if(fo2.then || !fo2.cancel || !fo2.progress); + fail_if(!deadf || deadp); + fail_if(!none); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +// Test value set before multi then +START_TEST(efl_test_promise_before_future_multi_success) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo1 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo2 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + f = efl_promise_future_get(p); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + + efl_promise_progress_set(p, &progress); + efl_promise_value_set(p, &value, NULL); + + efl_ref(f); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo1)); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo2)); + efl_unref(f); + + fail_if(deadp || !deadf); + fail_if(!fo1.then || fo1.cancel || fo1.progress); + fail_if(!fo2.then || fo2.cancel || fo2.progress); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +START_TEST(efl_test_promise_before_future_multi_cancel) +{ + Efl_Promise *p; + Efl_Future *f; + Future_Ok fo1 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo2 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Future_Ok fo3 = { EINA_FALSE, EINA_FALSE, EINA_FALSE }; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE, none = EINA_FALSE; + int progress = 7; + int value = 42; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + efl_future_use(&f, efl_promise_future_get(p)); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + efl_event_callback_add(p, EFL_PROMISE_EVENT_FUTURE_NONE, _death, &none); + + efl_promise_progress_set(p, &progress); + efl_future_cancel(f); + + efl_ref(f); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo1)); + fail_if(!efl_future_then(f, _then, _cancel, _progress, &fo2)); + efl_unref(f); + + fail_if(efl_future_then(f, _then, _cancel, _progress, &fo3)); + + fail_if(deadp || !deadf); + + efl_promise_value_set(p, &value, NULL); + + fail_if(fo1.then || !fo1.cancel || fo1.progress); + fail_if(fo2.then || !fo2.cancel || fo2.progress); + fail_if(fo3.then || fo3.cancel || fo3.progress); + fail_if(!none); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + +static Eina_Bool cleanup = EINA_FALSE; + +static void +_cleanup_called(void *s EINA_UNUSED) +{ + cleanup = EINA_TRUE; +} + +// Test optional value set without then +START_TEST(efl_test_promise_future_optional_success) +{ + Efl_Promise *p; + Efl_Future *f; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE; + int progress = 7; + int value = 42; + + cleanup = EINA_FALSE; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + f = efl_promise_future_get(p); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + + fail_if(deadp || deadf); + + efl_promise_progress_set(p, &progress); + efl_promise_value_set(p, &value, _cleanup_called); + + fail_if(deadf || deadp); + + ecore_main_loop_iterate(); + + fail_if(!deadf); + + efl_del(p); + + fail_if(!deadp || !cleanup); + + ecore_shutdown(); +} +END_TEST + +START_TEST(efl_test_promise_future_optional_cancel) +{ + Efl_Promise *p; + Efl_Future *f; + Eina_Bool deadf = EINA_FALSE, deadp = EINA_FALSE, none = EINA_FALSE; + int progress = 7; + int value = 42; + + cleanup = EINA_FALSE; + + ecore_init(); + + p = efl_add(EFL_PROMISE_CLASS, ecore_main_loop_get()); + fail_if(!p); + + efl_future_use(&f, efl_promise_future_get(p)); + fail_if(!f); + + efl_event_callback_add(f, EFL_EVENT_DEL, _death, &deadf); + efl_event_callback_add(p, EFL_EVENT_DEL, _death, &deadp); + efl_event_callback_add(p, EFL_PROMISE_EVENT_FUTURE_NONE, _death, &none); + + fail_if(deadp || deadf); + + efl_promise_progress_set(p, &progress); + efl_future_cancel(f); + + efl_promise_value_set(p, &value, _cleanup_called); + + fail_if(deadf || deadp); + fail_if(!none); + + ecore_main_loop_iterate(); + + fail_if(!deadf || deadp); + + efl_del(p); + + fail_if(!deadp); + + ecore_shutdown(); +} +END_TEST + void ecore_test_ecore_promise(TCase *tc) { tcase_add_test(tc, ecore_test_promise); @@ -390,4 +1002,17 @@ void ecore_test_ecore_promise(TCase *tc) tcase_add_test(tc, ecore_test_promise_immediate_set_lifetime_all); tcase_add_test(tc, ecore_test_promise_cancel_promise); tcase_add_test(tc, ecore_test_promise_progress_promise); + + tcase_add_test(tc, efl_test_promise_future_success); + tcase_add_test(tc, efl_test_promise_future_cancel); + tcase_add_test(tc, efl_test_promise_future_chain_success); + tcase_add_test(tc, efl_test_promise_future_chain_cancel); + tcase_add_test(tc, efl_test_promise_before_future_success); + tcase_add_test(tc, efl_test_promise_before_future_cancel); + tcase_add_test(tc, efl_test_promise_future_multi_success); + tcase_add_test(tc, efl_test_promise_future_multi_cancel); + tcase_add_test(tc, efl_test_promise_before_future_multi_success); + tcase_add_test(tc, efl_test_promise_before_future_multi_cancel); + tcase_add_test(tc, efl_test_promise_future_optional_success); + tcase_add_test(tc, efl_test_promise_future_optional_cancel); } |