StrictDoc Documentation
tests/unit/strictdoc/core/test_traceability_index_cycles.py
Source file coverage
Path:
tests/unit/strictdoc/core/test_traceability_index_cycles.py
Lines:
303
Non-empty lines:
274
Non-empty lines covered with requirements:
274 / 274 (100.0%)
Functions:
6
Functions covered by requirements:
6 / 6 (100.0%)
1
"""
2
@relation(SDOC-SRS-30, scope=file)
3
"""
4
 
5
import pytest
6
 
7
from strictdoc.backend.sdoc.errors.document_tree_error import DocumentTreeError
8
from strictdoc.core.document_tree import DocumentTree
9
from strictdoc.core.traceability_index import TraceabilityIndex
10
from strictdoc.core.traceability_index_builder import TraceabilityIndexBuilder
11
from tests.unit.helpers.document_builder import DocumentBuilder
12
 
13
 
14
def test_invalid_01_2_reqs_cycled():
15
    document_builder = DocumentBuilder()
16
    document_builder.add_requirement("REQ-001")
17
    document_builder.add_requirement("REQ-002")
18
    document_builder.add_requirement_relation(
19
        relation_type="Parent",
20
        source_requirement_id="REQ-002",
21
        target_requirement_id="REQ-001",
22
        role=None,
23
    )
24
    document_builder.add_requirement_relation(
25
        relation_type="Parent",
26
        source_requirement_id="REQ-001",
27
        target_requirement_id="REQ-002",
28
        role=None,
29
    )
30
 
31
    document_1 = document_builder.build()
32
    file_tree = []
33
    document_list = [document_1]
34
    map_docs_by_paths = {}
35
    document_tree = DocumentTree(
36
        file_tree=file_tree,
37
        document_list=document_list,
38
        map_docs_by_paths=map_docs_by_paths,
39
        map_docs_by_rel_paths={},
40
        map_grammars_by_filenames={},
41
    )
42
    with pytest.raises(DocumentTreeError):
43
        _ = TraceabilityIndexBuilder.create_from_document_tree(
44
            document_tree, project_config=document_builder.project_config
45
        )
46
 
47
 
48
def test_invalid_02_4_reqs_cycled():
49
    document_builder = DocumentBuilder()
50
    _ = document_builder.add_requirement("REQ-001")
51
    _ = document_builder.add_requirement("REQ-002")
52
    _ = document_builder.add_requirement("REQ-003")
53
    _ = document_builder.add_requirement("REQ-004")
54
    document_builder.add_requirement_relation(
55
        relation_type="Parent",
56
        source_requirement_id="REQ-004",
57
        target_requirement_id="REQ-003",
58
        role=None,
59
    )
60
    document_builder.add_requirement_relation(
61
        relation_type="Parent",
62
        source_requirement_id="REQ-003",
63
        target_requirement_id="REQ-002",
64
        role=None,
65
    )
66
    document_builder.add_requirement_relation(
67
        relation_type="Parent",
68
        source_requirement_id="REQ-002",
69
        target_requirement_id="REQ-001",
70
        role=None,
71
    )
72
    document_builder.add_requirement_relation(
73
        relation_type="Parent",
74
        source_requirement_id="REQ-001",
75
        target_requirement_id="REQ-004",
76
        role=None,
77
    )
78
 
79
    document_1 = document_builder.build()
80
 
81
    file_tree = []
82
    document_list = [document_1]
83
    map_docs_by_paths = {}
84
    document_tree = DocumentTree(
85
        file_tree=file_tree,
86
        document_list=document_list,
87
        map_docs_by_paths=map_docs_by_paths,
88
        map_docs_by_rel_paths={},
89
        map_grammars_by_filenames={},
90
    )
91
    with pytest.raises(DocumentTreeError):
92
        _ = TraceabilityIndexBuilder.create_from_document_tree(
93
            document_tree, project_config=document_builder.project_config
94
        )
