eolian: fix tests and fix class name comparison in parser
authorDaniel Kolesa <d.kolesa@samsung.com>
Wed, 30 Jul 2014 14:35:57 +0000 (15:35 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Thu, 21 Aug 2014 08:26:02 +0000 (09:26 +0100)
This fixes the Eolian testsuite as well as adds a better way to compare where a class
comes from, allowing us to guess EOLIAN_TYPE_CLASS correctly.

17 files changed:
src/lib/eolian/eo_parser.c
src/tests/eolian/data/class_funcs.eo
src/tests/eolian/data/class_simple.eo
src/tests/eolian/data/consts.eo
src/tests/eolian/data/extern.eo
src/tests/eolian/data/namespace.eo [deleted file]
src/tests/eolian/data/nmsp1_class1.eo [new file with mode: 0644]
src/tests/eolian/data/nmsp1_nmsp11_class2.eo [new file with mode: 0644]
src/tests/eolian/data/nmsp2_class1.eo [new file with mode: 0644]
src/tests/eolian/data/no_nmsp.eo [new file with mode: 0644]
src/tests/eolian/data/object_impl.eo
src/tests/eolian/data/object_impl_add.eo
src/tests/eolian/data/override.eo
src/tests/eolian/data/scope.eo
src/tests/eolian/data/struct.eo
src/tests/eolian/data/typedef.eo
src/tests/eolian/eolian_parsing.c

index a9d089c..f8d7bd6 100644 (file)
@@ -442,23 +442,31 @@ parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct)
           }
         else
           {
-             const char *nm, *fpath;
-             char *fname;
+             const char *bnm, *nm;
+             char *fnm;
              buf = push_strbuf(ls);
              parse_name(ls, buf);
              nm = eina_strbuf_string_get(buf);
-             fname = database_class_to_filename(nm);
-             fpath = eina_hash_find(_filenames, fname);
-             free(fname);
-             if (fpath)
+             bnm = get_filename(ls);
+             fnm = database_class_to_filename(nm);
+             if (strncmp(bnm, fnm, strlen(bnm) - 3))
                {
-                  def->type = EOLIAN_TYPE_CLASS;
-                  if (strcmp(ls->source, fpath))
+                  const char *fname = eina_hash_find(_filenames, fnm);
+                  eina_stringshare_del(bnm);
+                  free(fnm);
+                  if (fname)
                     {
-                       if (!eolian_class_get_by_name(nm) && !eolian_eo_file_parse(fpath))
+                       if (!eolian_class_get_by_name(nm) && !eolian_eo_file_parse(fname))
                          eo_lexer_syntax_error(ls, "failed to parse dependency");
+                       def->type = EOLIAN_TYPE_CLASS;
                     }
                }
+             else
+               {
+                  eina_stringshare_del(bnm);
+                  free(fnm);
+                  def->type = EOLIAN_TYPE_CLASS;
+               }
              _fill_type_name(def, eina_stringshare_add(nm));
              pop_strbuf(ls);
           }
@@ -1173,7 +1181,7 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
    parse_name(ls, buf);
    bnm = get_filename(ls);
    fnm = database_class_to_filename(eina_strbuf_string_get(buf));
-   same = !!strcmp(bnm, fnm);
+   same = !strncmp(bnm, fnm, strlen(bnm) - 3);
    eina_stringshare_del(bnm);
    free(fnm);
    if (!same)
