#!/usr/bin/env python3 # encoding: utf-8 """ Pyolian test suite ================== to run all the tests: > pytest test_eolian.py """ import os import sys import pytest from . import eolian # Use .eo files from the source tree (not the installed ones) script_path = os.path.dirname(os.path.realpath(__file__)) root_path = os.path.abspath(os.path.join(script_path, '..', '..', '..')) SCAN_FOLDER = os.path.join(root_path, 'src', 'lib') # the main Eolian unit state eolian_db = None @pytest.fixture(scope='module') def eolian_db(): db = eolian.Eolian_State() if not isinstance(db, eolian.Eolian_State): raise (RuntimeError('Eolian, failed to create Eolian state')) # eolian system scan (BROKEN) # if not eolian_db.system_directory_add(): # raise(RuntimeError('Eolian, failed to scan system directories')) # eolian source tree scan if not db.directory_add(SCAN_FOLDER): raise (RuntimeError('Eolian, failed to scan source directory')) # Parse all known eo files if not db.all_eot_files_parse(): raise (RuntimeError('Eolian, failed to parse all EOT files')) if not db.all_eo_files_parse(): raise (RuntimeError('Eolian, failed to parse all EO files')) # tests are executed here yield db # cleanup eolian del db class TestEolian(object): def test_file_format(self): v = eolian.file_format_version assert isinstance(v, int) assert v >= 1 class TestBaseObject(object): def test_base_object_equality(self, eolian_db): cls1 = eolian_db.class_by_name_get('Efl.Loop_Timer') cls2 = eolian_db.class_by_file_get('efl_loop_timer.eo') assert isinstance(cls1, eolian.Class) assert isinstance(cls2, eolian.Class) assert cls1 == cls2 assert cls1 == 'Efl.Loop_Timer' assert cls2 == 'Efl.Loop_Timer' assert cls1 != 'another string' assert cls1 != 1234 assert cls1 is not None assert cls1 != 0 enum1 = eolian_db.enum_by_name_get('Efl.Ui.Focus.Direction') enum2 = eolian_db.enum_by_name_get('Efl.Ui.Focus.Direction') assert isinstance(enum1, eolian.Typedecl) assert isinstance(enum2, eolian.Typedecl) assert enum1 == enum2 assert enum1 == 'Efl.Ui.Focus.Direction' assert enum2 == 'Efl.Ui.Focus.Direction' assert enum1 != 'another string' assert enum1 != 1234 assert enum1 is not None assert enum1 != 0 assert cls1 != enum1 class TestEolianState(object): def test_unit_getters(self, eolian_db): count = 0 for unit in eolian_db.units: assert isinstance(unit, eolian.Eolian_Unit) assert unit.file.endswith(('.eo', '.eot')) count += 1 assert count > 400 unit = eolian_db.unit_by_file_get('efl_ui_win.eo') assert isinstance(unit, eolian.Eolian_Unit) assert unit.file == 'efl_ui_win.eo' def test_object_getters(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert isinstance(obj, eolian.Object) assert type(obj) != eolian.Object assert obj.name == 'Efl.Ui.Frame' count = 0 for obj in eolian_db.objects: assert isinstance(obj, eolian.Object) assert type(obj) != eolian.Object count += 1 assert count > 800 count = 0 for obj in eolian_db.objects_by_file_get('efl_loop.eo'): assert isinstance(obj, eolian.Object) assert type(obj) != eolian.Object count += 1 assert count > 1 @pytest.mark.skip(reason='Should this return True sooner or later?') def test_integrity(self, eolian_db): assert eolian_db.state_check() is True class TestEolianUnit(object): def test_unit_get(self, eolian_db): unit = eolian_db.unit_by_file_get('efl_ui_win.eo') assert isinstance(unit.state, eolian.Eolian_State) assert unit.state == eolian_db assert isinstance(unit.version, int) assert unit.version >= 1 def test_file_get(self, eolian_db): unit = eolian_db.unit_by_file_get('efl_ui_win.eo') assert isinstance(unit, eolian.Eolian_Unit) assert unit.file == 'efl_ui_win.eo' assert unit.file_path.endswith('efl_ui_win.eo') # full path can change @pytest.mark.skip(reason='Skipped until unit/state support is fixed') def test_children_listing(self, eolian_db): li = list(eolian_db.children) assert len(li) > 500 assert isinstance(li[0], eolian.Eolian_Unit) def test_file_listing(self, eolian_db): li = list(eolian_db.eo_file_paths) assert len(li) > 400 assert li[0].endswith('.eo') li = list(eolian_db.eo_files) assert len(li) > 400 assert li[0].endswith('.eo') li = list(eolian_db.eot_file_paths) assert len(li) > 10 assert li[0].endswith('.eot') li = list(eolian_db.eot_files) assert len(li) > 10 assert li[0].endswith('.eot') def test_object_listing(self, eolian_db): unit = eolian_db.unit_by_file_get('efl_ui_win.eo') assert unit.object_by_name_get('Efl.Ui.Frame') is None obj = unit.object_by_name_get('Efl.Ui.Win') assert isinstance(obj, eolian.Object) assert type(obj) != eolian.Object assert obj.name == 'Efl.Ui.Win' count = 0 for obj in unit.objects: assert isinstance(obj, eolian.Object) assert type(obj) != eolian.Object count += 1 assert count > 5 def test_enum_listing(self, eolian_db): li = list(eolian_db.enums_by_file_get('efl_ui_win.eo')) assert len(li) > 5 assert isinstance(li[0], eolian.Typedecl) assert li[0].type == eolian.Eolian_Typedecl_Type.ENUM all_count = 0 for enum in eolian_db.enums: assert isinstance(enum, eolian.Typedecl) assert enum.type == eolian.Eolian_Typedecl_Type.ENUM all_count += 1 assert all_count > 50 def test_struct_listing(self, eolian_db): li = list(eolian_db.structs_by_file_get('eina_types.eot')) assert len(li) > 10 assert isinstance(li[0], eolian.Typedecl) assert li[0].type in (eolian.Eolian_Typedecl_Type.STRUCT, eolian.Eolian_Typedecl_Type.STRUCT_OPAQUE) all_count = 0 for struct in eolian_db.structs: assert isinstance(struct, eolian.Typedecl) assert struct.type in (eolian.Eolian_Typedecl_Type.STRUCT, eolian.Eolian_Typedecl_Type.STRUCT_OPAQUE) all_count += 1 assert all_count > 50 def test_alias_listing(self, eolian_db): li = list(eolian_db.aliases_by_file_get('eina_types.eot')) assert len(li) > 2 assert isinstance(li[0], eolian.Typedecl) all_count = 0 for alias in eolian_db.aliases: assert isinstance(alias, eolian.Typedecl) assert alias.type in (eolian.Eolian_Typedecl_Type.ALIAS, eolian.Eolian_Typedecl_Type.FUNCTION_POINTER) # TODO is this correct ?? all_count += 1 assert all_count > 10 def test_constant_listing(self, eolian_db): li = list(eolian_db.constants) assert len(li) > 2 assert isinstance(li[0], eolian.Constant) li = list(eolian_db.constants_by_file_get('efl_gfx_stack.eo')) assert len(li) > 1 assert isinstance(li[0], eolian.Constant) def test_class_listing(self, eolian_db): all_count = 0 for cls in eolian_db.classes: assert isinstance(cls, eolian.Class) all_count += 1 assert all_count > 400 class TestEolianNamespace(object): def test_all_namespace(self, eolian_db): count = 0 for ns in eolian_db.all_namespaces: assert isinstance(ns, eolian.Namespace) count += 1 assert count > 50 def test_namespace_vs_class_collision(self, eolian_db): colliding_classes = ['Ecore.Audio', 'Ecore.Audio.In', 'Ecore.Audio.Out', 'Ecore.Event.Message', 'Ector.Buffer', 'Ector.Renderer', 'Ector.Renderer.Cairo', 'Ector.Renderer.GL', 'Ector.Renderer.Gradient', 'Ector.Renderer.Software', 'Ector.Software.Buffer', 'Eio.Sentry', 'Eldbus.Model', ] for ns in eolian_db.all_namespaces: cls = eolian_db.class_by_name_get(ns.name) # Some legacy classes are parsed and still make this fail. if cls: assert cls.name in colliding_classes else: assert cls is None def test_namespace_equality(self, eolian_db): ns1 = eolian.Namespace(eolian_db, 'Efl.Io') ns2 = eolian.Namespace(eolian_db, 'Efl.Net') assert isinstance(ns1, eolian.Namespace) assert isinstance(ns2, eolian.Namespace) assert ns1 != ns2 assert ns1 == eolian.Namespace(eolian_db, 'Efl.Io') assert ns2 == eolian.Namespace(eolian_db, 'Efl.Net') def test_namespace_sorting(self, eolian_db): nspaces = eolian_db.all_namespaces nspaces.sort(reverse=True) assert nspaces[0] > nspaces[-1] assert nspaces[1] < nspaces[0] def test_namespace_by_name(self, eolian_db): ns = eolian.Namespace(eolian_db, 'Efl.Net') assert isinstance(ns, eolian.Namespace) assert ns.name == 'Efl.Net' assert ns.namespaces == ['Efl', 'Net'] ns = eolian_db.namespace_get_by_name('Efl') assert isinstance(ns, eolian.Namespace) assert ns.name == 'Efl' assert len(ns.classes) > 30 for cls in ns.classes: assert isinstance(cls, eolian.Class) assert len(ns.regulars) > 4 for cls in ns.regulars: assert isinstance(cls, eolian.Class) assert cls.type == eolian.Eolian_Class_Type.REGULAR assert len(ns.mixins) > 0 for cls in ns.mixins: assert isinstance(cls, eolian.Class) assert cls.type == eolian.Eolian_Class_Type.MIXIN assert len(ns.interfaces) > 15 for cls in ns.interfaces: assert isinstance(cls, eolian.Class) assert cls.type == eolian.Eolian_Class_Type.INTERFACE assert len(ns.enums) > 1 for td in ns.enums: assert isinstance(td, eolian.Typedecl) assert td.type == eolian.Eolian_Typedecl_Type.ENUM assert len(ns.aliases) > 0 for td in ns.aliases: assert isinstance(td, eolian.Typedecl) # TODO eolian_typedecl_all_aliases_get also return FUNCTION_POINTER # is this correct? or an eolian bug ? # assert Equal(td.type, eolian.Eolian_Typedecl_Type.ALIAS) assert len(ns.structs) > 2 for td in ns.structs: assert isinstance(td, eolian.Typedecl) assert td.type == eolian.Eolian_Typedecl_Type.STRUCT class TestEolianObject(object): def test_object_instance(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert isinstance(obj, eolian.Class) assert obj.name == 'Efl.Ui.Frame' def test_unit(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert isinstance(obj.unit, eolian.Eolian_Unit) assert obj.unit.file == 'efl_ui_frame.eo' def test_name(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert obj.name == 'Efl.Ui.Frame' assert obj.c_name == 'Efl_Ui_Frame' def test_short_name(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert obj.short_name == 'Frame' def test_file(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert obj.file == 'efl_ui_frame.eo' def test_line(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert isinstance(obj.line, int) assert obj.line > 0 def test_column(self, eolian_db): obj = eolian_db.object_by_name_get('Efl.Ui.Frame') assert isinstance(obj.column, int) assert obj.column > 0 class TestEolianClass(object): def test_class(self, eolian_db): cls = eolian_db.class_by_file_get('efl_loop_timer.eo') assert isinstance(cls, eolian.Class) cls = eolian_db.class_by_name_get('Efl.Loop_Timer') assert isinstance(cls, eolian.Class) assert cls.name == 'Efl.Loop_Timer' assert cls.short_name == 'Loop_Timer' assert cls.file == 'efl_loop_timer.eo' assert list(cls.namespaces) == ['Efl'] assert cls.type == eolian.Eolian_Class_Type.REGULAR assert isinstance(cls.documentation, eolian.Documentation) assert cls.c_prefix is None # TODO fin a class with a value assert cls.event_c_prefix is None # TODO same as above assert cls.data_type is None # TODO same as above assert cls.parent.name == 'Efl.Loop_Consumer' assert [c.name for c in cls.extensions] == [] assert [c.name for c in cls.hierarchy] == ['Efl.Loop_Consumer', 'Efl.Object'] assert cls.ctor_enable is False assert cls.dtor_enable is False assert cls.c_get_function_name == 'efl_loop_timer_class_get' assert cls.c_macro == 'EFL_LOOP_TIMER_CLASS' assert cls.c_data_type == 'Efl_Loop_Timer_Data' assert [f.name for f in cls.methods] == ['timer_reset', 'timer_loop_reset', 'timer_delay'] assert [f.name for f in cls.properties] == ['timer_interval', 'time_pending'] assert len(list(cls.implements)) > 5 assert isinstance(list(cls.implements)[0], eolian.Implement) def test_mixins_requires(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Loop_Timer') assert len(list(cls.requires)) == 0 cls = eolian_db.class_by_name_get('Efl.File') assert len(list(cls.requires)) == 1 assert list(cls.requires)[0].name == 'Efl.Object' class TestEolianFunction(object): def test_function(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Loop_Timer') f = cls.function_by_name_get('timer_delay') assert isinstance(f, eolian.Function) assert f.name == 'timer_delay' assert f.type == eolian.Eolian_Function_Type.METHOD assert f.method_scope == eolian.Eolian_Object_Scope.PUBLIC assert f.getter_scope == eolian.Eolian_Object_Scope.UNKNOWN # TODO correct ? assert f.setter_scope == eolian.Eolian_Object_Scope.UNKNOWN # TODO correct ? assert f.full_c_method_name == 'efl_loop_timer_delay' assert f.full_c_getter_name == 'efl_loop_timer_delay_get' assert f.full_c_setter_name == 'efl_loop_timer_delay_set' assert f.method_return_type is None # TODO correct ? assert f.setter_return_type is None # TODO correct ? assert f.getter_return_type is None # TODO correct ? assert f.is_static is False assert f.is_beta is False assert f.is_constructor(cls) is False # # #assert f.is_function_pointer == False # TODO broken somehow assert len(list(f.getter_values)) == 1 assert len(list(f.getter_values)) == 1 assert len(list(f.parameters)) == 1 assert f.return_allow_unused(eolian.Eolian_Function_Type.PROP_GET) is True assert f.return_is_by_ref(eolian.Eolian_Function_Type.PROP_GET) is False assert f.return_is_move(eolian.Eolian_Function_Type.PROP_GET) is False assert f.object_is_const is False assert f.class_.name == 'Efl.Loop_Timer' assert isinstance(f.implement, eolian.Implement) def test_function_parameter(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Loop_Timer') f = cls.function_by_name_get('timer_delay') p = list(f.parameters)[0] assert p.direction == eolian.Eolian_Parameter_Direction.IN assert p.name == 'add' assert p.default_value is None assert p.is_optional is False assert p.is_by_ref is False assert p.is_move is False assert p.type.name == 'double' assert p.c_type_get(False) == 'double' assert p.c_type_get(True) == 'double' assert isinstance(p.documentation, eolian.Documentation) class TestEolianImplement(object): def test_implement(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Loop_Timer') f = cls.function_by_name_get('timer_delay') im = f.implement assert isinstance(im, eolian.Implement) assert im.name == 'Efl.Loop_Timer.timer_delay' assert isinstance(im.class_, eolian.Class) assert isinstance(im.function, eolian.Function) assert isinstance(im.implementing_class, eolian.Class) assert im.implementing_class.name == 'Efl.Loop_Timer' assert isinstance(im.documentation_get(), eolian.Documentation) # TODO is UNRESOLVED correct ? assert im.is_auto() is False assert im.is_empty() is False assert im.is_pure_virtual() is False assert im.is_prop_set is False assert im.is_prop_get is False assert im.is_property is False assert im.is_method is True assert im.parent is None def test_implement_parent(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Ui.Button') im = [im for im in cls.implements if im.short_name == 'content_unset'][0] assert isinstance(im, eolian.Implement) assert im.name == 'Efl.Content.content_unset' # TODO is this right?? assert im.parent.name == 'Efl.Content.content_unset' class TestEolianEvent(object): def test_event(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Loop_Timer') assert [e.name for e in cls.events] == ['timer,tick'] ev = cls.event_by_name_get('timer,tick') assert isinstance(ev, eolian.Event) assert ev.name == 'timer,tick' assert ev.c_macro == 'EFL_LOOP_TIMER_EVENT_TIMER_TICK' assert ev.type is None # TODO is this correct assert isinstance(ev.documentation, eolian.Documentation) assert ev.scope == eolian.Eolian_Object_Scope.PUBLIC assert ev.is_beta is False assert ev.is_hot is False assert ev.is_restart is False assert ev.class_.name == cls.name class TestEolianPart(object): def test_part(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Ui.Popup') parts = list(cls.parts) assert len(parts) > 0 part = parts[0] assert part.name == 'backwall' assert isinstance(part.class_, eolian.Class) assert part.class_.name == 'Efl.Ui.Popup_Part_Backwall' assert isinstance(part.documentation, eolian.Documentation) class TestEolianConstructor(object): def test_constructor(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Ui.Win') ctors = list(cls.constructors) assert len(ctors) > 0 ctor = ctors[0] assert isinstance(ctor, eolian.Constructor) assert ctor.name == 'Efl.Ui.Win.win_name' assert ctor.is_optional is True assert isinstance(ctor.class_, eolian.Class) assert ctor.class_.name == 'Efl.Ui.Win' assert isinstance(ctor.function, eolian.Function) assert ctor.function.name == 'win_name' class TestEolianDocumentation(object): def test_documentation(self, eolian_db): td = eolian_db.class_by_name_get('Efl.Object') doc = td.documentation assert isinstance(doc, eolian.Documentation) assert isinstance(doc.summary, str) assert len(doc.summary) > 10 assert isinstance(doc.description, str) assert len(doc.description) > 20 assert doc.since == '1.22' class TestEolianConstant(object): def test_constant(self, eolian_db): var = eolian_db.constant_by_name_get('Efl.Gfx.Hint_Expand') assert isinstance(var, eolian.Constant) assert var.name == 'Efl.Gfx.Hint_Expand' assert var.short_name == 'Hint_Expand' assert var.file == 'efl_gfx_hint.eo' assert var.is_extern is False assert list(var.namespaces) == ['Efl', 'Gfx'] assert isinstance(var.documentation, eolian.Documentation) assert isinstance(var.type, eolian.Type) assert isinstance(var.value, eolian.Expression) assert float(var.value.serialize) == +1.0 class TestEolianTypedecl(object): def test_typedecl_enum(self, eolian_db): td = eolian_db.enum_by_name_get('Efl.Net.Http.Version') assert isinstance(td, eolian.Typedecl) assert td.name == 'Efl.Net.Http.Version' assert td.short_name == 'Version' assert td.file == 'efl_net_http_types.eot' assert list(td.namespaces) == ['Efl', 'Net', 'Http'] assert isinstance(td.documentation, eolian.Documentation) assert td.base_type is None # TODO find a better test assert td.free_func is None # TODO find a better test assert td.function_pointer is None # TODO find a better test assert td.is_extern is False assert len(list(td.enum_fields)) == 3 assert td.c_type == 'enum Efl_Net_Http_Version { v1_0 = 100, v1_1 = 101, v2_0 = 200 }' def test_typedecl_enum_field(self, eolian_db): td = eolian_db.enum_by_name_get('Efl.Net.Http.Version') field = td.enum_field_get('v1_0') assert isinstance(field, eolian.Enum_Type_Field) assert field.name == 'v1_0' assert field.c_constant == 'EFL_NET_HTTP_VERSION_V1_0' assert isinstance(field.documentation, eolian.Documentation) assert isinstance(field.value, eolian.Expression) def test_typedecl_struct(self, eolian_db): td = eolian_db.struct_by_name_get('Efl.Gfx.Color32') assert isinstance(td, eolian.Typedecl) assert td.name == 'Efl.Gfx.Color32' assert td.short_name == 'Color32' assert td.file == 'efl_canvas_filter_internal.eo' assert list(td.namespaces) == ['Efl', 'Gfx'] assert isinstance(td.documentation, eolian.Documentation) assert td.base_type is None # TODO find a better test assert td.free_func is None # TODO find a better test assert td.function_pointer is None # TODO find a better test assert td.is_extern is False assert len(list(td.struct_fields)) == 4 assert td.c_type == 'struct Efl_Gfx_Color32 { uint8_t r; uint8_t g; uint8_t b; uint8_t a; }' def test_typedecl_struct_field(self, eolian_db): td = eolian_db.struct_by_name_get('Efl.Gfx.Color32') field = td.struct_field_get('b') assert isinstance(field, eolian.Struct_Type_Field) assert field.name == 'b' assert isinstance(field.type, eolian.Type) assert isinstance(field.documentation, eolian.Documentation) assert field.c_type == "uint8_t" assert field.is_by_ref is False assert field.is_move is False def test_typedecl_alias(self, eolian_db): alias = eolian_db.alias_by_name_get('Eina.Error') assert isinstance(alias, eolian.Typedecl) assert alias.type == eolian.Eolian_Typedecl_Type.ALIAS assert alias.name == 'Eina.Error' assert alias.short_name == 'Error' assert isinstance(alias.aliased_base, eolian.Type) assert alias.aliased_base.name == 'int' assert alias.c_type == 'typedef int Eina_Error' class TestEolianType(object): def test_type_regular_builtin(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Loop_Timer') func = cls.function_by_name_get('timer_delay') param = list(func.parameters)[0] t = param.type # type double assert isinstance(t, eolian.Type) assert t.name == 'double' assert t.short_name == 'double' assert t.type == eolian.Eolian_Type_Type.REGULAR assert t.builtin_type == eolian.Eolian_Type_Builtin_Type.DOUBLE assert t.file == 'efl_loop_timer.eo' # TODO is this correct ? assert t.base_type is None # TODO find a better test assert t.next_type is None # TODO find a better test assert t.is_const is False assert t.is_ptr is False assert t.is_move is False assert list(t.namespaces) == [] assert t.class_ is None assert t == t.aliased_base # TODO find a better test def test_type_regular(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Gfx.Entity') func = cls.function_by_name_get('geometry') param = list(func.setter_values)[0] t = param.type # type Eina.Rect assert isinstance(t, eolian.Type) assert t.name == 'Eina.Rect' assert t.short_name == 'Rect' assert t.type == eolian.Eolian_Type_Type.REGULAR assert t.builtin_type == eolian.Eolian_Type_Builtin_Type.INVALID assert t.file == 'efl_gfx_entity.eo' # TODO is this correct ? assert t.is_const is False assert t.is_ptr is False assert t.is_move is False assert list(t.namespaces) == ['Eina'] assert t.class_ is None assert t == t.aliased_base td = t.typedecl assert isinstance(td, eolian.Typedecl) assert td.name == 'Eina.Rect' def test_type_class(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Content') func = cls.function_by_name_get('content') param = list(func.setter_values)[0] t = param.type # type Efl.Gfx (class interface) assert isinstance(t, eolian.Type) assert t.name == 'Efl.Gfx.Entity' assert t.short_name == 'Entity' assert t.type == eolian.Eolian_Type_Type.CLASS assert t.builtin_type == eolian.Eolian_Type_Builtin_Type.INVALID assert t.file == 'efl_content.eo' # TODO is this correct ? assert t.is_const is False assert t.is_ptr is False assert t.is_move is False assert list(t.namespaces) == ['Efl', 'Gfx'] assert t == t.aliased_base cls = t.class_ assert isinstance(cls, eolian.Class) assert cls.name == 'Efl.Gfx.Entity' class TestEolianExpression(object): def test_expression_simple(self, eolian_db): td = eolian_db.enum_by_name_get('Efl.Net.Http.Version') field = td.enum_field_get('v1_0') exp = field.value assert isinstance(exp, eolian.Expression) assert exp.type == eolian.Eolian_Expression_Type.INT assert exp.serialize == '100' def test_expression_unary(self, eolian_db): var = eolian_db.constant_by_name_get('Efl.Gfx.Stack_Layer_Min') exp = var.value assert isinstance(exp, eolian.Expression) assert exp.type == eolian.Eolian_Expression_Type.UNARY assert float(exp.serialize) == 32768.0 # TODO is this a bug? isn't -1.0 = assert exp.unary_operator == eolian.Eolian_Unary_Operator.UNM # Invalid -> NO unary = exp.unary_expression assert isinstance(unary, eolian.Expression) assert unary.type == eolian.Eolian_Expression_Type.INT assert float(exp.serialize) == 32768.0 # Bug too ? # TODO test_expression_binary # exp.binary_operator # TODO find a better test (only works for BINARY expr) # exp.binary_lhs # TODO find a better test (only works for BINARY expr) # exp.binary_rhs # TODO find a better test (only works for BINARY expr) class TestEolianInherits(object): def test_inherits_full(self, eolian_db): cls = eolian_db.class_by_name_get('Efl.Ui.Widget') assert 'Efl.Object' in cls.inherits_full