95
 
96
 
97
def test_invalid_03_3_reqs_cycled():
98
    document_builder = DocumentBuilder()
99
    _ = document_builder.add_requirement("REQ-001")
100
    _ = document_builder.add_requirement("REQ-002")
101
    _ = document_builder.add_requirement("REQ-003")
102
    document_builder.add_requirement_relation(
103
        relation_type="Parent",
104
        source_requirement_id="REQ-003",
105
        target_requirement_id="REQ-001",
106
        role=None,
107
    )
108
    document_builder.add_requirement_relation(
109
        relation_type="Parent",
110
        source_requirement_id="REQ-003",
111
        target_requirement_id="REQ-002",
112
        role=None,
113
    )
114
    document_builder.add_requirement_relation(
115
        relation_type="Parent",
116
        source_requirement_id="REQ-002",
117
        target_requirement_id="REQ-003",
118
        role=None,
119
    )
120
 
121
    document_1 = document_builder.build()
122
 
123
    file_tree = []
124
    document_list = [document_1]
125
    map_docs_by_paths = {}
126
    document_tree = DocumentTree(
127
        file_tree=file_tree,
128
        document_list=document_list,
129
        map_docs_by_paths=map_docs_by_paths,
130
        map_docs_by_rel_paths={},
131
        map_grammars_by_filenames={},
132
    )
133
    with pytest.raises(DocumentTreeError):
134
        _ = TraceabilityIndexBuilder.create_from_document_tree(
135
            document_tree, project_config=document_builder.project_config
136
        )
137
 
138
 
139
def test_invalid_04_5_reqs_cycled():
140
    document_builder = DocumentBuilder()
141
    _ = document_builder.add_requirement("REQ-001")
142
    _ = document_builder.add_requirement("REQ-002")
143
    _ = document_builder.add_requirement("REQ-003")
144
    _ = document_builder.add_requirement("REQ-004")
145
    _ = document_builder.add_requirement("REQ-005")
146
    document_builder.add_requirement_relation(
147
        relation_type="Parent",
148
        source_requirement_id="REQ-002",
149
        target_requirement_id="REQ-001",
150
        role=None,
151
    )
152
    document_builder.add_requirement_relation(
153
        relation_type="Parent",
154
        source_requirement_id="REQ-003",
155
        target_requirement_id="REQ-002",
156
        role=None,
157
    )
158
    document_builder.add_requirement_relation(
159
        relation_type="Parent",
160
        source_requirement_id="REQ-004",
161
        target_requirement_id="REQ-003",
162
        role=None,
163
    )
164
    document_builder.add_requirement_relation(
165
        relation_type="Parent",
166
        source_requirement_id="REQ-005",
167
        target_requirement_id="REQ-004",
168
        role=None,
169
    )
170
    document_builder.add_requirement_relation(
171
        relation_type="Parent",
172
        source_requirement_id="REQ-003",
173
        target_requirement_id="REQ-005",
174
        role=None,
175
    )
176
 
177
    document_1 = document_builder.build()
178
 
179
    file_tree = []
180
    document_list = [document_1]
181
    map_docs_by_paths = {}
182
    document_tree = DocumentTree(
183
        file_tree=file_tree,
184
        document_list=document_list,
185
        map_docs_by_paths=map_docs_by_paths,
186
        map_docs_by_rel_paths={},
187
        map_grammars_by_filenames={},
188
    )
189
    with pytest.raises(DocumentTreeError) as exc_info:
190
        _ = TraceabilityIndexBuilder.create_from_document_tree(
191
            document_tree, project_config=document_builder.project_config
192
        )
193
 
194
    exception: DocumentTreeError = exc_info.value
195
    assert exception.problem_uid == "REQ-003"
196
    assert exception.cycled_uids == [
197
        "REQ-001",
198
        "REQ-002",
199
        "REQ-003",
200
        "REQ-004",
201
        "REQ-005",
202
    ]
