Skip to content

Commit

Permalink
Tests: move test_utils
Browse files Browse the repository at this point in the history
This will now be tested with pytests
Provide some bootstrap files (autoconfig and parser test case) to get the test to run
This will need to be refactored later
  • Loading branch information
iMichka committed May 6, 2024
1 parent 67364e5 commit 853e51f
Show file tree
Hide file tree
Showing 6 changed files with 163 additions and 12 deletions.
Empty file added tests/__init__.py
Empty file.
55 changes: 55 additions & 0 deletions tests/autoconfig.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Copyright 2014-2017 Insight Software Consortium.
# Copyright 2004-2009 Roman Yakovenko.
# Distributed under the Boost Software License, Version 1.0.
# See http://www.boost.org/LICENSE_1_0.txt

import os
import sys
import logging
import warnings
import platform

# Prevents copy.deepcopy RecursionError in some tests (Travis build)
sys.setrecursionlimit(10000)

this_module_dir_path = os.path.abspath(
os.path.dirname(sys.modules[__name__].__file__))

data_directory = os.path.join(this_module_dir_path, 'data')
build_directory = os.path.join(this_module_dir_path, 'temp')

sys.path.insert(1, os.path.join(os.curdir, '..'))
# The tests are run on the parent pygccxml directory, not the one
# in site-packages. Insert the directory's path.
sys.path.insert(1, "../src/pygccxml")

from pygccxml import parser # nopep8
from pygccxml import utils # nopep8

# We want to make sure we throw an error for ALL the warnings during the
# tests. This will allow us to be notified by the build bots, so that the
# warnings can be fixed.
warnings.simplefilter("error", Warning)

# Set logging level
utils.loggers.set_level(logging.CRITICAL)

# Find out the c++ parser (gccxml or castxml)
generator_path, generator_name = utils.find_xml_generator()


class cxx_parsers_cfg(object):
config = parser.load_xml_generator_configuration(
os.path.normpath(this_module_dir_path + '/xml_generator.cfg'),
xml_generator_path=generator_path,
working_directory=data_directory,
xml_generator=generator_name)

if platform.system() == 'Windows':
config.define_symbols.append('_HAS_EXCEPTIONS=0')


if cxx_parsers_cfg.config.xml_generator:
generator_name = cxx_parsers_cfg.config.xml_generator
if cxx_parsers_cfg.config.xml_generator_path:
generator_path = cxx_parsers_cfg.config.xml_generator_path
103 changes: 103 additions & 0 deletions tests/parser_test_case.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Copyright 2014-2017 Insight Software Consortium.
# Copyright 2004-2009 Roman Yakovenko.
# Distributed under the Boost Software License, Version 1.0.
# See http://www.boost.org/LICENSE_1_0.txt

import pprint
import time
import unittest

from . import autoconfig


class parser_test_case_t(unittest.TestCase):

CXX_PARSER_CFG = None
xml_generator_from_xml_file = None

def __init__(self, *args):
unittest.TestCase.__init__(self, *args)
self.xml_generator_from_xml_file = None
if self.CXX_PARSER_CFG:
self.config = self.CXX_PARSER_CFG.clone()
elif autoconfig.cxx_parsers_cfg.config:
self.config = autoconfig.cxx_parsers_cfg.config.clone()
else:
pass

def run(self, result=None):
"""
Override the run method.
Allows to measure the time each test needs. The result is written
in the test_cost.log file.
"""
with open("test_cost.log", "a") as cost_file:
start_time = time.time()
super(parser_test_case_t, self).run(result)
name = super(parser_test_case_t, self).id()
cost_file.write(
name + " " +
str(time.time() - start_time) + "\n")

def _test_type_composition(self, type_, expected_compound, expected_base):
self.assertTrue(
isinstance(type_, expected_compound),
"the compound type('%s') should be '%s'" %
(type_.decl_string, expected_compound.__name__))
self.assertTrue(
isinstance(type_.base, expected_base),
"base type('%s') should be '%s'" %
(type_.decl_string, expected_base.__name__))

