From e2c51100c78d16bc11093971eb2f729b3c513cdb Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Thu, 24 Jul 2014 14:01:33 +0100 Subject: [PATCH] eolian: add test for class methods/properties This also fixes a bug in the Eolian parser that handles class properties. --- src/Makefile_Eolian.am | 1 + src/lib/eolian/eo_parser.c | 2 ++ src/tests/eolian/data/class_funcs.eo | 22 +++++++++++++++++ src/tests/eolian/eolian_parsing.c | 35 ++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 src/tests/eolian/data/class_funcs.eo diff --git a/src/Makefile_Eolian.am b/src/Makefile_Eolian.am index 62df8cbc80..aa13ebe206 100644 --- a/src/Makefile_Eolian.am +++ b/src/Makefile_Eolian.am @@ -105,6 +105,7 @@ tests/eolian/data/events.eo \ tests/eolian/data/namespace.eo \ tests/eolian/data/extern.eo \ tests/eolian/data/struct.eo \ +tests/eolian/data/class_funcs.eo \ tests/eolian/data/typedef_ref.c \ tests/eolian/data/struct_ref.c diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 42de755a9a..6c16d9a126 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -734,6 +734,8 @@ parse_property(Eo_Lexer *ls) case KW_at_class: CASE_LOCK(ls, class, "class qualifier"); prop->is_class = EINA_TRUE; + eo_lexer_get(ls); + break; default: goto body; } diff --git a/src/tests/eolian/data/class_funcs.eo b/src/tests/eolian/data/class_funcs.eo new file mode 100644 index 0000000000..94b66bab6f --- /dev/null +++ b/src/tests/eolian/data/class_funcs.eo @@ -0,0 +1,22 @@ +class Simple { + properties { + a @class { + get { + } + } + b { + get { + } + } + } + methods { + foo @class { + } + bar { + } + baz @protected @class { + } + bah @protected { + } + } +} diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c index dfe5fd8d3b..f1bdd152c3 100644 --- a/src/tests/eolian/eolian_parsing.c +++ b/src/tests/eolian/eolian_parsing.c @@ -647,6 +647,40 @@ START_TEST(eolian_extern) } END_TEST +START_TEST(eolian_class_funcs) +{ + const Eolian_Function *fid = NULL; + const Eolian_Class *class; + + eolian_init(); + /* Parsing */ + fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/class_funcs.eo")); + fail_if(!(class = eolian_class_get_by_name("Simple"))); + + /* Class properties */ + fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY))); + fail_if(!eolian_function_is_class(fid)); + fail_if(!(fid = eolian_class_function_get_by_name(class, "b", EOLIAN_PROPERTY))); + fail_if(eolian_function_is_class(fid)); + + /* Class methods */ + fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD))); + fail_if(!eolian_function_is_class(fid)); + fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC); + fail_if(!(fid = eolian_class_function_get_by_name(class, "bar", EOLIAN_METHOD))); + fail_if(eolian_function_is_class(fid)); + fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC); + fail_if(!(fid = eolian_class_function_get_by_name(class, "baz", EOLIAN_METHOD))); + fail_if(!eolian_function_is_class(fid)); + fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PROTECTED); + fail_if(!(fid = eolian_class_function_get_by_name(class, "bah", EOLIAN_METHOD))); + fail_if(eolian_function_is_class(fid)); + fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PROTECTED); + + eolian_shutdown(); +} +END_TEST + void eolian_parsing_test(TCase *tc) { tcase_add_test(tc, eolian_simple_parsing); @@ -660,5 +694,6 @@ void eolian_parsing_test(TCase *tc) tcase_add_test(tc, eolian_namespaces); tcase_add_test(tc, eolian_struct); tcase_add_test(tc, eolian_extern); + tcase_add_test(tc, eolian_class_funcs); }