forked from enlightenment/efl
707 lines
28 KiB
Python
Executable File
707 lines
28 KiB
Python
Executable File
#!/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
|