File: test_dependencies.py

package info (click to toggle)
pygccxml 3.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,444 kB
  • sloc: xml: 29,841; python: 13,914; cpp: 2,671; makefile: 163; ansic: 59
file content (148 lines) | stat: -rw-r--r-- 5,522 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# 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 pytest
import warnings

from . import autoconfig

from pygccxml import parser
from pygccxml import declarations

TEST_FILES = [
    "include_all.hpp",
]


@pytest.fixture
def global_ns():
    COMPILATION_MODE = parser.COMPILATION_MODE.ALL_AT_ONCE
    INIT_OPTIMIZER = True
    config = autoconfig.cxx_parsers_cfg.config.clone()
    config.castxml_epic_version = 1
    decls = parser.parse(TEST_FILES, config, COMPILATION_MODE)
    global_ns = declarations.get_global_namespace(decls)
    if INIT_OPTIMIZER:
        global_ns.init_optimizer()
    return global_ns


def test_variable(global_ns):
    ns_vars = global_ns.namespace('::declarations::variables')
    static_var = ns_vars.variable('static_var')

    # Legacy way of fetching dependencies. Is still valid but deprecated
    warnings.simplefilter("ignore", Warning)
    dependencies_old = static_var.i_depend_on_them()
    warnings.simplefilter("error", Warning)
    assert len(dependencies_old) == 1
    assert dependencies_old[0].declaration is static_var
    assert dependencies_old[0].depend_on_it.decl_string == 'int'

    dependencies_new = declarations.get_dependencies_from_decl(static_var)
    assert len(dependencies_new) == 1
    assert dependencies_new[0].declaration is static_var
    assert dependencies_new[0].depend_on_it.decl_string == 'int'

    m_mutable = ns_vars.variable('m_mutable')

    # Legacy way of fetching dependencies. Is still valid but deprecated
    warnings.simplefilter("ignore", Warning)
    dependencies_old = m_mutable.i_depend_on_them()
    warnings.simplefilter("error", Warning)
    assert len(dependencies_old) == 1
    assert dependencies_old[0].declaration is m_mutable
    assert dependencies_old[0].depend_on_it.decl_string == 'int'

    dependencies_new = declarations.get_dependencies_from_decl(m_mutable)
    assert len(dependencies_new) == 1
    assert dependencies_new[0].declaration is m_mutable
    assert dependencies_new[0].depend_on_it.decl_string == 'int'


def test_class(global_ns):
    ns_vars = global_ns.namespace('::declarations::variables')

    cls = ns_vars.class_('struct_variables_t')

    # Legacy way of fetching dependencies. Is still valid but deprecated
    warnings.simplefilter("ignore", Warning)
    dependencies_old = cls.i_depend_on_them()
    warnings.simplefilter("error", Warning)
    dependencies_old = [
        d for d in dependencies_old if not d.declaration.is_artificial]
    assert len(dependencies_old) == 1

    dependencies_new = declarations.get_dependencies_from_decl(cls)
    dependencies_new = [
        d for d in dependencies_new if not d.declaration.is_artificial]
    assert len(dependencies_new) == 1

    m_mutable = ns_vars.variable('m_mutable')

    # Legacy way of fetching dependencies. Is still valid but deprecated
    dependencies_old = [
        dependency for dependency in dependencies_old if
        dependency.declaration is m_mutable]
    assert len(dependencies_old) == 1
    assert dependencies_old[0].depend_on_it.decl_string == 'int'
    assert dependencies_old[0].access_type == 'public'

    dependencies_new = [
        dependency for dependency in dependencies_new if
        dependency.declaration is m_mutable]
    assert len(dependencies_new) == 1
    assert dependencies_new[0].depend_on_it.decl_string == 'int'
    assert dependencies_new[0].access_type == 'public'

    ns_dh = global_ns.namespace('::core::diamand_hierarchy')
    fd_cls = ns_dh.class_('final_derived_t')
    derived1_cls = ns_dh.class_('derived1_t')

    # Legacy way of fetching dependencies. Is still valid but deprecated
    warnings.simplefilter("ignore", Warning)
    dependencies_old = declarations.get_dependencies_from_decl(fd_cls)
    warnings.simplefilter("error", Warning)
    dependencies_old = [
        dependency for dependency in dependencies_old if
        dependency.depend_on_it is derived1_cls]
    assert len(dependencies_old) == 1
    assert dependencies_old[0].depend_on_it is derived1_cls
    assert dependencies_old[0].access_type == 'public'

    dependencies_new = declarations.get_dependencies_from_decl(fd_cls)
    dependencies_new = [
        dependency for dependency in dependencies_new if
        dependency.depend_on_it is derived1_cls]
    assert len(dependencies_new) == 1
    assert dependencies_new[0].depend_on_it is derived1_cls
    assert dependencies_new[0].access_type == 'public'


def test_calldefs(global_ns):
    ns = global_ns.namespace('::declarations::calldef')
    return_default_args = ns.calldef('return_default_args')

    # Legacy way of fetching dependencies. Is still valid but deprecated
    warnings.simplefilter("ignore", Warning)
    dependencies_old = return_default_args.i_depend_on_them()
    warnings.simplefilter("error", Warning)
    assert len(dependencies_old) == 3
    used_types = [
        dependency.depend_on_it.decl_string
        for dependency in dependencies_old]
    assert used_types == ['int', 'int', 'bool']

    dependencies_new = declarations.get_dependencies_from_decl(
        return_default_args)
    assert len(dependencies_new) == 3
    used_types = [
        dependency.depend_on_it.decl_string
        for dependency in dependencies_new]
    assert used_types == ['int', 'int', 'bool']


def test_coverage(global_ns):
    declarations.get_dependencies_from_decl(global_ns)