Path:
tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_grammar.py
Lines:
527
Non-empty lines:
444
Non-empty lines covered with requirements:
444 / 444 (100.0%)
Functions:
10
Functions covered by requirements:
10 / 10 (100.0%)
- "2.2. Identical SDoc content by import/export roundtrip" (REQUIREMENT)
- "2.2. Identical SDoc content by import/export roundtrip" (REQUIREMENT)
1
"""2
@relation(SDOC-SRS-136, scope=file)3
"""4
5
import pytest
6
7
from strictdoc.backend.sdoc.models.document import SDocDocument
8
from strictdoc.backend.sdoc.models.node import SDocNode
9
from strictdoc.backend.sdoc.reader import SDReader
10
from strictdoc.backend.sdoc.validations.sdoc_validator import SDocValidator
11
from strictdoc.backend.sdoc.writer import SDWriter
12
from strictdoc.helpers.cast import assert_cast
13
from strictdoc.helpers.exception import StrictDocException
14
from tests.unit.helpers.fake_document_meta import create_fake_document_meta
15
16
17
def test_01_grammar_minimal_doc(default_project_config):
18
input_sdoc = """
19
[DOCUMENT]20
TITLE: Test Doc21
22
[GRAMMAR]23
ELEMENTS:24
- TAG: TEXT25
FIELDS:26
- TITLE: STATEMENT27
TYPE: String28
REQUIRED: True29
- TAG: LOW_LEVEL_REQUIREMENT30
FIELDS:31
- TITLE: STATEMENT32
TYPE: String33
REQUIRED: True34
""".lstrip()
35
36
expected_sdoc = """
37
[DOCUMENT]38
TITLE: Test Doc39
40
[GRAMMAR]41
ELEMENTS:42
- TAG: TEXT43
FIELDS:44
- TITLE: STATEMENT45
TYPE: String46
REQUIRED: True47
- TAG: LOW_LEVEL_REQUIREMENT48
FIELDS:49
- TITLE: STATEMENT50
TYPE: String51
REQUIRED: True52
""".lstrip()
53
reader = SDReader()
54
55
document = reader.read(input_sdoc)
56
assert isinstance(document, SDocDocument)
57
58
writer = SDWriter(default_project_config)
59
output = writer.write(document)
60
61
assert expected_sdoc == output
62
63
64
def test_10_grammar_single_choice(default_project_config):
65
input_sdoc = """
66
[DOCUMENT]67
TITLE: Test Doc68
69
[GRAMMAR]70
ELEMENTS:71
- TAG: TEXT72
FIELDS:73
- TITLE: STATEMENT74
TYPE: String75
REQUIRED: True76
- TAG: LOW_LEVEL_REQUIREMENT77
FIELDS:78
- TITLE: SINGLE_CHOICE_FIELD79
TYPE: SingleChoice(A, B, C)80
REQUIRED: True81
- TITLE: SINGLE_CHOICE_FIELD_282
TYPE: SingleChoice(Test/Hardware, Test/Software)83
REQUIRED: True84
- TITLE: SINGLE_CHOICE_FIELD_385
TYPE: SingleChoice(Hardware test, Software test)86
REQUIRED: True87
- TITLE: SINGLE_CHOICE_FIELD_488
TYPE: SingleChoice("A(B)", "B(C)")89
REQUIRED: True90
- TITLE: STATEMENT91
TYPE: String92
REQUIRED: False93
94
[LOW_LEVEL_REQUIREMENT]95
SINGLE_CHOICE_FIELD: A96
SINGLE_CHOICE_FIELD_2: Test/Hardware97
SINGLE_CHOICE_FIELD_3: Hardware test98
SINGLE_CHOICE_FIELD_4: A(B)99
""".lstrip()
100
101
reader = SDReader()
102
103
document = reader.read(input_sdoc)
104
assert isinstance(document, SDocDocument)
105
106
assert len(document.section_contents) == 1
107
field_4 = document.grammar.elements_by_type["LOW_LEVEL_REQUIREMENT"].fields[
108
3109
]110
assert field_4.options == ["A(B)", "B(C)"]
111
112
writer = SDWriter(default_project_config)
113
output = writer.write(document)
114
115
assert input_sdoc == output
116
117
118
def test_15_grammar_single_choice_with_branches_but_no_quotes_raises_exception():
119
input_sdoc = """
120
[DOCUMENT]121
TITLE: Test Doc122
123
[GRAMMAR]124
ELEMENTS:125
- TAG: TEXT126
FIELDS:127
- TITLE: STATEMENT128
TYPE: String129
REQUIRED: True130
- TAG: LOW_LEVEL_REQUIREMENT131
FIELDS:132
- TITLE: SINGLE_CHOICE_FIELD133
TYPE: SingleChoice(A(B))134
REQUIRED: True135
- TITLE: STATEMENT136
TYPE: String137
REQUIRED: False138
""".lstrip()
139
140
reader = SDReader()
141
142
with pytest.raises(StrictDocException):
143
_ = reader.read(input_sdoc)
144
145
146
def test_16_grammar_single_choice_with_unmatched_quotes_raises_exception():
147
input_sdoc = """
148
[DOCUMENT]149
TITLE: Test Doc150
151
[GRAMMAR]152
ELEMENTS:153
- TAG: TEXT154
FIELDS:155
- TITLE: STATEMENT156
TYPE: String157
REQUIRED: True158
- TAG: LOW_LEVEL_REQUIREMENT159
FIELDS:160
- TITLE: SINGLE_CHOICE_FIELD161
TYPE: SingleChoice("A)162
REQUIRED: True163
- TITLE: STATEMENT164
TYPE: String165
REQUIRED: False166
""".lstrip()
167
168
reader = SDReader()
169
170
with pytest.raises(StrictDocException):
171
_ = reader.read(input_sdoc)
172
173
174
def test_152_grammar_multiple_choice(default_project_config):
175
input_sdoc = """\
176
[DOCUMENT]177
TITLE: Test Doc178
179
[GRAMMAR]180
ELEMENTS:181
- TAG: TEXT182
FIELDS:183
- TITLE: STATEMENT184
TYPE: String185
REQUIRED: True186
- TAG: LOW_LEVEL_REQUIREMENT187
FIELDS:188
- TITLE: MULTIPLE_CHOICE_FIELD189
TYPE: MultipleChoice(A, B, C)190
REQUIRED: True191
- TITLE: MULTIPLE_CHOICE_FIELD_2192
TYPE: MultipleChoice(Review, Test/Hardware)193
REQUIRED: True194
- TITLE: MULTIPLE_CHOICE_FIELD_3195
TYPE: MultipleChoice(Review of design, Hardware test)196
REQUIRED: True197
- TITLE: MULTIPLE_CHOICE_FIELD_4198
TYPE: MultipleChoice(review_of_design, hardware_test)199
REQUIRED: True200
- TITLE: MULTIPLE_CHOICE_FIELD_5201
TYPE: MultipleChoice(review-of-design, hardware-test)202
REQUIRED: True203
- TITLE: STATEMENT204
TYPE: String205
REQUIRED: False206
207
[LOW_LEVEL_REQUIREMENT]208
MULTIPLE_CHOICE_FIELD: A, C209
MULTIPLE_CHOICE_FIELD_2: Review, Test/Hardware210
MULTIPLE_CHOICE_FIELD_3: Review of design, Hardware test211
MULTIPLE_CHOICE_FIELD_4: review_of_design, hardware_test212
MULTIPLE_CHOICE_FIELD_5: review-of-design, hardware-test213
"""214
215
reader = SDReader()
216
217
document = reader.read(input_sdoc)
218
assert isinstance(document, SDocDocument)
219
220
document.meta = create_fake_document_meta()
221
SDocValidator.validate_document(document)
222
SDocValidator.validate_node(
223
assert_cast(document.section_contents[0], SDocNode),
224
document.grammar,
225
"fake.path.sdoc",
226
auto_uid_mode=False,
227
)228
229
writer = SDWriter(default_project_config)
230
output = writer.write(document)
231
232
assert input_sdoc == output
233
234
235
def test_153_grammar_tag(default_project_config):
236
input_sdoc = """
237
[DOCUMENT]238
TITLE: Test Doc239
240
[GRAMMAR]241
ELEMENTS:242
- TAG: TEXT243
FIELDS:244
- TITLE: STATEMENT245
TYPE: String246
REQUIRED: True247
- TAG: LOW_LEVEL_REQUIREMENT248
FIELDS:249
- TITLE: TAG_FIELD250
TYPE: Tag251
REQUIRED: True252
- TITLE: STATEMENT253
TYPE: String254
REQUIRED: False255
256
[LOW_LEVEL_REQUIREMENT]257
TAG_FIELD: A, C258
""".lstrip()
259
260
expected_sdoc = """
261
[DOCUMENT]262
TITLE: Test Doc263
264
[GRAMMAR]265
ELEMENTS:266
- TAG: TEXT267
FIELDS:268
- TITLE: STATEMENT269
TYPE: String270
REQUIRED: True271
- TAG: LOW_LEVEL_REQUIREMENT272
FIELDS:273
- TITLE: TAG_FIELD274
TYPE: Tag275
REQUIRED: True276
- TITLE: STATEMENT277
TYPE: String278
REQUIRED: False279
280
[LOW_LEVEL_REQUIREMENT]281
TAG_FIELD: A, C282
""".lstrip()
283
284
reader = SDReader()
285
286
document = reader.read(input_sdoc)
287
assert isinstance(document, SDocDocument)
288
289
writer = SDWriter(default_project_config)
290
output = writer.write(document)
291
292
assert expected_sdoc == output
293
294
295
def test_154_grammar_multiline_custom_field(default_project_config):
296
input_sdoc = """
297
[DOCUMENT]298
TITLE: Test Doc299
300
[GRAMMAR]301
ELEMENTS:302
- TAG: TEXT303
FIELDS:304
- TITLE: STATEMENT305
TYPE: String306
REQUIRED: True307
- TAG: REQUIREMENT308
FIELDS:309
- TITLE: MY_FIELD310
TYPE: String311
REQUIRED: True312
- TITLE: STATEMENT313
TYPE: String314
REQUIRED: False315
316
[REQUIREMENT]317
MY_FIELD: >>>318
Some text here...319
Some text here...320
Some text here...321
<<<322
""".lstrip()
323
324
expected_sdoc = """
325
[DOCUMENT]326
TITLE: Test Doc327
328
[GRAMMAR]329
ELEMENTS:330
- TAG: TEXT331
FIELDS:332
- TITLE: STATEMENT333
TYPE: String334
REQUIRED: True335
- TAG: REQUIREMENT336
FIELDS:337
- TITLE: MY_FIELD338
TYPE: String339
REQUIRED: True340
- TITLE: STATEMENT341
TYPE: String342
REQUIRED: False343
344
[REQUIREMENT]345
MY_FIELD: >>>346
Some text here...347
Some text here...348
Some text here...349
<<<350
""".lstrip()
351
352
reader = SDReader()
353
354
document = reader.read(input_sdoc)
355
assert isinstance(document, SDocDocument)
356
357
writer = SDWriter(default_project_config)
358
output = writer.write(document)
359
360
assert expected_sdoc == output
361
362
363
def test_170_grammar_relations(default_project_config):
364
input_sdoc = """
365
[DOCUMENT]366
TITLE: Test Doc367
368
[GRAMMAR]369
ELEMENTS:370
- TAG: TEXT371
FIELDS:372
- TITLE: STATEMENT373
TYPE: String374
REQUIRED: True375
- TAG: LOW_LEVEL_REQUIREMENT376
FIELDS:377
- TITLE: STATEMENT378
TYPE: String379
REQUIRED: True380
RELATIONS:381
- TYPE: Parent382
- TYPE: Parent383
ROLE: Refines384
- TYPE: Child385
ROLE: Refined_by386
387
[LOW_LEVEL_REQUIREMENT]388
STATEMENT: This is a statement.389
""".lstrip()
390
391
reader = SDReader()
392
393
document = reader.read(input_sdoc)
394
assert isinstance(document, SDocDocument)
395
396
writer = SDWriter(default_project_config)
397
output = writer.write(document)
398
399
assert input_sdoc == output
400
401
402
def test_180_additional_field_in_grammar():
403
input_sdoc = """
404
[DOCUMENT]405
TITLE: Test Document406
407
[GRAMMAR]408
ELEMENTS:409
- TAG: REQUIREMENT410
FIELDS:411
- TITLE: UID412
TYPE: String413
REQUIRED: False414
- TITLE: LEVEL415
TYPE: String416
REQUIRED: False417
- TITLE: STATUS418
TYPE: String419
REQUIRED: False420
- TITLE: TAGS421
TYPE: String422
REQUIRED: False423
- TITLE: TITLE424
TYPE: String425
REQUIRED: False426
- TITLE: STATEMENT427
TYPE: String428
REQUIRED: False429
- TITLE: RATIONALE430
TYPE: String431
REQUIRED: False432
- TITLE: COMMENT433
TYPE: String434
REQUIRED: False435
- TITLE: META_TEST436
TYPE: String437
REQUIRED: False438
439
[REQUIREMENT]440
UID: A-1441
STATEMENT: >>>442
the foo must bar443
<<<444
COMMENT: >>>445
Comment446
<<<447
META_TEST: >>>448
Yes449
<<<450
""".lstrip()
451
452
reader = SDReader()
453
454
document = reader.read(input_sdoc)
455
456
requirement = document.section_contents[0]
457
assert isinstance(requirement, SDocNode)
458
# FIXME: More robust test.459
for _, value in requirement.enumerate_meta_fields():
460
assert value.get_text_value() is not None
461
462
463
def test_190_element_properties(default_project_config):
464
input_sdoc = """\
465
[DOCUMENT]466
TITLE: Test Document467
468
[GRAMMAR]469
ELEMENTS:470
- TAG: SECTION471
PROPERTIES:472
IS_COMPOSITE: True473
FIELDS:474
- TITLE: UID475
TYPE: String476
REQUIRED: False477
- TITLE: TITLE478
TYPE: String479
REQUIRED: False480
- TAG: TEXT481
PROPERTIES:482
IS_COMPOSITE: False483
VIEW_STYLE: Plain484
FIELDS:485
- TITLE: UID486
TYPE: String487
REQUIRED: False488
- TITLE: STATEMENT489
TYPE: String490
REQUIRED: False491
- TAG: REQUIREMENT492
PROPERTIES:493
IS_COMPOSITE: True494
FIELDS:495
- TITLE: UID496
TYPE: String497
REQUIRED: False498
- TITLE: TITLE499
TYPE: String500
REQUIRED: False501
- TITLE: STATEMENT502
TYPE: String503
REQUIRED: False504
- TITLE: RATIONALE505
TYPE: String506
REQUIRED: False507
- TITLE: COMMENT508
TYPE: String509
REQUIRED: False510
511
[[REQUIREMENT]]512
UID: A-1513
STATEMENT: >>>514
the foo must bar515
<<<516
517
[[/REQUIREMENT]]518
"""519
520
reader = SDReader()
521
522
document = reader.read(input_sdoc)
523
assert isinstance(document, SDocDocument)
524
525
writer = SDWriter(default_project_config)
526
output = writer.write(document)
527
assert input_sdoc == output