}
}
- if (!eolian_state_file_parse(eos, input))
+ if (!eolian_state_file_path_parse(eos, input))
{
fprintf(stderr, "eolian: could not parse file '%s'\n", input);
goto end;
for(auto&& name : opts.in_files)
{
- Eolian_Unit const* unit = ::eolian_state_file_parse(opts.state, name.c_str());
+ Eolian_Unit const* unit = ::eolian_state_file_path_parse(opts.state, name.c_str());
if(!unit)
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
<< "No input file.";
assert(false && "Error parsing input file");
}
- if (!opts.main_header && !::eolian_state_file_parse(opts.state, opts.in_files[0].c_str()))
+ if (!opts.main_header && !::eolian_state_file_path_parse(opts.state, opts.in_files[0].c_str()))
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
<< "Failed parsing: " << opts.in_files[0] << ".";
<< "No input file.";
assert(false && "Error parsing input file");
}
- if (!::eolian_state_file_parse(opts.state, opts.in_file.c_str()))
+ if (!::eolian_state_file_path_parse(opts.state, opts.in_file.c_str()))
{
EINA_CXX_DOM_LOG_ERR(eolian_mono::domain)
<< "Failed parsing: " << opts.in_file << ".";
Eina_Iterator *eolian_state_eot_file_paths_get(const Eolian_State *state);
Eina_Iterator *eolian_state_eo_files_get(const Eolian_State *state);
Eina_Iterator *eolian_state_eot_files_get(const Eolian_State *state);
- const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filepath);
+ const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
+ const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
Eina_Bool eolian_state_all_eo_files_parse(Eolian_State *state);
Eina_Bool eolian_state_all_eot_files_parse(Eolian_State *state);
Eina_Bool eolian_state_check(const Eolian_State *state);
return eolian.eolian_state_system_directory_add(self) ~= 0
end,
- file_parse = function(self, fpath)
- local v = eolian.eolian_state_file_parse(self, fpath)
+ file_parse = function(self, fname)
+ local v = eolian.eolian_state_file_parse(self, fname)
+ if v == nil then
+ return nil
+ end
+ return v
+ end,
+
+ file_path_parse = function(self, fpath)
+ local v = eolian.eolian_state_file_path_parse(self, fpath)
if v == nil then
return nil
end
/*
* @brief Parse the given .eo or .eot file and fill the database.
*
- * The input can be either a full path to the file or only a filename.
- * If it's a filename, it must be scanned for first.
+ * The input must be a file name from a directory that was previously
+ * scanned with eolian_state_directory_add().
+ *
+ * @param[in] state The Eolian state.
+ * @param[in] filename The name of the file to parse.
+ * @return The unit corresponding to the parsed file or NULL.
+ *
+ * @see eolian_state_directory_add
+ * @see eolian_state_file_path_parse
+ *
+ * @ingroup Eolian
+ */
+EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
+
+/*
+ * @brief Parse the given .eo or .eot file and fill the database.
+ *
+ * The input is a file path. Its directory is scanned first, and then
+ * the file itself is parsed and a unit handle is returned.
*
* @param[in] state The Eolian state.
* @param[in] filepath Path to the file to parse.
*
* @ingroup Eolian
*/
-EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filepath);
+EAPI const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
/*
* @brief Parse all known eo files.
return ret;
}
+typedef struct _Scan_State
+{
+ Eolian_State *eos;
+ Eina_Bool succ;
+} Scan_State;
+
static void
-_scan_cb(const char *name, const char *path, void *data EINA_UNUSED)
+_scan_cb(const char *name, const char *path, void *data)
{
- Eolian_State *state = data;
+ Scan_State *sst = data;
Eina_Bool is_eo = eina_str_has_suffix(name, EO_SUFFIX);
if (!is_eo && !eina_str_has_suffix(name, EOT_SUFFIX)) return;
- eina_hash_add(is_eo ? state->filenames_eo : state->filenames_eot,
- eina_stringshare_add(name), join_path(path, name));
+ Eina_Hash *fh = is_eo ? sst->eos->filenames_eo : sst->eos->filenames_eot;
+ const char *origpath = eina_hash_find(fh, name);
+ char *newpath = join_path(path, name);
+ if (origpath)
+ {
+ if (strcmp(origpath, newpath))
+ {
+ eolian_state_log(sst->eos,
+ "conflicting paths for '%s': '%s' -> '%s'",
+ name, origpath, newpath);
+ sst->succ = EINA_FALSE;
+ }
+ free(newpath);
+ }
+ else
+ eina_hash_add(fh, name, newpath);
}
EAPI Eina_Bool
eolian_state_directory_add(Eolian_State *state, const char *dir)
{
if (!dir || !state) return EINA_FALSE;
- eina_file_dir_list(dir, EINA_TRUE, _scan_cb, state);
- return EINA_TRUE;
+ Scan_State sst = { state, EINA_TRUE };
+ return eina_file_dir_list(dir, EINA_TRUE, _scan_cb, &sst);
}
EAPI Eina_Bool
}
static Eolian_Unit *
-_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filepath)
+_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filename)
{
Eina_Bool is_eo;
- const char *eopath;
-
- is_eo = eina_str_has_suffix(filepath, EO_SUFFIX);
- if (!is_eo && !eina_str_has_suffix(filepath, EOT_SUFFIX))
+ is_eo = eina_str_has_suffix(filename, EO_SUFFIX);
+ if (!is_eo && !eina_str_has_suffix(filename, EOT_SUFFIX))
{
eolian_state_log(parent->state,
"file '%s' doesn't have a correct extension",
- filepath);
+ filename);
return NULL;
}
- if (!(eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : parent->state->filenames_eot, filepath)))
+ const char *eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : parent->state->filenames_eot, filename);
+ if (!eopath)
{
- char *vpath = eina_file_path_sanitize(filepath);
- Eolian_Unit *ret = eo_parser_database_fill(parent, vpath, !is_eo);
- free(vpath);
- return ret;
+ eolian_state_log(parent->state,
+ "file '%s' is not registered in the database",
+ filename);
+ return NULL;
}
return eo_parser_database_fill(parent, eopath, !is_eo);
}
}
EAPI const Eolian_Unit *
-eolian_state_file_parse(Eolian_State *state, const char *filepath)
+eolian_state_file_parse(Eolian_State *state, const char *filename)
{
if (!state)
return NULL;
_state_clean(state);
- Eolian_Unit *ret = _eolian_file_parse_nodep(&state->staging.unit, filepath);
+ Eolian_Unit *ret = _eolian_file_parse_nodep(&state->staging.unit, filename);
if (!ret)
return NULL;
if (!_parse_deferred(ret))
return ret;
}
+EAPI const Eolian_Unit *
+eolian_state_file_path_parse(Eolian_State *state, const char *filepath)
+{
+ if (!state)
+ return NULL;
+
+ char *mpath = strdup(filepath);
+ if (!mpath)
+ return NULL;
+
+ char *fname = strrchr(mpath, '/');
+ if (fname && strrchr(fname, '\\'))
+ fname = strrchr(fname, '\\');
+
+ const char *toscan = mpath;
+ if (!fname)
+ {
+ toscan = ".";
+ fname = mpath;
+ }
+ else
+ *fname++ = '\0';
+
+ if (!eolian_state_directory_add(state, toscan))
+ {
+ eolian_state_log(state, "could not scan directory '%s'", toscan);
+ return NULL;
+ }
+ return eolian_state_file_parse(state, fname);
+}
+
typedef struct _Parse_Data
{
Eolian_State *state;
def __repr__(self):
return "<eolian.Eolian_State, %d units loaded>" % len(list(self.units))
- def file_parse(self, filepath):
- c_unit = lib.eolian_state_file_parse(self, _str_to_bytes(filepath))
+ def file_parse(self, filename):
+ c_unit = lib.eolian_state_file_parse(self, _str_to_bytes(filename))
+ return Eolian_Unit(c_unit) if c_unit else None
+
+ def file_path_parse(self, filepath):
+ c_unit = lib.eolian_state_file_path_parse(self, _str_to_bytes(filepath))
return Eolian_Unit(c_unit) if c_unit else None
@property
lib.eolian_state_free.argtypes = (c_void_p,)
lib.eolian_state_free.restype = None
-# EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filepath);
+# EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
lib.eolian_state_file_parse.argtypes = (c_void_p, c_char_p)
lib.eolian_state_file_parse.restype = c_void_p
+# EAPI const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
+lib.eolian_state_file_path_parse.argtypes = (c_void_p, c_char_p)
+lib.eolian_state_file_path_parse.restype = c_void_p
+
# EAPI Eina_Iterator *eolian_state_eo_file_paths_get(const Eolian_State *state);
lib.eolian_state_eo_file_paths_get.argtypes = (c_void_p,)
lib.eolian_state_eo_file_paths_get.restype = c_void_p
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
- fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
- fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_b.eo"));
+ fail_if(!eolian_state_file_path_parse(eos, "aux_a.eo"));
+ fail_if(!eolian_state_file_parse(eos, "aux_b.eo"));
Eina_Hash *chash = eolian_aux_state_class_children_find(eos);
fail_if(!chash);
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
- fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
- fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_b.eo"));
+ fail_if(!eolian_state_file_parse(eos, "aux_a.eo"));
+ fail_if(!eolian_state_file_parse(eos, "aux_b.eo"));
Eina_Hash *chash = eolian_aux_state_class_children_find(eos);
fail_if(!chash);
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
- fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
+ fail_if(!eolian_state_file_parse(eos, "aux_a.eo"));
const Eolian_Class *acl = eolian_state_class_by_name_get(eos, "Aux_A");
fail_if(!acl);
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
- fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
+ fail_if(!eolian_state_file_parse(eos, "aux_a.eo"));
const Eolian_Class *acl = eolian_state_class_by_name_get(eos, "Aux_A");
fail_if(!acl);
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/nmsp1_class1.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "nmsp1_class1.eo")));
/* Classes existence */
fail_if(!(class11 = eolian_unit_class_by_name_get(unit, "nmsp1.class1")));
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/events.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "events.eo")));
/* Class */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Events")));
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/override.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "override.eo")));
/* Class */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Override")));
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/consts.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "consts.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Consts")));
/* Method */
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/ctor_dtor.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "ctor_dtor.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Ctor_Dtor")));
fail_if(!(base = eolian_unit_class_by_name_get(unit, "Base")));
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/typedef.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "typedef.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Typedef")));
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/complex_type.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "complex_type.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Complex_Type")));
/* Properties return type */
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/scope.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "scope.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Scope")));
/* Property scope */
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/class_simple.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "class_simple.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Class_Simple")));
fail_if(eolian_state_class_by_file_get(eos, "class_simple.eo") != class);
fail_if(strcmp(eolian_object_file_get((const Eolian_Object *)class), "class_simple.eo"));
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/struct.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "struct.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Struct")));
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/extern.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "extern.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Extern")));
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/var.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "var.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Var")));
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/enum.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "enum.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Enum")));
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/class_funcs.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "class_funcs.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Class_Funcs")));
/* Class properties */
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/free_func.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "free_func.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Free_Func")));
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/null.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "null.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Null")));
fail_if(!(func = eolian_class_function_by_name_get(class, "foo", EOLIAN_METHOD)));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/import.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "import.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Import")));
fail_if(!(tdl = eolian_unit_alias_by_name_get(unit, "Imported")));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/docs.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "docs.eo")));
fail_if(!(tdl = eolian_unit_struct_by_name_get(unit, "Foo")));
fail_if(!(doc = eolian_typedecl_documentation_get(tdl)));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
/* Parsing */
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/function_types.eot")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "function_types.eot")));
/* void func(void); */
fail_if(!(decl = eolian_unit_alias_by_name_get(unit, "VoidFunc")));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/function_as_argument.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "function_as_argument.eo")));
fail_if(!(cls = eolian_unit_class_by_name_get(unit, "Function_As_Argument")));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/parts.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "parts.eo")));
fail_if(!(cls = eolian_unit_class_by_name_get(unit, "Parts")));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/mixins_require.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "mixins_require.eo")));
fail_if (!(cl = eolian_state_class_by_name_get(eos, "Mixins.Require")));
fail_if (!(base = eolian_state_class_by_name_get(eos, "Base")));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
- fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/class_requires.eo")));
+ fail_if(!(unit = eolian_state_file_parse(eos, "class_requires.eo")));
fail_if (!(cl = eolian_state_class_by_name_get(eos, "Class.Requires")));
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
setenv("EOLIAN_CLASS_UNIMPLEMENTED_WARN", "1", 1);
- const Eolian_Unit *unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/unimpl.eo");
+ const Eolian_Unit *unit = eolian_state_file_parse(eos, "unimpl.eo");
unsetenv("EOLIAN_CLASS_UNIMPLEMENTED_WARN");
fail_if(!unit);
ck_assert(::eolian_state_directory_add(state.value, TESTS_SRC_DIR));
ck_assert(::eolian_state_directory_add(state.value, EO_SRC_DIR));
ck_assert(::eolian_state_all_eot_files_parse(state.value));
- std::string filename = TESTS_SRC_DIR;
- filename += "/" + target_file;
- ck_assert(::eolian_state_file_parse(state.value, filename.c_str()));
+ ck_assert(::eolian_state_file_parse(state.value, target_file.c_str()));
const Eolian_Class *c_klass = ::eolian_state_class_by_name_get(state.value, target_klass.c_str());
ck_assert_ptr_ne(c_klass, NULL);
{
ck_assert(::eolian_state_directory_add(state.value, TESTS_SRC_DIR));
ck_assert(::eolian_state_all_eot_files_parse(state.value));
- ck_assert(::eolian_state_file_parse(state.value, TESTS_SRC_DIR"/docs.eo"));
+ ck_assert(::eolian_state_file_parse(state.value, "docs.eo"));
const Eolian_Class *c_klass = ::eolian_state_class_by_name_get(state.value, "Docs");
ck_assert_ptr_ne(c_klass, NULL);
efl::eolian::eolian_state state;
fail_if(!::eolian_state_directory_add(state.value, EO_SRC_DIR));
fail_if(!::eolian_state_directory_add(state.value, TESTS_SRC_DIR));
- fail_if(!::eolian_state_file_parse(state.value, TESTS_SRC_DIR"/complex.eo"));
+ fail_if(!::eolian_state_file_parse(state.value, "complex.eo"));
// TODO finish
}
EFL_END_TEST