1# Created: 25.01.2018
2# Copyright (C) 2018-2019, Manfred Moitzi
3# License: MIT License
4import pytest
5from ezdxf.lldxf.tagger import internal_tag_compiler
6from ezdxf.lldxf.loader import load_dxf_structure
7from ezdxf.lldxf.const import DXFStructureError
8
9
10def test_loader():
11    sections = load_dxf_structure(internal_tag_compiler(TEST_HEADER))
12    assert len(sections) == 3
13    header = sections['HEADER']
14    assert len(header) == 1  # header load_section has always only one entity
15    header_entity = header[0]
16    assert header_entity[0] == (0, 'SECTION')
17    assert header_entity[1] == (2, 'HEADER')
18    assert header_entity[2] == (9, '$ACADVER')
19    assert header_entity[-1] == (3, 'ANSI_1252')
20
21    tables = sections['TABLES']
22    assert len(tables) == 1
23    tables_header = tables[0]
24    assert tables_header[0] == (0, 'SECTION')
25    assert tables_header[1] == (2, 'TABLES')
26
27    entities = sections['ENTITIES']
28    assert len(entities) == 1
29    entities_header = entities[0]
30    assert entities_header[0] == (0, 'SECTION')
31    assert entities_header[1] == (2, 'ENTITIES')
32
33
34def test_error_section():
35    with pytest.raises(DXFStructureError):
36        load_dxf_structure(internal_tag_compiler(SECTION_INVALID_NAME_TAG))
37
38    with pytest.raises(DXFStructureError):
39        load_dxf_structure(internal_tag_compiler(SECTION_NO_NAME_TAG))
40
41
42def validator(text):
43    tags = internal_tag_compiler(text)
44    return load_dxf_structure(tags)
45
46
47def test_valid_structure():
48    sections = validator("  0\nSECTION\n 2\nHEADER\n  0\nENDSEC\n  0\nSECTION\n  2\nCLASSES\n  0\nENDSEC\n  0\nEOF\n")
49    assert len(sections) == 2
50    assert len(sections['HEADER']) == 1  # ENDSEC is not present
51    assert len(sections['CLASSES']) == 1  # ENDSEC is not present
52
53
54def test_eof_without_lineending():
55    sections = validator("  0\nSECTION\n 2\nHEADER\n  0\nENDSEC\n  0\nSECTION\n  2\nCLASSES\n  0\nENDSEC\n  0\nEOF")
56    assert len(sections) == 2
57    assert len(sections['HEADER']) == 1  # ENDSEC is not present
58    assert len(sections['CLASSES']) == 1  # ENDSEC is not present
59
60
61def test_missing_eof():
62    with pytest.raises(DXFStructureError):
63        validator("999\ncomment")
64
65
66def test_missing_endsec():
67    with pytest.raises(DXFStructureError):
68        validator("  0\nSECTION\n 2\nHEADER\n  0\nSECTION\n  2\nCLASSES\n  0\nENDSEC\n  0\nEOF\n")
69
70    with pytest.raises(DXFStructureError):
71        validator("  0\nSECTION\n 2\nHEADER\n  0\nSECTION\n  2\nCLASSES\n  0\nEOF\n")
72
73
74def test_missing_endsec_and_eof():
75    with pytest.raises(DXFStructureError):
76        validator("  0\nSECTION\n 2\nHEADER\n  0\nENDSEC\n  0\nSECTION\n  2\nCLASSES\n")
77
78
79def test_missing_section():
80    with pytest.raises(DXFStructureError):
81        validator("  0\nENDSEC\n  0\nSECTION\n  2\nCLASSES\n  0\nENDSEC\n  0\nEOF\n")
82
83
84TEST_HEADER = """  0
85SECTION
86  2
87HEADER
88  9
89$ACADVER
90  1
91AC1018
92  9
93$DWGCODEPAGE
94  3
95ANSI_1252
96  0
97ENDSEC
98  0
99SECTION
100  2
101TABLES
102  0
103ENDSEC
104  0
105SECTION
106  2
107ENTITIES
108  0
109ENDSEC
110  0
111EOF
112"""
113
114SECTION_INVALID_NAME_TAG = """  0
115SECTION
116  3
117HEADER
118  0
119ENDSEC
120"""
121
122SECTION_NO_NAME_TAG = """  0
123SECTION
124  0
125ENDSEC
126"""
127