eolian: add test for class methods/properties
authorDaniel Kolesa <d.kolesa@samsung.com>
Thu, 24 Jul 2014 13:01:33 +0000 (14:01 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Thu, 24 Jul 2014 13:02:46 +0000 (14:02 +0100)
This also fixes a bug in the Eolian parser that handles class properties.

src/Makefile_Eolian.am
src/lib/eolian/eo_parser.c
src/tests/eolian/data/class_funcs.eo [new file with mode: 0644]
src/tests/eolian/eolian_parsing.c

index 62df8cb..aa13ebe 100644 (file)
@@ -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
 
index 42de755..6c16d9a 100644 (file)
@@ -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 (file)
index 0000000..94b66ba
--- /dev/null
@@ -0,0 +1,22 @@
+class Simple {
+   properties {
+      a @class {
+         get {
+         }
+      }
+      b {
+         get {
+         }
+      }
+   }
+   methods {
+      foo @class {
+      }
+      bar {
+      }
+      baz @protected @class {
+      }
+      bah @protected {
+      }
+   }
+}
index dfe5fd8..f1bdd15 100644 (file)
@@ -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);
 }