diff options
author | Larry Lira <larry@expertisesolutions.com.br> | 2018-09-04 20:47:23 -0300 |
---|---|---|
committer | Felipe Magno de Almeida <felipe@expertisesolutions.com.br> | 2019-06-10 11:58:10 -0300 |
commit | 7f068211069b0f9d5f87610eaf9170b977604775 (patch) | |
tree | c49c69a45c8536f51758d8befbd7c50d90f1288c | |
parent | 6e048a4069e0d938f8e678126385b40331e84f2e (diff) | |
download | efl-7f068211069b0f9d5f87610eaf9170b977604775.tar.gz |
eolian: Added Eolian test generatordevs/felipealmeida/tctautomated
The test generator allows templates to be used to generate boilerplate
for unit tests
46 files changed, 1414 insertions, 1 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 9675fc193b..f1e013645d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,6 +87,8 @@ include Makefile_Elua.am include Makefile_Wayland_Protocols.am +include Makefile_Automated.am + if HAVE_JS AM_V_CP = $(am__v_CP_@AM_V@) am__v_CP_ = $(am__v_CP_@AM_DEFAULT_V@) diff --git a/src/Makefile_Automated.am b/src/Makefile_Automated.am new file mode 100644 index 0000000000..77115b2443 --- /dev/null +++ b/src/Makefile_Automated.am @@ -0,0 +1,309 @@ + +if EFL_ENABLE_TESTS + +#AM_TESTS_ENVIRONMENT += EOLIAN_SO_DIR='$(top_builddir)/src/lib/eolian/.libs/'; export EOLIAN_SO_DIR; +#gen_eolian_dir = EOLIAN_SO_DIR='$(top_builddir)/src/lib/eolian/.libs/' +TEST_GEN = $(top_srcdir)/src/scripts/testgen/testgen.py + +#### ecore #### +#ecore_automated_source = tests/automated/ecore_suite_automated.c +#ecore_automated_suite = $(top_builddir)/src/$(ecore_automated_source) +#$(ecore_automated_source): +# $(TEST_GEN) automated ecore $(top_builddir)/src/$@ $(ecore_eolian_files) +# +#check_PROGRAMS += tests/automated/ecore_suite_automated +#TESTS += tests/automated/ecore_suite_automated +# +#tests_automated_ecore_suite_automated_SOURCE = $(ecore_automated_source) +#tests_automated_ecore_suite_automated_CPPFLAGS = $(tests_ecore_ecore_suite_CPPFLAGS) \ +#-I$(top_srcdir)/src/tests \ +#@ELEMENTARY_CFLAGS@ +#tests_automated_ecore_suite_automated_LDADD = $(tests_ecore_ecore_suite_LDADD) @USE_ELEMENTARY_LIBS@ + +#### ecore_audio #### +ecore_audio_automated_source = tests/automated/ecore_audio_suite_automated.c +ecore_audio_automated_suite = $(top_builddir)/src/$(ecore_audio_automated_source) +$(ecore_audio_automated_source): + $(TEST_GEN) automated ecore_audio $(top_builddir)/src/$@ $(ecore_audio_eolian_files) + +check_PROGRAMS += tests/automated/ecore_audio_suite_automated +TESTS += tests/automated/ecore_audio_suite_automated + +tests_automated_ecore_audio_suite_automated_SOURCE = $(ecore_audio_automated_source) +tests_automated_ecore_audio_suite_automated_CPPFLAGS = $(tests_ecore_ecore_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ECORE_AUDIO_CFLAGS@ \ +@ECORE_FILE_CFLAGS@ \ +@ELEMENTARY_CFLAGS@ +tests_automated_ecore_audio_suite_automated_LDADD = $(tests_ecore_ecore_suite_LDADD) @USE_ELEMENTARY_LIBS@ + +#### ecore_con #### +#ecore_con_automated_source = tests/automated/ecore_con_suite_automated.c +#ecore_con_automated_suite = $(top_builddir)/src/$(ecore_con_automated_source) +#$(ecore_con_automated_source): +# $(TEST_GEN) automated ecore_con $(top_builddir)/src/$@ $(ecore_eolian_files) +# +#check_PROGRAMS += tests/automated/ecore_con_suite_automated +#TESTS += tests/automated/ecore_con_suite_automated +# +#tests_automated_ecore_con_suite_automated_SOURCE = $(ecore_automated_source) +#tests_automated_ecore_con_suite_automated_CPPFLAGS = $(tests_ecore_con_ecore_con_suite_CPPFLAGS) \ +#-I$(top_srcdir)/src/tests \ +#@ELEMENTARY_CFLAGS@ +#tests_automated_ecore_con_suite_automated_LDADD = $(tests_ecore_con_ecore_con_suite_LDADD) @USE_ELEMENTARY_LIBS@ +#tests_automated_ecore_con_suite_automated_DEPENDENCIES = $(tests_ecore_con_ecore_con_suite_DEPENDENCIES) + +#### ector #### +ector_automated_source = tests/automated/ector_suite_automated.c +ector_automated_suite = $(top_builddir)/src/$(ector_automated_source) +$(ector_automated_source): +# $(TEST_GEN) automated ector $(top_builddir)/src/$@ $(ector_eolian_files_generic) + $(TEST_GEN) automated ector $(top_builddir)/src/$@ $(ector_eolian_files) + +check_PROGRAMS += tests/automated/ector_suite_automated +TESTS += tests/automated/ector_suite_automated + +tests_automated_ector_suite_automated_SOURCE = $(ector_automated_source) +tests_automated_ector_suite_automated_CPPFLAGS = $(tests_ector_suite_ector_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ELEMENTARY_CFLAGS@ +tests_automated_ector_suite_automated_LDADD = $(tests_ector_suite_ector_suite_LDADD) @USE_ECORE_LIBS@ +tests_automated_ector_suite_automated_DEPENDENCIES = @USE_ECTOR_INTERNAL_LIBS@ + +#### edje #### +edje_automated_source = tests/automated/edje_suite_automated.c +edje_automated_suite = $(top_builddir)/src/$(edje_automated_source) +$(edje_automated_source): + $(TEST_GEN) automated edje $(top_builddir)/src/$@ $(edje_eolian_files) + +check_PROGRAMS += tests/automated/edje_suite_automated +TESTS += tests/automated/edje_suite_automated + +tests_automated_edje_suite_automated_SOURCE = $(edje_automated_source) +tests_automated_edje_suite_automated_CPPFLAGS = $(tests_edje_edje_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ELEMENTARY_CFLAGS@ +tests_automated_edje_suite_automated_LDADD = $(tests_edje_edje_suite_LDADD) @USE_ECORE_LIBS@ +tests_automated_edje_suite_automated_DEPENDENCIES = @USE_EDJE_INTERNAL_LIBS@ + +#### efl #### +efl_automated_source = tests/automated/efl_suite_automated.c +efl_automated_suite = $(top_builddir)/src/$(efl_automated_source) +$(efl_automated_source): + $(TEST_GEN) automated efl $(top_builddir)/src/$@ $(efl_eolian_files) + +check_PROGRAMS += tests/automated/efl_suite_automated +TESTS += tests/automated/efl_suite_automated + +tests_automated_efl_suite_automated_SOURCE = $(efl_automated_source) +tests_automated_efl_suite_automated_CPPFLAGS = $(tests_efl_efl_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ELEMENTARY_CFLAGS@ +tests_automated_efl_suite_automated_LDADD = \ +@CHECK_LIBS@ \ +@EFL_LIBS@ \ +@USE_EFL_LIBS@ \ +@USE_ECORE_LIBS@ +tests_automated_efl_suite_automated_DEPENDENCIES = \ +@USE_EFL_INTERNAL_LIBS@ \ +@USE_ECORE_INTERNAL_LIBS@ + + +##### eio #### +eio_automated_source = tests/automated/eio_suite_automated.c +eio_automated_suite = $(top_builddir)/src/$(eio_automated_source) +$(eio_automated_source): + $(TEST_GEN) automated eio $(top_builddir)/src/$@ $(eio_eolian_files) + +check_PROGRAMS += tests/automated/eio_suite_automated +TESTS += tests/automated/eio_suite_automated + +tests_automated_eio_suite_automated_SOURCE = $(eio_automated_source) +tests_automated_eio_suite_automated_CPPFLAGS = $(tests_eio_eio_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ELEMENTARY_CFLAGS@ +tests_automated_eio_suite_automated_LDADD = $(tests_eio_eio_suite_LDADD) \ +@USE_ECORE_LIBS@ +tests_automated_eio_suite_automated_DEPENDENCIES = \ +@USE_EIO_INTERNAL_LIBS@ + +#### eldbus #### +eldbus_automated_source = tests/automated/eldbus_suite_automated.c +eldbus_automated_suite = $(top_builddir)/src/$(eldbus_automated_source) +$(eldbus_automated_source): + $(TEST_GEN) automated eldbus $(top_builddir)/src/$@ $(eldbus_eolian_files) + +check_PROGRAMS += tests/automated/eldbus_suite_automated +TESTS += tests/automated/eldbus_suite_automated + +tests_automated_eldbus_suite_automated_SOURCE = $(eldbus_automated_source) +tests_automated_eldbus_suite_automated_CPPFLAGS = $(tests_eldbus_eldbus_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ELEMENTARY_CFLAGS@ +tests_automated_eldbus_suite_automated_LDADD = $(tests_eldbus_eldbus_suite_LDADD) \ +@USE_ECORE_LIBS@ +tests_automated_eldbus_suite_automated_DEPENDENCIES = @USE_ELDBUS_INTERNAL_LIBS@ + +#### emotion #### +emotion_automated_source = tests/automated/emotion_suite_automated.c +emotion_automated_suite = $(top_builddir)/src/$(emotion_automated_source) +$(emotion_automated_source): + $(TEST_GEN) automated emotion $(top_builddir)/src/$@ $(emotion_eolian_files) + +check_PROGRAMS += tests/automated/emotion_suite_automated +TESTS += tests/automated/emotion_suite_automated + +tests_automated_emotion_suite_automated_SOURCE = $(emotion_automated_source) +tests_automated_emotion_suite_automated_CPPFLAGS = $(tests_emotion_emotion_test_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +-DTESTS_BUILD_DIR=\"$(top_builddir)/src/tests/automated\" \ +@ELEMENTARY_CFLAGS@ +tests_automated_emotion_suite_automated_LDADD = $(tests_emotion_emotion_test_LDADD) \ +@USE_ECORE_LIBS@ \ +@USE_EO_LIBS@ \ +@CHECK_LIBS@ +tests_automated_emotion_suite_automated_DEPENDENCIES = $(tests_emotion_emotion_test_DEPENDENCIES) \ +@USE_EO_INTERNAL_LIBS@ + +#### eo #### +eo_automated_source = tests/automated/eo_suite_automated.c +eo_automated_suite = $(top_builddir)/src/$(eo_automated_source) +$(eo_automated_source): + $(TEST_GEN) automated eo $(top_builddir)/src/$@ $(eo_eolian_files) + +check_PROGRAMS += tests/automated/eo_suite_automated +TESTS += tests/automated/eo_suite_automated + +tests_automated_eo_suite_automated_SOURCE = $(eo_automated_source) +tests_automated_eo_suite_automated_CPPFLAGS = $(tests_eo_eo_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +@ELEMENTARY_CFLAGS@ +tests_automated_eo_suite_automated_LDADD = $(tests_eo_eo_suite_LDADD) \ +@USE_ECORE_LIBS@ +tests_automated_eo_suite_automated_DEPENDENCIES = $(tests_eo_eo_suite_DEPENDENCIES) + +#### evas #### +evas_automated_source = tests/automated/evas_suite_automated.c +evas_automated_suite = $(top_builddir)/src/$(evas_automated_source) +$(evas_automated_source): + $(TEST_GEN) automated evas $(top_builddir)/src/$@ $(evas_eolian_files) + +check_PROGRAMS += tests/automated/evas_suite_automated +TESTS += tests/automated/evas_suite_automated + +tests_automated_evas_suite_automated_SOURCE = $(evas_automated_source) +tests_automated_evas_suite_automated_CPPFLAGS = $(tests_evas_evas_suite_CPPFLAGS) \ +-I$(top_srcdir)/src/tests \ +-I$(top_srcdir)/src/lib/evas/canvas \ +-I$(top_srcdir)/src/lib/evas/include \ +@ELEMENTARY_CFLAGS@ +tests_automated_evas_suite_automated_LDADD = $(tests_evas_evas_suite_LDADD) \ +@USE_ECORE_LIBS@ +tests_automated_evas_suite_automated_DEPENDENCIES = $(tests_evas_evas_suite_DEPENDENCIES) + + +if HAVE_CSHARP +#### EFL MONO #### + +tests_efl_mono_base = \ + tests/efl_mono/Main.cs \ + tests/efl_mono/TestUtils.cs + +## Mono Ecore ## + +mono_ecore_automated_source = tests/automated/ecore_suite_automated.cs +mono_ecore_automated_bin = tests/automated/efl_mono_ecore$(EXEEXT) + +check_PROGRAMS += $(mono_ecore_automated_bin) +TESTS += $(mono_ecore_automated_bin) + +tests_automated_efl_mono_ecore_SOURCE = \ + $(tests_efl_mono_base) \ + $(mono_ecore_automated_source) + +tests/automated/efl_mono_ecore$(EXEEXT): $(tests_automated_efl_mono_ecore_SOURCE) lib/efl_mono/libefl_mono.dll tests/efl_mono/efl_mono$(EXEEXT).config + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCSFLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll -out:$@ $(filter %.cs, $(^)) + +$(mono_ecore_automated_source): + $(TEST_GEN) automated ecore $(top_builddir)/src/$@ $(filter-out $(ecore_eolian_blacklisted_files:%.eo.cs=%.eo),$(ecore_eolian_files_public)) + +## Mono Eo ## + +mono_eo_automated_source = tests/automated/eo_suite_automated.cs +mono_eo_automated_bin = tests/automated/efl_mono_eo$(EXEEXT) + +check_PROGRAMS += $(mono_eo_automated_bin) +TESTS += $(mono_eo_automated_bin) + +tests_automated_efl_mono_eo_SOURCE = \ + $(tests_efl_mono_base) \ + $(mono_eo_automated_source) + +tests/automated/efl_mono_eo$(EXEEXT): $(tests_automated_efl_mono_eo_SOURCE) lib/efl_mono/libefl_mono.dll tests/efl_mono/efl_mono$(EXEEXT).config + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCSFLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll -out:$@ $(filter %.cs, $(^)) + +$(mono_eo_automated_source): + $(TEST_GEN) automated eo $(top_builddir)/src/$@ $(filter-out $(eo_eolian_blacklisted_files:%.eo.cs=%.eo),$(eo_eolian_files)) + +## Mono Efl ## + +mono_efl_automated_source = tests/automated/efl_suite_automated.cs +mono_efl_automated_bin = tests/automated/efl_mono_efl$(EXEEXT) + +check_PROGRAMS += $(mono_efl_automated_bin) +TESTS += $(mono_efl_automated_bin) + +tests_automated_efl_mono_efl_SOURCE = \ + $(tests_efl_mono_base) \ + $(mono_efl_automated_source) + +tests/automated/efl_mono_efl$(EXEEXT): $(tests_automated_efl_mono_efl_SOURCE) lib/efl_mono/libefl_mono.dll tests/efl_mono/efl_mono$(EXEEXT).config + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCSFLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll -out:$@ $(filter %.cs, $(^)) + +$(mono_efl_automated_source): + $(TEST_GEN) automated efl $(top_builddir)/src/$@ $(filter-out $(efl_eolian_blacklisted_files:%.eo.cs=%.eo),$(efl_eolian_files)) + +## Mono Edje ## + +mono_edje_automated_source = tests/automated/edje_suite_automated.cs +mono_edje_automated_bin = tests/automated/efl_mono_edje$(EXEEXT) + +check_PROGRAMS += $(mono_edje_automated_bin) +TESTS += $(mono_edje_automated_bin) + +tests_automated_efl_mono_edje_SOURCE = \ + $(tests_efl_mono_base) \ + $(mono_edje_automated_source) + +tests/automated/efl_mono_edje$(EXEEXT): $(tests_automated_efl_mono_edje_SOURCE) lib/efl_mono/libefl_mono.dll tests/efl_mono/efl_mono$(EXEEXT).config + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCSFLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll -out:$@ $(filter %.cs, $(^)) + +$(mono_edje_automated_source): + $(TEST_GEN) automated edje $(top_builddir)/src/$@ $(filter-out $(edje_eolian_blacklisted_files:%.eo.cs=%.eo),$(edje_eolian_files)) + +## Mono Elementary ## + +mono_elementary_automated_source = tests/automated/elementary_suite_automated.cs +mono_elementary_automated_bin = tests/automated/efl_mono_elementary$(EXEEXT) + +check_PROGRAMS += $(mono_elementary_automated_bin) +TESTS += $(mono_elementary_automated_bin) + +tests_automated_efl_mono_elementary_SOURCE = \ + $(tests_efl_mono_base) \ + $(mono_elementary_automated_source) + +tests/automated/efl_mono_elementary$(EXEEXT): $(tests_automated_efl_mono_elementary_SOURCE) lib/efl_mono/libefl_mono.dll tests/efl_mono/efl_mono$(EXEEXT).config + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCSFLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll -out:$@ $(filter %.cs, $(^)) + +$(mono_elementary_automated_source): + $(TEST_GEN) automated elementary $(top_builddir)/src/$@ $(filter-out $(elementary_eolian_blacklisted_files:%.eo.cs=%.eo),$(elm_public_eolian_files)) + + +endif +endif diff --git a/src/scripts/pyolian/eolian.py b/src/scripts/pyolian/eolian.py index d5c99a1990..482964da49 100644 --- a/src/scripts/pyolian/eolian.py +++ b/src/scripts/pyolian/eolian.py @@ -918,7 +918,7 @@ class Function(Object): return Type(c_type) if c_type else None def return_default_value(self, ftye): - c_expr = lib.eolian_function_return_default_value_get(sel._obj, ftype) + c_expr = lib.eolian_function_return_default_value_get(self._obj, ftype) return Expression(c_expr) if c_expr else None def return_documentation(self, ftype): diff --git a/src/scripts/pyolian/eolian_lib.py b/src/scripts/pyolian/eolian_lib.py index d8ee7f04d9..bddf9ff74b 100644 --- a/src/scripts/pyolian/eolian_lib.py +++ b/src/scripts/pyolian/eolian_lib.py @@ -14,6 +14,7 @@ root_path = os.path.abspath(os.path.join(script_path, '..', '..', '..')) search_in = [ os.path.join(root_path, 'src', 'lib', 'eolian', '.libs'), os.path.join(root_path, 'build', 'src', 'lib', 'eolian'), + os.path.join(root_path, 'build', 'src', 'lib', 'eolian', '.libs'), ] if 'EOLIAN_SO_DIR' in os.environ: diff --git a/src/scripts/pyolian/pyratemp.py b/src/scripts/pyolian/pyratemp.py index c28e260b4b..1ddfb773fc 100644 --- a/src/scripts/pyolian/pyratemp.py +++ b/src/scripts/pyolian/pyratemp.py @@ -846,6 +846,8 @@ class EvalPseudoSandbox: "complex" : builtins.complex, "dict" : builtins.dict, "enumerate" : builtins.enumerate, + "filter" : builtins.filter, + "next" : builtins.next, "float" : builtins.float, "int" : builtins.int, "list" : builtins.list, diff --git a/src/scripts/testgen/README.md b/src/scripts/testgen/README.md new file mode 100644 index 0000000000..4531f636db --- /dev/null +++ b/src/scripts/testgen/README.md @@ -0,0 +1,146 @@ + +Testgen: Template-based Eolian tests generator +=============================================================================== + +Testgen is a Python Script using the Pyolian to generate tests rendering +templates with custom files, this can be a easy way to expand the +API test coveraged. + +Testgen can generate tests C and to other bingings languages only +adding new language specialized templates. + +Installation +============ + +There is nothing to install to use the generator, everything is included in +the efl source tree and it is intended to work directly inside the tree, +usually at efl tests compilation time (make check). + +The only requirement is that **the source tree must be already built** (not +installed) because pyolian search the eolian .so/.dll inside the source tree. + +If you built the efl tree in a custom location (fe, you build out-of-tree) you +can tell pyolian where to find the built eolian .so files using the +`EOLIAN_SO_DIR` environment variable. + + +Command line usage +================== + +The simplest way to use the generator is from the command line, using the +`src/scripts/testgen/testgen.py` command, the `--help` option state: + +``` +usage: testgen.py [-h] testname suitename filename [eofiles [eofiles ...]] + +Eolian Test Generator. + +positional arguments: + testname The Test Name used to find custom and template files. (REQUIRED) + suitename The Suite Name used to find custom files. (REQUIRED) + filename Generated test file destination. (REQUIRED) + eofiles The Eolian Files to use. + +optional arguments: + -h, --help show this help message and exit +``` +Use .c extension in <filename> to generate C tests or .cs to CSharp + +To test this generator in `src/scripts/testgen` you can run: +``` +./testgen.py automated efl efl_automated_test.c efl_loop.eo +``` +This will rendere the automated tests using files in `src/tests/automated` with +suite name `efl_automated` and with Efl.Loop Class as Test Case +`efl_automated_efl_loop_test` + +or run: +``` +./testgen.py automated eio eio_automated_test.c eio_sentry.eo eio_model.eo +``` +This will rendere with suite name `eio_automated` and with Eio.Sentry and +Eio.Model Class as Test Cases `eio_automated_eio_sentry_test` and +`eio_automated_eio_model_test` + + +How customise a Generated Test +============================== + +Testgen use the filesystem to find custom files if you need customise a test, +add/write follow files in src/tests: + + Suite custom files + * `src/test/<testname>/` + |-> <suitename>_custom.c #add include files, functions or structs + |-> <suitename>_init.c #add code in SUITE_INIT + |-> <suitename>_shutdown.c #add code in SUITE_SHUTDOWN + + Class Test case custom files + * `src/test/<testname>/<class_name>/` #use lowercase and `_` separator + |-> custom.c #add include files, functions or structs + |-> init.c #add default way to create the object of this class + |-> shutdown.c #add default way to free the object + +Funtions Tests +- Tests methodes custom files + * `src/test/<testname>/<class_name>/<method_name>` + |-> arg_init.c #initialize method arguments (arg_<argument_name>) + |-> init.c #add how to create the object (replace default) + |-> arg_shutdown.c #free arguments + |-> shutdown.c #add how to free the object (replace default) + +- Tests properties custom files + * `src/test/<testname>/<class_name>/<property_name>` + | -- Property Get -- + |-> arg_get_init.c #initialize property get arguments (arg_<argument_name>) + |-> get_init.c #how to create the object (replace default) + |-> arg_get_shutdown.c #free arguments + |-> get_shutdown.c #how to free the object (replace default) + | -- Property Set -- + |-> arg_set_init.c #initialize propety set arguments (arg_<argument_name>) + |-> set_init.c #how to create the object (replace default) + |-> arg_set_shutdown.c #free arguments + |-> set_shutdown.c #how to free the object (replace default) + +Event Tests +- Tests Events custom files + * `src/test/<testname>/<class_name>/<event_name>/` + |-> init.cs #add how to initialize the objects + |-> custom.cs #add customizations in callback + |-> shutdown.cs #add shutdown or any method to call the event + +to make some custom files you only need a code using: + `parent` -> default name of parent object defined as `Eo *` + `obj` -> default name of current object + `arg_<name>` -> replace <name> with functions arguments name + +you can use custom.c (suite or class) to add specilized code, structs and callbacks + +-- Use `*.cs` to Emono/CSharp generated code -- + +Some class or function test don't need a test in some Suite, you can disable test generated +of it with a blank file as following: + +use lowercase and `_` as separator +`src/test/<testname>/<class_name>` #don't generate test for <class_name> +`src/test/<testname>/<class_name>/method_name` #don't generate test for <method_name> +`src/test/<testname>/<class_name>/<property_name>` #don't generate test for this property +`src/test/<testname>/<class_name>/<property_name>_get` #don't generate test for this property get +`src/test/<testname>/<class_name>/<property_name>_set` #don't generate test for this property set + + +Where to find more info +======================= + + * read the Pyolian README file in EFL scripts + * read the eolian.py file (it declare the full eolian API) + * read the generator.py file (it's super simple) + * read the original [pyratemp docs](https://www.simple-is-better.org/template/pyratemp.html) + + +Note +==== + +This markdown file is mirrored in efl src tree (src/scripts/pyolian) and in +phab wiki (phab.enlightenment.org/w/pyolian). Don't forget to update the other +if you change one! diff --git a/src/scripts/testgen/__init__.py b/src/scripts/testgen/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/src/scripts/testgen/__init__.py diff --git a/src/scripts/testgen/ekeys.py b/src/scripts/testgen/ekeys.py new file mode 100644 index 0000000000..211dfb1651 --- /dev/null +++ b/src/scripts/testgen/ekeys.py @@ -0,0 +1,239 @@ +#!/usr/bin/env python3 +# encoding: utf-8 +from enum import IntEnum + + +class Function_List_Type(IntEnum): + INHERITIS = 1 + INHERITIS_FULL = 2 + CLASS_IMPLEMENTS = 3 + CLASS_ONLY = 4 + + +class EKeys: + def __init__(self, ext): + self.ext = ext + self.dicttypes = {} + self.keywords = [] + self.verbs = [] + self.blacklist = [] + self.keyloads = ["init", "shutdown", "custom"] + self.implementsbl = ["construtor", "destructor", "finalize"] + self.funclist = Function_List_Type.CLASS_IMPLEMENTS + + def type_convert(self, eotype): + return eotype.name + + def event_convert(self, event): + return event.c_name + + def print_arg(self, eoarg): + return "arg_{}".format(eoarg.name) + + def format_name(self, func): + return self.name + + +class EMonoKeys(EKeys): + def __init__(self, ext): + super().__init__(ext) + self.dicttypes = { + "byte": "sbyte", + "llong": "long", + "int8": "sbyte", + "int16": "short", + "int32": "int", + "int64": "long", + "ssize": "long", + "ubyte": "byte", + "ullong": "ulong", + "uint8": "byte", + "uint16": "ushort", + "uint32": "uint", + "uint64": "ulong", + "size": "ulong", + "ptrdiff": "long", + "intptr": "System.IntPtr", + "uintptr": "System.IntPtr", + "void_ptr": "System.IntPtr", + "void": "System.IntPtr", # only if is out/inout + "Error": "eina.Error", + "string": "System.String", + "mstring": "System.String", + "stringshare": "System.String", + "any_value": "eina.Value", + "any_value_ptr": "eina.Value" + # complex Types + , + "list": "eina.List", + "inlist": "eina.Inlist", + "array": "eina.Array", + "inarray": "eina.Inarray", + "hash": "eina.Hash", + "promise": "int", + "future": "int", + "iterator": "eina.Iterator", + "accessor": "int", + } + + self.keywords = [ + "delete", + "do", + "lock", + "event", + "in", + "object", + "interface", + "string", + "internal", + "fixed", + "base", + ] + + self.verbs = [ + "add", + "get", + "is", + "del", + "thaw", + "freeze", + "save", + "wait", + "eject", + "raise", + "lower", + "load", + "dup", + "reset", + "unload", + "close", + "set", + "interpolate", + "has", + "grab", + "check", + "find", + "ungrab", + "unset", + "clear", + "pop", + "new", + "peek", + "push", + "update", + "show", + "move", + "hide", + "calculate", + "resize", + "attach", + "pack", + "unpack", + "emit", + "call", + "append", + ] + + self.blacklist = [ + "efl_event_callback_array_priority_add", + "efl_player_position_get", + "efl_text_font_source", + "efl_ui_focus_manager_focus_get", + "efl_ui_widget_focus", + "efl_ui_text_password", + "elm_interface_scrollable_repeat_events", + "elm_wdg_item_del", + "elm_wdg_item_focus", + "elm_interface_scrollable_mirrored_set", + "evas_obj_table_mirrored", + "edje_obj_load_error_get", + "efl_ui_focus_user_parent_get", + "efl_canvas_object_scale", # duplicated signature + "efl_access_parent_get", + "efl_access_name", + "efl_access_root_get", + "efl_access_type_get", + "efl_access_role_get", + "efl_access_action_description", + "efl_access_image_description", + "efl_access_component_layer_get", # duplicated signature + "efl_access_component_alpha_get", + "efl_access_component_size_get", + "efl_ui_spin_button_loop_get", + "efl_ui_list_model_size_get", + "efl_ui_list_relayout_layout_do", + ] + + def escape_keyword(self, key): + key = "kw_{}".format(key) if key.lower() in self.keywords else key + return "{}Add".format(key) if key == "Finalize" else key + + def direction_get(self, direction): + if direction == direction.INOUT: + return "ref" + if direction == direction.OUT: + return "out" + return None + + def klass_name(self, eotype): + *namespaces, name = eotype.name.split(".") + namespaces = [self.escape_keyword(x.lower()) for x in namespaces] + is_interface = eotype.type == eotype.type.CLASS + k_name = ("I" if is_interface else "") + name + return ".".join(namespaces + [k_name]) + + def type_convert(self, eotype): + if eotype.type == eotype.type.VOID: + return "System.IntPtr" + + new_type = self.dicttypes.get(eotype.name, self.klass_name(eotype)) + if new_type != "int" and eotype.base_type: + new_type = "{}<{}>".format( + new_type, + self.dicttypes.get( + eotype.base_type.name, self.klass_name(eotype.base_type) + ), + ) + + return new_type + + def event_convert(self, event): + return "{}Evt".format("".join([i.capitalize() for i in event.name.split(",")])) + + def print_arg(self, eoarg): + r = super().print_arg(eoarg) + prefix = self.direction_get(eoarg.direction) or None + + if prefix == "out" and (eoarg.type.name in ("Eina.Slice", "Eina.Rw_Slice")): + prefix = "ref" + + if ( + not prefix + and eoarg.type.is_ptr + and eoarg.type.type == eoarg.type.type.REGULAR + and eoarg.type.typedecl + and eoarg.type.typedecl.type == eoarg.type.typedecl.type.STRUCT + ): + prefix = "ref" + + return " ".join([prefix, r]) if prefix else r + + def format_name(self, func): + names = func.comp.name.split("_") + + if func.type == func.type.METHOD and names[-1] in self.verbs: + names.insert(0, names.pop()) + + fname = "".join([name.capitalize() for name in names]) + + if func.type == func.type.METHOD: + fname = self.escape_keyword(fname) + fname = "Do{}".format(fname) if fname == func.class_.short_name else fname + + return fname + + +def GetKey(ext): + if ext == ".cs": + return EMonoKeys(ext) + return EKeys(ext) diff --git a/src/scripts/testgen/suitegen.py b/src/scripts/testgen/suitegen.py new file mode 100644 index 0000000000..426fc28074 --- /dev/null +++ b/src/scripts/testgen/suitegen.py @@ -0,0 +1,197 @@ +import itertools +import os +from pyolian.eolian import Eolian_Function_Type, Eolian_Class_Type +from .ekeys import GetKey, Function_List_Type + + +class BaseItem: + def __init__(self, path, keys, prefix=""): + self.path = path + self.keys = keys + self.prefix = prefix + + def __getattr__(self, attr): + if not attr.split("_")[-1] in self.keys.keyloads: + raise AttributeError("Error getting {}".format(attr)) + + filename = os.path.join(self.path, self.prefix + attr) + self.keys.ext + if os.path.isfile(filename): + with open(filename, "r") as f: + return f.read() + return None + + +class ComItem(BaseItem): + def __init__(self, comp, path, keys): + super().__init__(path, keys) + self.comp = comp + + def __getattr__(self, attr): + if hasattr(self.comp, attr): + return getattr(self.comp, attr) + return super().__getattr__(attr) + + +class FuncItem(ComItem): + def __init__(self, comp, path, keys): + super().__init__(comp, os.path.join(path, comp.name), keys) + + self.has_getter = ( + comp.type in (Eolian_Function_Type.PROP_GET, Eolian_Function_Type.PROPERTY) + and comp.full_c_getter_name not in keys.blacklist + and not os.path.isfile("{}_get".format(os.path.join(path, comp.name))) + ) + self.has_setter = ( + comp.type in (Eolian_Function_Type.PROP_SET, Eolian_Function_Type.PROPERTY) + and comp.full_c_setter_name not in keys.blacklist + and not os.path.isfile("{}_set".format(os.path.join(path, comp.name))) + ) + + self.is_enum = ( + lambda arg: arg.type + and arg.type.typedecl + and arg.type.typedecl.type == arg.type.typedecl.type.ENUM + ) + self.is_number = lambda arg: arg.type and arg.type.builtin_type in ( + arg.type.builtin_type.INT, + arg.type.builtin_type.UINT, + arg.type.builtin_type.LONG, + arg.type.builtin_type.ULONG, + arg.type.builtin_type.LLONG, + arg.type.builtin_type.ULLONG, + arg.type.builtin_type.INT8, + arg.type.builtin_type.UINT8, + arg.type.builtin_type.INT16, + arg.type.builtin_type.UINT16, + arg.type.builtin_type.INT32, + arg.type.builtin_type.UINT32, + arg.type.builtin_type.INT64, + arg.type.builtin_type.UINT64, + arg.type.builtin_type.INT128, + arg.type.builtin_type.UINT128, + ) + + @property + def getter_args(self): + return itertools.chain(self.getter_values, self.getter_keys) + + @property + def setter_args(self): + return itertools.chain(self.setter_values, self.setter_keys) + + @property + def format_name(self): + return self.keys.format_name(self) + + +class EventItem(ComItem): + def __init__(self, comp, path, keys): + self.myname = comp.name.replace(",", "_") + super().__init__(comp, os.path.join(path, self.myname), keys) + self.format_name = self.keys.event_convert(self) + + +class ClassItem(ComItem): + def __init__(self, comp, path, keys): + self.myname = os.path.splitext(comp.file)[0] + super().__init__(comp, os.path.join(path, self.myname), keys) + + mfilter = ( + lambda f: f.full_c_method_name not in self.keys.blacklist + and not os.path.isfile(os.path.join(self.path, f.name)) + ) + + self.methods = [ + FuncItem(m, self.path, keys) for m in filter(mfilter, self.comp.methods) + ] + self._properties = [ + FuncItem(p, self.path, keys) for p in filter(mfilter, self.comp.properties) + ] + self.events = [EventItem(s, self.path, keys) for s in self.comp.events] + + if self.keys.funclist in ( + Function_List_Type.INHERITIS, + Function_List_Type.INHERITIS_FULL, + ): + for eoclass in ( + eoclass.inherits + if self.keys.funclist == Function_List_Type.INHERITIS + else eoclass.inherits_full + ): + for f in filter(mfilter, eoclass.methods): + self.methods.append(FuncItem(f, self.path, keys)) + for f in filter(mfilter, eoclass.properties): + self._properties.append(FuncItem(f, self.path, keys)) + elif self.keys.funclist == Function_List_Type.CLASS_IMPLEMENTS: + for imp in filter( + lambda i: not i.namespace == self.name + and not i.short_name.lower() in self.keys.implementsbl, + comp.implements, + ): # FIXME implements list + f = imp.function + if f.type == Eolian_Function_Type.METHOD and mfilter(f): + self.methods.append(FuncItem(f, self.path, keys)) + if f.type in ( + Eolian_Function_Type.PROPERTY, + Eolian_Function_Type.PROP_GET, + Eolian_Function_Type.PROP_SET, + ) and mfilter(f): + self._properties.append(FuncItem(f, self.path, keys)) + + @property + def properties(self): + return filter(lambda p: p.has_setter or p.has_getter, self._properties) + + @property + def properties_get(self): + return filter(lambda p: p.has_getter, self._properties) + + @property + def properties_set(self): + return filter(lambda p: p.has_setter, self._properties) + + def __iter__(self): + return itertools.chain(self.methods, self.properties) + + +class SuiteGen(BaseItem): + def __init__(self, name, testname, filename, path, template=None): + keys = GetKey(os.path.splitext(filename)[1]) + super().__init__(path, keys, name + "_") + self.name = name + self.testname = testname + self.fullname = "_".join([name, testname]) if testname else name + self.filename = filename + self.template = template + self.clslist = [] + + if not self.template: + script_path = os.path.dirname(os.path.realpath(__file__)) + self.template = os.path.join( + script_path, "testgenerator{}.template".format(self.keys.ext) + ) + + def __iter__(self): + return iter(self.clslist) + + def type_convert(self, eotype): + return self.keys.type_convert(eotype) + + def print_arg(self, eoarg): + return self.keys.print_arg(eoarg) + + def loadFiles(self, eolian_db, eofiles): + self.clslist.clear() + for eofile in eofiles: + eocls = eolian_db.class_by_file_get(os.path.basename(eofile)) + if not eocls or eocls.type != Eolian_Class_Type.REGULAR: + continue + self.loadObj(eocls) + + def loadObj(self, eocls): + cls = ClassItem(eocls, self.path, self.keys) + if not os.path.isfile(cls.path): + cls.myfullname = "{}_{}".format(self.fullname, cls.myname) + self.clslist.append(cls) + else: + print("removing {} Class from generated list".format(cls.name)) diff --git a/src/scripts/testgen/testgen.py b/src/scripts/testgen/testgen.py new file mode 100755 index 0000000000..b91d7b7e81 --- /dev/null +++ b/src/scripts/testgen/testgen.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +# encoding: utf-8 + +import os +import sys +import datetime + +script_path = os.path.dirname(os.path.realpath(__file__)) + +if "EFL_DIR" in os.environ: + root_path = os.environ["EFL_DIR"] +else: + root_path = os.path.abspath(os.path.join(script_path, "..", "..", "..")) + +sys.path.insert(0, os.path.join(root_path, "src", "scripts")) + +from pyolian import eolian +from pyolian import pyratemp +from testgen.suitegen import SuiteGen + +# Use .eo files from the source tree (not the installed ones) +SCAN_FOLDER = os.path.join(root_path, "src", "lib") + +# create main eolian state +eolian_db = eolian.Eolian_State() +if not isinstance(eolian_db, eolian.Eolian_State): + raise (RuntimeError("Eolian, failed to create Eolian state")) + +# eolian source tree scan +if not eolian_db.directory_add(SCAN_FOLDER): + raise (RuntimeError("Eolian, failed to scan source directory")) + +# Parse all known eo files +if not eolian_db.all_eot_files_parse(): + raise (RuntimeError("Eolian, failed to parse all EOT files")) + +if not eolian_db.all_eo_files_parse(): + raise (RuntimeError("Eolian, failed to parse all EO files")) + +# cleanup the database on exit +import atexit + + +def cleanup_db(): + global eolian_db + del eolian_db + + +atexit.register(cleanup_db) + +class Template(pyratemp.Template): + def __init__( + self, + filename, + encoding="utf-8", + loader_class=pyratemp.LoaderFile, + parser_class=pyratemp.Parser, + renderer_class=pyratemp.Renderer, + eval_class=pyratemp.EvalPseudoSandbox, + ): + + global_ctx = {} + global_ctx.update( + { + # Template info + "date": datetime.datetime.now(), + "template_file": os.path.basename(filename), + } + ) + + self.template_filename = filename + pyratemp.Template.__init__( + self, + filename=filename, + encoding=encoding, + data=global_ctx, + loader_class=loader_class, + parser_class=parser_class, + renderer_class=renderer_class, + eval_class=eval_class, + ) + + def render(self, suite, verbose=True): + # Build the context for the template + ctx = {} + ctx["suite"] = suite + # render with the augmented context + output = self(**ctx) + + if suite.filename is not None: + # write to file + with open(suite.filename, "w") as f: + f.write(output) + + +if __name__ == "__main__": + import argparse + + parser = argparse.ArgumentParser(description="Eolian Test Generator.") + parser.add_argument("testname", help="The Test Name used to find custom and template files. (REQUIRED)") + parser.add_argument("suitename", help="The Suite Name used to find custom files. (REQUIRED)") + parser.add_argument("filename", help="Generated test file destination. (REQUIRED)") + parser.add_argument("eofiles", nargs="*", help="The Eolian Files to use.") + + args = parser.parse_args() + + testdir = os.path.join(root_path, "src", "tests", args.testname) + + suite = SuiteGen(args.suitename, args.testname, args.filename, testdir) + suite.loadFiles(eolian_db, args.eofiles) + + t = Template(suite.template) + # try: + t.render(suite) +# except: +# print("ERROR RENDERING - Cannot create file: {}".format(suite.filename)) diff --git a/src/scripts/testgen/testgenerator.c.template b/src/scripts/testgen/testgenerator.c.template new file mode 100644 index 0000000000..c6a8f8ada1 --- /dev/null +++ b/src/scripts/testgen/testgenerator.c.template @@ -0,0 +1,177 @@ +<!--(macro m_show)--> + <!--(if mshow)--> +${mshow}$#! + <!--(end)--> +<!--(end)--> +<!--(macro init)--> + Eo *parent = NULL; + Eo *obj = NULL; + + <!--(if exists("mfunc") and mfunc!= None)--> +${mfunc}$ + <!--(elif exists("mcls") and mcls!= None)--> +${mcls}$ + <!--(else)--> + obj = efl_add_ref(${cls.c_name}$, parent); + fail_if(!obj, "ERROR: Cannot init ${cls.name}$!\n"); + <!--(end)--> +<!--(end)--> +<!--(macro shutdown)--> + /** shutdown **/ + <!--(if exists("mfunc") and mfunc != None)--> +${mfunc}$ + <!--(elif exists("mcls") and mcls != None)--> +${mcls}$ + <!--(end)--> + efl_unref(obj); +<!--(end)--> +<!--(macro arg_default)--> + <!--(if arg.type.name == "__builtin_free_cb" or arg.type.is_ptr or arg.type.type == arg.type.type.CLASS or arg.type.builtin_type == arg.type.builtin_type.STRING)-->NULL<!--(elif arg.type.builtin_type == arg.type.builtin_type.ANY_VALUE)-->EINA_VALUE_EMPTY<!--(elif arg.type.typedecl and arg.type.typedecl.type == arg.type.typedecl.type.STRUCT )-->{}<!--(else)-->0<!--(end)-->; +<!--(end)--> +<!--(macro args_declaration)--> + <!--(for arg in args)--> + <!--(if arg.type.typedecl and arg.type.typedecl.type == arg.type.typedecl.type.FUNCTION_POINTER)--> + void * arg_${arg.name}$_data = NULL; + ${arg.type.c_type_param}$ arg_${arg.name}$ = NULL; + Eina_Free_Cb arg_${arg.name}$_free_cb = NULL; + <!--(else)--> + ${arg.type.c_type_param}$ arg_${arg.name}$ = ${arg_default(arg=arg)}$ + <!--(end)--> + <!--(end)--> +<!--(end)--> +<!--(macro print_arg)--> + <!--(if arg.type.typedecl and arg.type.typedecl.type == arg.type.typedecl.type.FUNCTION_POINTER)--> +arg_${arg.name}$_data, arg_${arg.name}$, arg_${arg.name}$_free_cb + <!--(else)--> + <!--(if arg.direction in (arg.direction.OUT, arg.direction.INOUT))-->&<!--(end)-->arg_${arg.name}$ + <!--(end)--> +<!--(end)--> + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <check.h> +#include "efl_check.h" +${m_show(mshow=suite.custom)}$#! +#include <Elementary.h> + +<!--(for cls in suite)--> +void ${cls.myfullname}$_test(TCase *tc); +<!--(end)--> + +static const Efl_Test_Case etc[] = { +<!--(for cls in suite)--> + { "${suite.name.capitalize()}$ ${suite.testname.capitalize()}$ ${cls.myname.capitalize()}$", ${cls.myfullname}$_test }, +<!--(end)--> + { NULL, NULL } +}; + +<!--(for cls in suite)--> + +/**************** TEST CASE ${cls.c_name}$ ****************/ +${m_show(mshow=cls.custom)}$#! + +START_TEST(${cls.myfullname}$_smoke) +{ +${init(mcls=cls.init)}$ +${shutdown(mcls=cls.shutdown)}$ +} +END_TEST + + <!--(for func in cls.methods)--> +START_TEST(${cls.myfullname}$_${func.full_c_method_name}$) +{ +${args_declaration(args=func.parameters)}$${init(mcls=cls.init,mfunc=func.init)}$ +${m_show(mshow=func.arg_init)}$#! + <!--(if func.method_return_type)-->${func.method_return_type.c_type_return}$ r = <!--(end)-->${func.full_c_method_name}$(obj<!--(for arg in func.parameters)-->,${print_arg(arg=arg)}$<!--(end)-->); + <!--(if func.method_return_type)-->(void)r;<!--(end)--> +${m_show(mshow=func.arg_shutdown)}$#! +${shutdown(mcls=cls.shutdown,mfunc=func.shutdown)}$ +} +END_TEST + + <!--(end)--> + + <!--(for func in cls.properties)--> + <!--(if func.has_getter)--> +START_TEST(${cls.myfullname}$_${func.full_c_getter_name}$) +{ + <!--(if len(list(func.getter_values)) > 1)--> +${args_declaration(args=func.getter_values)}$ + <!--(end)--> +${args_declaration(args=func.getter_keys)}$${init(mcls=cls.init,mfunc=func.get_init)}$ +${m_show(mshow=func.arg_get_init)}$#! + <!--(if len(list(func.getter_values)) == 1)--> + ${list(func.getter_values)[0].type.c_type_return}$ r = ${func.full_c_getter_name}$(obj<!--(for arg in func.getter_keys)-->, arg_${arg.name}$<!--(end)-->); + (void)r; + <!--(else)--> + ${func.full_c_getter_name}$(obj<!--(for arg in func.getter_keys)-->, arg_${arg.name}$<!--(end)--><!--(for arg in func.getter_values)-->, &arg_${arg.name}$<!--(end)-->); + <!--(end)--> +${m_show(mshow=func.arg_get_shutdown)}$#! +${shutdown(mcls=cls.shutdown,mfunc=func.get_shutdown)}$ +} +END_TEST + + <!--(end)--> + <!--(if func.has_setter)--> +START_TEST(${cls.myfullname}$_${func.full_c_setter_name}$) +{ +${args_declaration(args=func.setter_keys)}$${args_declaration(args=func.setter_values)}$${init(mcls=cls.init,mfunc=func.set_init)}$ +${m_show(mshow=func.arg_set_init)}$#! + ${func.full_c_setter_name}$(obj<!--(for arg in func.setter_keys)-->, arg_${arg.name}$<!--(end)--><!--(for arg in func.setter_values)-->, arg_${arg.name}$<!--(end)-->); +${m_show(mshow=func.arg_set_shutdown)}$#! +${shutdown(mcls=cls.shutdown,mfunc=func.set_shutdown)}$ +} +END_TEST + + <!--(end)--> + <!--(end)--> +void ${cls.myfullname}$_test(TCase *tc) +{ + tcase_add_test(tc, ${cls.myfullname}$_smoke); + <!--(for func in cls.methods)--> + tcase_add_test(tc, ${cls.myfullname}$_${func.full_c_method_name}$); + <!--(end)--> + <!--(for func in cls.properties_get)--> + tcase_add_test(tc, ${cls.myfullname}$_${func.full_c_getter_name}$); + <!--(end)--> + <!--(for func in cls.properties_set)--> + tcase_add_test(tc, ${cls.myfullname}$_${func.full_c_setter_name}$); + <!--(end)--> +} +<!--(end)--> + +SUITE_INIT(${suite.name}$) +{ + fail_if(!eina_init(), "ERROR: Cannot init Eina!\n"); + fail_if(!ecore_init(), "ERROR: Cannot init Ecore!\n"); + fail_if(!efl_object_init(), "ERROR: Cannot init EO!\n"); +${m_show(mshow=suite.init)}$#! +} + +SUITE_SHUTDOWN(${suite.name}$) +{ +${m_show(mshow=suite.shutdown)}$#! + ecore_shutdown(); + eina_shutdown(); +} + +int +main(int argc, char **argv) +{ + int failed_count; + + if (!_efl_test_option_disp(argc, argv, etc)) + return 0; + +#ifdef NEED_RUN_IN_TREE + putenv("EFL_RUN_IN_TREE=1"); +#endif + + failed_count = _efl_suite_build_and_run(argc - 1, (const char **)argv + 1, + "${suite.fullname}$", etc, SUITE_INIT_FN(${suite.name}$), SUITE_SHUTDOWN_FN(${suite.name}$)); + + return (failed_count == 0) ? 0 : 255; +} + diff --git a/src/scripts/testgen/testgenerator.cs.template b/src/scripts/testgen/testgenerator.cs.template new file mode 100644 index 0000000000..aca9903d5e --- /dev/null +++ b/src/scripts/testgen/testgenerator.cs.template @@ -0,0 +1,113 @@ +<!--(macro m_show)--> + <!--(if mshow)--> +${mshow}$#! + <!--(end)--> +<!--(end)--> +<!--(macro def_obj)-->${'.'.join(param.type.namespaces).lower()}$.I${param.type.short_name}$ arg_${param.name}$ = null;<!--(end)--> +<!--(macro def_param)--> + <!--(if param.type.type == param.type.type.CLASS)-->${def_obj(param=param)}$<!--(else)-->${suite.type_convert(param.type)}$ arg_${param.name}$ = default(${suite.type_convert(param.type)}$);<!--(end)--> +<!--(end)--> +<!--(macro def_params)--> + <!--(for p in parameters)--> + ${def_param(param=p)}$ + <!--(end)--> +<!--(end)--> +<!--(macro meth_target)--> + <!--(if func.is_class)-->${'.'.join(cls.namespaces).lower()}$.${cls.short_name}$<!--(else)-->obj<!--(end)--> +<!--(end)--> +using System; + +namespace TestSuite +{ +<!--(if suite.custom)-->${suite.custom}$<!--(end)--> +<!--(for cls in suite)--> +/**************** TEST CASE ${cls.c_name}$ ****************/ +class Test${cls.name.replace('.','')}$ +{ + + ${'.'.join(cls.namespaces).lower()}$.I${cls.short_name}$ obj; +${m_show(mshow=cls.custom)}$#! + + public void SetUp() + { +${m_show(mshow=suite.init)}$#! + <!--(if cls.init)--> +${cls.init}$ + <!--(else)--> + obj = new ${'.'.join(cls.namespaces).lower()}$.${cls.short_name}$(); + <!--(end)--> + } + + public void TearDown() + { +${m_show(mshow=suite.shutdown)}$#! + <!--(if cls.shutdown)--> +${cls.shutdown}$ + <!--(else)--> + obj.Dispose(); + obj = null; + <!--(end)--> + } + + public void smoke() + { + } + +#! METHODS + <!--(for func in cls.methods)--> + public void ${func.name}$() + { + <!--(if len(list(func.parameters)) > 0)--> +${def_params(parameters=func.parameters)}$ + <!--(end)--> +${m_show(mshow=func.arg_init)}$#! +${m_show(mshow=func.init)}$#! + <!--(if func.method_return_type)-->var r = <!--(end)-->${meth_target(func=func, cls=cls)}$.${func.format_name}$(${', '.join([ suite.print_arg(p) for p in func.parameters])}$); +${m_show(mshow=func.arg_shutdown)}$#! +${m_show(mshow=func.shutdown)}$#! + } + + <!--(end)--> +#! PROPERTIES FUNCTION GET + <!--(for func in cls.properties)--> + <!--(if func.has_getter)--> + public void ${func.name}$_pget() + { + <!--(if func.getter_return_type or len(list(func.getter_values)) > 1)--> +${def_params(parameters=func.getter_values)}$ + <!--(end)--> + <!--(if len(list(func.getter_keys)) > 0)--> +${def_params(parameters=func.getter_keys)}$ + <!--(end)--> +${m_show(mshow=func.arg_get_init)}$#! +${m_show(mshow=func.get_init)}$#! + <!--(if not func.getter_return_type and len(list(func.getter_values)) == 1)--> + var arg_${list(func.getter_values)[0].name}$ = ${meth_target(func=func, cls=cls)}$.Get${func.format_name}$(${', '.join(['arg_{}'.format(param.name) for param in func.getter_keys])}$); + <!--(else)--> + <!--(if func.getter_return_type)-->var r = <!--(end)-->${meth_target(func=func, cls=cls)}$.Get${func.format_name}$(${', '.join([suite.print_arg(p) for p in func.getter_keys] + ['out arg_{}'.format(p.name) for p in func.getter_values])}$); + <!--(end)--> +${m_show(mshow=func.arg_get_shutdown)}$#! +${m_show(mshow=func.get_shutdown)}$#! + } + + <!--(end)--> +#! PROPERTIES FUNCTION SET + <!--(if func.has_setter)--> + public void ${func.name}$_pset() + { +${def_params(parameters=func.setter_values)}$ + <!--(if len(list(func.setter_keys)) > 0)--> +${def_params(parameters=func.setter_keys)}$ + <!--(end)--> +${m_show(mshow=func.arg_set_init)}$#! +${m_show(mshow=func.set_init)}$#! + ${meth_target(func=func, cls=cls)}$.Set${func.format_name}$(${', '.join([suite.print_arg(p) for p in list(func.setter_keys) + list(func.setter_values)])}$); +${m_show(mshow=func.arg_set_shutdown)}$#! +${m_show(mshow=func.set_shutdown)}$#! + } + + <!--(end)--> + <!--(end)--> +} +<!--(end)--> +} diff --git a/src/tests/automated/ecore_audio_custom.c b/src/tests/automated/ecore_audio_custom.c new file mode 100644 index 0000000000..538ed42109 --- /dev/null +++ b/src/tests/automated/ecore_audio_custom.c @@ -0,0 +1,3 @@ +#include <Ecore.h> +#include <Ecore_Audio.h> +#include <Ecore_File.h> diff --git a/src/tests/automated/ecore_audio_init.c b/src/tests/automated/ecore_audio_init.c new file mode 100644 index 0000000000..3dd8aecd65 --- /dev/null +++ b/src/tests/automated/ecore_audio_init.c @@ -0,0 +1,2 @@ + int _rinit = ecore_audio_init(); + ck_assert_int_eq(_rinit, 1); diff --git a/src/tests/automated/ecore_audio_out/input_attach/arg_init.c b/src/tests/automated/ecore_audio_out/input_attach/arg_init.c new file mode 100644 index 0000000000..fcebbe029b --- /dev/null +++ b/src/tests/automated/ecore_audio_out/input_attach/arg_init.c @@ -0,0 +1 @@ + arg_input = efl_add(ECORE_AUDIO_IN_CLASS, NULL); diff --git a/src/tests/automated/ecore_audio_out/input_detach/arg_init.c b/src/tests/automated/ecore_audio_out/input_detach/arg_init.c new file mode 100644 index 0000000000..fcebbe029b --- /dev/null +++ b/src/tests/automated/ecore_audio_out/input_detach/arg_init.c @@ -0,0 +1 @@ + arg_input = efl_add(ECORE_AUDIO_IN_CLASS, NULL); diff --git a/src/tests/automated/ecore_audio_out_wasapi/init.c b/src/tests/automated/ecore_audio_out_wasapi/init.c new file mode 100644 index 0000000000..da9426da1e --- /dev/null +++ b/src/tests/automated/ecore_audio_out_wasapi/init.c @@ -0,0 +1,3 @@ +#ifdef _WIN32 + obj = efl_add_ref(ECORE_AUDIO_OUT_WASAPI_CLASS, parent); + fail_if(!obj, "ERROR: Cannot init Ecore.Audio.Out.Wasapi!\n") diff --git a/src/tests/automated/ecore_audio_out_wasapi/shutdown.c b/src/tests/automated/ecore_audio_out_wasapi/shutdown.c new file mode 100644 index 0000000000..23fe0f1229 --- /dev/null +++ b/src/tests/automated/ecore_audio_out_wasapi/shutdown.c @@ -0,0 +1,3 @@ +#else +(void)parent; +#endif diff --git a/src/tests/automated/ector_custom.c b/src/tests/automated/ector_custom.c new file mode 100644 index 0000000000..0ff115b738 --- /dev/null +++ b/src/tests/automated/ector_custom.c @@ -0,0 +1,3 @@ +#include <cairo/Ector_Cairo.h> +#include <software/Ector_Software.h> +#include <gl/Ector_GL.h> diff --git a/src/tests/automated/ector_init.c b/src/tests/automated/ector_init.c new file mode 100644 index 0000000000..b0006b6a1f --- /dev/null +++ b/src/tests/automated/ector_init.c @@ -0,0 +1 @@ + fail_if(!ector_init(), "ERROR: Cannot init Ector!\n"); diff --git a/src/tests/automated/ector_renderer_cairo_shape/init.c b/src/tests/automated/ector_renderer_cairo_shape/init.c new file mode 100644 index 0000000000..e0d899fa57 --- /dev/null +++ b/src/tests/automated/ector_renderer_cairo_shape/init.c @@ -0,0 +1,2 @@ +Ector_Surface *surface = efl_add(ECTOR_CAIRO_SOFTWARE_SURFACE_CLASS, NULL); +obj = efl_add_ref(ECTOR_RENDERER_CAIRO_SHAPE_CLASS, parent, ector_renderer_surface_set(efl_added, surface)); diff --git a/src/tests/automated/ector_shutdown.c b/src/tests/automated/ector_shutdown.c new file mode 100644 index 0000000000..2428e6ec56 --- /dev/null +++ b/src/tests/automated/ector_shutdown.c @@ -0,0 +1 @@ + ector_shutdown(); diff --git a/src/tests/automated/edje_custom.c b/src/tests/automated/edje_custom.c new file mode 100644 index 0000000000..edbf1b78f2 --- /dev/null +++ b/src/tests/automated/edje_custom.c @@ -0,0 +1 @@ +#define EFL_CANVAS_LAYOUT_BETA diff --git a/src/tests/automated/edje_init.c b/src/tests/automated/edje_init.c new file mode 100644 index 0000000000..4e81da1772 --- /dev/null +++ b/src/tests/automated/edje_init.c @@ -0,0 +1,2 @@ + fail_if(!ecore_evas_init(), "ERROR: Cannot init Ecore Evas!\n"); + fail_if(!edje_init(), "ERROR: Cannot init Edje!\n"); diff --git a/src/tests/automated/edje_shutdown.c b/src/tests/automated/edje_shutdown.c new file mode 100644 index 0000000000..450dda7d2b --- /dev/null +++ b/src/tests/automated/edje_shutdown.c @@ -0,0 +1,2 @@ + edje_shutdown(); + ecore_evas_shutdown(); diff --git a/src/tests/automated/efl_canvas_layout_part/init.c b/src/tests/automated/efl_canvas_layout_part/init.c new file mode 100644 index 0000000000..7d4a56a17b --- /dev/null +++ b/src/tests/automated/efl_canvas_layout_part/init.c @@ -0,0 +1,9 @@ + parent = evas_new(); + evas_output_method_set(parent, evas_render_method_lookup("buffer")); + Evas_Engine_Info *einfo = evas_engine_info_get(parent); + evas_engine_info_set(parent, einfo); + + evas_output_size_set(parent, 500, 500); + evas_output_viewport_set(parent, 0, 0, 500, 500); + + (void)obj; diff --git a/src/tests/automated/efl_canvas_layout_part_box/init.c b/src/tests/automated/efl_canvas_layout_part_box/init.c new file mode 100644 index 0000000000..7d4a56a17b --- /dev/null +++ b/src/tests/automated/efl_canvas_layout_part_box/init.c @@ -0,0 +1,9 @@ + parent = evas_new(); + evas_output_method_set(parent, evas_render_method_lookup("buffer")); + Evas_Engine_Info *einfo = evas_engine_info_get(parent); + evas_engine_info_set(parent, einfo); + + evas_output_size_set(parent, 500, 500); + evas_output_viewport_set(parent, 0, 0, 500, 500); + + (void)obj; diff --git a/src/tests/automated/efl_canvas_layout_part_external/init.c b/src/tests/automated/efl_canvas_layout_part_external/init.c new file mode 100644 index 0000000000..b42f732b75 --- /dev/null +++ b/src/tests/automated/efl_canvas_layout_part_external/init.c @@ -0,0 +1,8 @@ + parent = evas_new(); + evas_output_method_set(parent, evas_render_method_lookup("buffer")); + Evas_Engine_Info *einfo = evas_engine_info_get(parent); + evas_engine_info_set(parent, einfo); + + evas_output_size_set(parent, 500, 500); + evas_output_viewport_set(parent, 0, 0, 500, 500); + (void)obj; diff --git a/src/tests/automated/efl_canvas_layout_part_swallow/init.c b/src/tests/automated/efl_canvas_layout_part_swallow/init.c new file mode 100644 index 0000000000..b42f732b75 --- /dev/null +++ b/src/tests/automated/efl_canvas_layout_part_swallow/init.c @@ -0,0 +1,8 @@ + parent = evas_new(); + evas_output_method_set(parent, evas_render_method_lookup("buffer")); + Evas_Engine_Info *einfo = evas_engine_info_get(parent); + evas_engine_info_set(parent, einfo); + + evas_output_size_set(parent, 500, 500); + evas_output_viewport_set(parent, 0, 0, 500, 500); + (void)obj; diff --git a/src/tests/automated/efl_canvas_layout_part_table/init.c b/src/tests/automated/efl_canvas_layout_part_table/init.c new file mode 100644 index 0000000000..b42f732b75 --- /dev/null +++ b/src/tests/automated/efl_canvas_layout_part_table/init.c @@ -0,0 +1,8 @@ + parent = evas_new(); + evas_output_method_set(parent, evas_render_method_lookup("buffer")); + Evas_Engine_Info *einfo = evas_engine_info_get(parent); + evas_engine_info_set(parent, einfo); + + evas_output_size_set(parent, 500, 500); + evas_output_viewport_set(parent, 0, 0, 500, 500); + (void)obj; diff --git a/src/tests/automated/efl_canvas_layout_part_text/init.c b/src/tests/automated/efl_canvas_layout_part_text/init.c new file mode 100644 index 0000000000..b42f732b75 --- /dev/null +++ b/src/tests/automated/efl_canvas_layout_part_text/init.c @@ -0,0 +1,8 @@ + parent = evas_new(); + evas_output_method_set(parent, evas_render_method_lookup("buffer")); + Evas_Engine_Info *einfo = evas_engine_info_get(parent); + evas_engine_info_set(parent, einfo); + + evas_output_size_set(parent, 500, 500); + evas_output_viewport_set(parent, 0, 0, 500, 500); + (void)obj; diff --git a/src/tests/automated/efl_canvas_video/init.c b/src/tests/automated/efl_canvas_video/init.c new file mode 100644 index 0000000000..f75bda251f --- /dev/null +++ b/src/tests/automated/efl_canvas_video/init.c @@ -0,0 +1,2 @@ + obj = efl_add(EFL_CANVAS_VIDEO_CLASS, parent, efl_canvas_object_legacy_ctor(efl_added)); + fail_if(!obj, "Error: Canot get obj!\n"); diff --git a/src/tests/automated/efl_loop/begin/init.c b/src/tests/automated/efl_loop/begin/init.c new file mode 100644 index 0000000000..78fbba3fca --- /dev/null +++ b/src/tests/automated/efl_loop/begin/init.c @@ -0,0 +1,9 @@ +int argc = 2; +char *argv[] = { "efl_ui_suite", "test" }; +(void)parent; + +_EFL_APP_VERSION_SET(); +obj = efl_app_get(); +efl_event_callback_add(obj, EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); +fail_if(!ecore_init_ex(argc, argv)); +__EFL_MAIN_CONSTRUCTOR; diff --git a/src/tests/automated/efl_loop/begin/shutdown.c b/src/tests/automated/efl_loop/begin/shutdown.c new file mode 100644 index 0000000000..1f578789d4 --- /dev/null +++ b/src/tests/automated/efl_loop/begin/shutdown.c @@ -0,0 +1,3 @@ +efl_loop_exit_code_process(r); +__EFL_MAIN_DESTRUCTOR; +ecore_shutdown_ex(); diff --git a/src/tests/automated/efl_loop/custom.c b/src/tests/automated/efl_loop/custom.c new file mode 100644 index 0000000000..f7df130584 --- /dev/null +++ b/src/tests/automated/efl_loop/custom.c @@ -0,0 +1,5 @@ +EAPI_MAIN void +efl_main(void *data EINA_UNUSED, const Efl_Event *ev) +{ + efl_loop_quit(ev->object, EINA_VALUE_EMPTY); +} diff --git a/src/tests/automated/efl_loop/timeout/arg_init.c b/src/tests/automated/efl_loop/timeout/arg_init.c new file mode 100644 index 0000000000..e2e28fb725 --- /dev/null +++ b/src/tests/automated/efl_loop/timeout/arg_init.c @@ -0,0 +1 @@ + arg_time = 0.5; diff --git a/src/tests/automated/efl_text_markup_util/init.c b/src/tests/automated/efl_text_markup_util/init.c new file mode 100644 index 0000000000..4d5230d0b1 --- /dev/null +++ b/src/tests/automated/efl_text_markup_util/init.c @@ -0,0 +1 @@ +(void)parent; diff --git a/src/tests/automated/eio_custom.c b/src/tests/automated/eio_custom.c new file mode 100644 index 0000000000..7f57ce11c4 --- /dev/null +++ b/src/tests/automated/eio_custom.c @@ -0,0 +1 @@ +#include <Eio.h> diff --git a/src/tests/automated/eio_init.c b/src/tests/automated/eio_init.c new file mode 100644 index 0000000000..2787098b73 --- /dev/null +++ b/src/tests/automated/eio_init.c @@ -0,0 +1 @@ + fail_if(!eio_init(), "ERROR: Cannot init Eio!\n"); diff --git a/src/tests/automated/eio_shutdown.c b/src/tests/automated/eio_shutdown.c new file mode 100644 index 0000000000..fad342e9ce --- /dev/null +++ b/src/tests/automated/eio_shutdown.c @@ -0,0 +1 @@ + eio_shutdown(); diff --git a/src/tests/automated/eldbus_init.c b/src/tests/automated/eldbus_init.c new file mode 100644 index 0000000000..dcfbbec39e --- /dev/null +++ b/src/tests/automated/eldbus_init.c @@ -0,0 +1 @@ +fail_if(eldbus_init() < 0, "ERROR: Cannot init Eldbus!\n"); diff --git a/src/tests/automated/eldbus_shutdown.c b/src/tests/automated/eldbus_shutdown.c new file mode 100644 index 0000000000..f3077072c5 --- /dev/null +++ b/src/tests/automated/eldbus_shutdown.c @@ -0,0 +1 @@ +eldbus_shutdown(); diff --git a/src/tests/automated/emotion_custom.c b/src/tests/automated/emotion_custom.c new file mode 100644 index 0000000000..811c9944a8 --- /dev/null +++ b/src/tests/automated/emotion_custom.c @@ -0,0 +1,2 @@ +#include "Emotion.h" +#include "Evas_Internal.h" diff --git a/src/tests/automated/emotion_init.c b/src/tests/automated/emotion_init.c new file mode 100644 index 0000000000..f6d1d030a8 --- /dev/null +++ b/src/tests/automated/emotion_init.c @@ -0,0 +1,3 @@ + fail_if(!ecore_evas_init(), "ERROR: Cannot init ECore Evas!\n"); + fail_if(!emotion_init(), "ERROR: Cannot init Emotion!\n"); + diff --git a/src/tests/automated/emotion_shutdown.c b/src/tests/automated/emotion_shutdown.c new file mode 100644 index 0000000000..e82aef7387 --- /dev/null +++ b/src/tests/automated/emotion_shutdown.c @@ -0,0 +1,4 @@ +// efl_unref(parent); +// ecore_evas_free(ee); + emotion_shutdown(); +// ecore_evas_shutdown(); diff --git a/src/tests/automated/evas_custom.c b/src/tests/automated/evas_custom.c new file mode 100644 index 0000000000..6cd14a5113 --- /dev/null +++ b/src/tests/automated/evas_custom.c @@ -0,0 +1 @@ +#include "efl_canvas_surface.h" |