def _test_calldef_return_type(self, calldef, expected_type):
self.assertTrue(
isinstance(calldef.return_type, expected_type),
("the function's '%s' expected return type is '%s' and in " +
"reality it is different('%s')") %
(calldef.name, expected_type.__name__,
calldef.return_type.__class__.__name__))

def _test_calldef_args(self, calldef, expected_args):
self.assertTrue(
len(calldef.arguments) == len(expected_args),
("the function's '%s' expected number of arguments is '%d' and " +
"in reality it is different('%d')") %
(calldef.name, len(expected_args), len(calldef.arguments)))

for i, expected_arg in enumerate(expected_args):
arg = calldef.arguments[i]
self.assertTrue(
arg == expected_arg,
("the function's '%s' expected %d's argument is '%s' and in " +
"reality it is different('%s')") %
(calldef.name, i, pprint.pformat(expected_arg.__dict__),
pprint.pformat(arg.__dict__)))

def _test_calldef_exceptions(self, calldef, exceptions):
# exceptions is list of classes names
exception_decls = []
for name in exceptions:
exception_decl = self.global_ns.class_(name)
self.assertTrue(
exception_decl,
"unable to find exception class '%s'" %
name)
exception_decls.append(exception_decl)
exception_decls.sort()
self.assertTrue(
len(calldef.exceptions) == len(exception_decls),
("the function's '%s' expected number of exceptions is '%d' and " +
"in reality it is different('%d')") %
(calldef.name,
len(exception_decls),
len(calldef.exceptions)))
exceptions_indeed = sorted(calldef.exceptions[:])
self.assertTrue(
exception_decls == exceptions_indeed,
("the function's '%s' expected exceptions are '%s' and in " +
"reality it is different('%s')") %
(calldef.name,
pprint.pformat([delc.name for delc in exception_decls]),
pprint.pformat([delc.name for delc in exceptions_indeed])))
2 changes: 1 addition & 1 deletion unittests/test_utils.py → tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

class Test(parser_test_case.parser_test_case_t):

def test(self):
def test_contains_parent_dir(self):
path = os.path.normpath("/mypath/folder1/folder2/folder3")
dirs = [
os.path.normpath("/mypath/folder1/folder2/"),
Expand Down
13 changes: 4 additions & 9 deletions unittests/autoconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
import warnings
import platform

from pygccxml import parser
from pygccxml import utils

# Prevents copy.deepcopy RecursionError in some tests (Travis build)
sys.setrecursionlimit(10000)

Expand All @@ -18,14 +21,6 @@
data_directory = os.path.join(this_module_dir_path, 'data')
build_directory = os.path.join(this_module_dir_path, 'temp')

sys.path.insert(1, os.path.join(os.curdir, '..'))
# The tests are run on the parent pygccxml directory, not the one
# in site-packages. Insert the directory's path.
sys.path.insert(1, "../src/pygccxml")

from pygccxml import parser # nopep8
from pygccxml import utils # nopep8

# We want to make sure we throw an error for ALL the warnings during the
# tests. This will allow us to be notified by the build bots, so that the
# warnings can be fixed.
Expand All @@ -34,7 +29,7 @@
# Set logging level
utils.loggers.set_level(logging.CRITICAL)

# Find out the c++ parser (gccxml or castxml)
# Find out the c++ parser (castxml)
generator_path, generator_name = utils.find_xml_generator()


Expand Down
2 changes: 0 additions & 2 deletions unittests/test_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@
from . import inline_specifier_tester
from . import test_create_decl_string
from . import example_tester
from . import test_utils
from . import test_va_list_tag_removal
from . import test_copy_constructor
from . import test_cpp_standards
Expand Down Expand Up @@ -140,7 +139,6 @@
test_pattern_parser,
test_function_pointer,
test_directory_cache,
test_utils,
test_cpp_standards,
test_va_list_tag_removal,
decl_printer_tester,
Expand Down

0 comments on commit 853e51f

Please sign in to comment.