203
 
204
 
205
def test_invalid_05_4_reqs_good_then_3_cycled():
206
    document_builder = DocumentBuilder()
207
    _ = document_builder.add_requirement("REQ-001")
208
    _ = document_builder.add_requirement("REQ-002")
209
    _ = document_builder.add_requirement("REQ-003")
210
    _ = document_builder.add_requirement("REQ-004")
211
 
212
    document_builder.add_requirement_relation(
213
        relation_type="Parent",
214
        source_requirement_id="REQ-004",
215
        target_requirement_id="REQ-003",
216
        role=None,
217
    )
218
    document_builder.add_requirement_relation(
219
        relation_type="Parent",
220
        source_requirement_id="REQ-003",
221
        target_requirement_id="REQ-002",
222
        role=None,
223
    )
224
    document_builder.add_requirement_relation(
225
        relation_type="Parent",
226
        source_requirement_id="REQ-002",
227
        target_requirement_id="REQ-001",
228
        role=None,
229
    )
230
 
231
    _ = document_builder.add_requirement("REQ-005")
232
    _ = document_builder.add_requirement("REQ-006")
233
    _ = document_builder.add_requirement("REQ-007")
234
 
235
    document_builder.add_requirement_relation(
236
        relation_type="Parent",
237
        source_requirement_id="REQ-006",
238
        target_requirement_id="REQ-005",
239
        role=None,
240
    )
241
    document_builder.add_requirement_relation(
242
        relation_type="Parent",
243
        source_requirement_id="REQ-007",
244
        target_requirement_id="REQ-006",
245
        role=None,
246
    )
247
    document_builder.add_requirement_relation(
248
        relation_type="Parent",
249
        source_requirement_id="REQ-005",
250
        target_requirement_id="REQ-007",
251
        role=None,
252
    )
253
 
254
    document_1 = document_builder.build()
255
 
256
    file_tree = []
257
    document_list = [document_1]
258
    map_docs_by_paths = {}
259
    document_tree = DocumentTree(
260
        file_tree=file_tree,
261
        document_list=document_list,
262
        map_docs_by_paths=map_docs_by_paths,
263
        map_docs_by_rel_paths={},
264
        map_grammars_by_filenames={},
265
    )
266
    with pytest.raises(DocumentTreeError):
267
        _ = TraceabilityIndexBuilder.create_from_document_tree(
268
            document_tree, project_config=document_builder.project_config
269
        )
270
 
271
 
272
def test__adding_parent_link__03__two_requirements_disallow_cycle():
273
    document_builder = DocumentBuilder()
274
    requirement1 = document_builder.add_requirement("REQ-001")
275
    requirement2 = document_builder.add_requirement("REQ-002")
276
    document_1 = document_builder.build()
277
 
278
    file_tree = []
279
    document_list = [document_1]
280
    map_docs_by_paths = {}
281
    document_tree = DocumentTree(
282
        file_tree=file_tree,
283
        document_list=document_list,
284
        map_docs_by_paths=map_docs_by_paths,
285
        map_docs_by_rel_paths={},
286
        map_grammars_by_filenames={},
287
    )
288
    traceability_index: TraceabilityIndex = (
289
        TraceabilityIndexBuilder.create_from_document_tree(
290
            document_tree, project_config=document_builder.project_config
291
        )
292
    )
293
    traceability_index.update_requirement_parent_uid(
294
        requirement2, "REQ-001", None
295
    )
296
    with pytest.raises(DocumentTreeError) as exc_info:
297
        traceability_index.update_requirement_parent_uid(
298
            requirement1, "REQ-002", role=None
299
        )
300
 
301
    exception: DocumentTreeError = exc_info.value
302
    assert exception.problem_uid == "REQ-001"
303
    assert exception.cycled_uids == ["REQ-001", "REQ-002"]