index 94b66ba..b65c197 100644 (file)
@@ -1,4 +1,4 @@
-class Simple {
+class Class_Funcs {
    properties {
       a @class {
          get {
index ae7a932..ad23b2e 100644 (file)
@@ -1,4 +1,4 @@
-class Simple {
+class Class_Simple {
    /*@ Class Desc Simple */
    legacy_prefix: evas_object_simple;
    eo_prefix: evas_obj_simple;
index 0dff005..f82e1ae 100644 (file)
@@ -1,4 +1,4 @@
-class Const {
+class Consts {
    properties {
       a {
          set {
index 2c6b472..b8ff807 100644 (file)
@@ -16,7 +16,7 @@ struct @extern Y
    field: int;
 }
 
-class Dummy {
+class Extern {
    methods {
       foo {
          params {
diff --git a/src/tests/eolian/data/namespace.eo b/src/tests/eolian/data/namespace.eo
deleted file mode 100644 (file)
index a5f0b96..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-class nmsp1.nmsp11.class2
-{
-   properties {
-      a {
-         set {
-         }
-      }
-   }
-   implements {
-      virtual.a.set;
-   }
-}
-
-class nmsp2.class1
-{
-}
-
-class no_nmsp
-{
-   methods {
-      foo {
-      }
-   }
-}
-
-class nmsp1.class1 (nmsp1.nmsp11.class2, nmsp2.class1, no_nmsp)
-{
-   implements {
-      nmsp1.nmsp11.class2.a.set;
-      nmsp1.bad_class.a.set;
-      no_nmsp.foo;
-   }
-}
diff --git a/src/tests/eolian/data/nmsp1_class1.eo b/src/tests/eolian/data/nmsp1_class1.eo
new file mode 100644 (file)
index 0000000..635bcab
--- /dev/null
@@ -0,0 +1,8 @@
+class nmsp1.class1 (nmsp1.nmsp11.class2, nmsp2.class1, no_nmsp)
+{
+   implements {
+      nmsp1.nmsp11.class2.a.set;
+      nmsp1.bad_class.a.set;
+      no_nmsp.foo;
+   }
+}
diff --git a/src/tests/eolian/data/nmsp1_nmsp11_class2.eo b/src/tests/eolian/data/nmsp1_nmsp11_class2.eo
new file mode 100644 (file)
index 0000000..9b042af
--- /dev/null
@@ -0,0 +1,12 @@
+class nmsp1.nmsp11.class2
+{
+   properties {
+      a {
+         set {
+         }
+      }
+   }
+   implements {
+      virtual.a.set;
+   }
+}
diff --git a/src/tests/eolian/data/nmsp2_class1.eo b/src/tests/eolian/data/nmsp2_class1.eo
new file mode 100644 (file)
index 0000000..91e9de6
--- /dev/null
@@ -0,0 +1,3 @@
+class nmsp2.class1
+{
+}
diff --git a/src/tests/eolian/data/no_nmsp.eo b/src/tests/eolian/data/no_nmsp.eo
new file mode 100644 (file)
index 0000000..740cd64
--- /dev/null
@@ -0,0 +1,7 @@
+class no_nmsp
+{
+   methods {
+      foo {
+      }
+   }
+}
index 16dc295..079a475 100644 (file)
@@ -1,4 +1,4 @@
-class Object (Base) {
+class Object_Impl (Base) {
    constructors {
       constructor_1 {
          params {
index 213b4ef..0aafb0a 100644 (file)
@@ -1,4 +1,6 @@
-class Object (Base) {
+class Object_Impl_Add (Base) {
+   data: Object_Impl_Data;
+
    properties {
       c {
          set {
index de54316..d4aa199 100644 (file)
@@ -1,4 +1,4 @@
-class Simple (Base) {
+class Override (Base) {
    properties {
       a {
          set {
index fe5045c..8fe360e 100644 (file)
@@ -1,4 +1,4 @@
-class Simple {
+class Scope {
    properties {
       a @protected {
          get {
index 9b0209d..c2ae0c0 100644 (file)
@@ -19,7 +19,7 @@ type Bar: struct {
     b: struct _Foo;
 };
 
-class Dummy {
+class Struct {
    methods {
       foo {
          params {
index e5c691f..a959542 100644 (file)
@@ -1,7 +1,7 @@
 type Evas.Coord: int; /* Simple type definition */
 type List_Objects: own(Eina.List*)< Eo *>; /* A little more complex */
 
-class Dummy {
+class Typedef {
    methods {
       foo {
          params {
index 60a12d7..57bdd82 100644 (file)
@@ -21,7 +21,8 @@ START_TEST(eolian_namespaces)
 
    eolian_init();
    /* Parsing */
-   fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/namespace.eo"));
+   fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
+   fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/nmsp1_class1.eo"));
 
    /* Classes existence  */
    fail_if(!(class11 = eolian_class_get_by_name("nmsp1.class1")));
@@ -151,7 +152,7 @@ START_TEST(eolian_override)
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/override.eo"));
 
    /* Class */
-   fail_if(!(class = eolian_class_get_by_name("Simple")));
+   fail_if(!(class = eolian_class_get_by_name("Override")));
    fail_if(!(base = eolian_class_get_by_name("Base")));
 
    /* Base ctor */
@@ -186,7 +187,7 @@ START_TEST(eolian_consts)
    eolian_init();
    /* Parsing */
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/consts.eo"));
-   fail_if(!(class = eolian_class_get_by_name("Const")));
+   fail_if(!(class = eolian_class_get_by_name("Consts")));
 
    /* Property */
    fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));
@@ -258,7 +259,7 @@ START_TEST(eolian_typedef)
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/typedef.eo"));
 
    /* Check that the class Dummy is still readable */
-   fail_if(!(class = eolian_class_get_by_name("Dummy")));
+   fail_if(!(class = eolian_class_get_by_name("Typedef")));
    fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD));
 
    /* Basic type */
@@ -410,7 +411,7 @@ START_TEST(eolian_scope)
    eolian_init();
    /* Parsing */
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/scope.eo"));
-   fail_if(!(class = eolian_class_get_by_name("Simple")));
+   fail_if(!(class = eolian_class_get_by_name("Scope")));
 
    /* Property scope */
    fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));
@@ -447,7 +448,7 @@ START_TEST(eolian_simple_parsing)
    eolian_init();
    /* Parsing */
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/class_simple.eo"));
-   fail_if(!(class = eolian_class_get_by_name("Simple")));
+   fail_if(!(class = eolian_class_get_by_name("Class_Simple")));
    fail_if(eolian_class_get_by_file("class_simple.eo") != class);
    fail_if(strcmp(eolian_class_file_get(class), "class_simple.eo"));
 
@@ -557,7 +558,7 @@ START_TEST(eolian_struct)
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/struct.eo"));
 
    /* Check that the class Dummy is still readable */
-   fail_if(!(class = eolian_class_get_by_name("Dummy")));
+   fail_if(!(class = eolian_class_get_by_name("Struct")));
    fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD));
 
    /* named struct */
@@ -624,7 +625,7 @@ START_TEST(eolian_extern)
    fail_if(!eolian_eo_file_parse(PACKAGE_DATA_DIR"/data/extern.eo"));
 
    /* Check that the class Dummy is still readable */
-   fail_if(!(class = eolian_class_get_by_name("Dummy")));
+   fail_if(!(class = eolian_class_get_by_name("Extern")));
    fail_if(!eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD));
 
    /* regular type */
@@ -655,7 +656,7 @@ START_TEST(eolian_class_funcs)
    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")));
+   fail_if(!(class = eolian_class_get_by_name("Class_Funcs")));
 
    /* Class properties */
    fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));