1# Copyright (c) 2011-2019, Manfred Moitzi
2# License: MIT License
3import pytest
4from ezdxf.lldxf.tagger import internal_tag_compiler
5from ezdxf.document import Drawing
6from ezdxf import DXFValueError, decode_base64
7
8
9def test_dxfversion_1():
10    doc = Drawing.from_tags(internal_tag_compiler(TEST_HEADER))
11    assert 'AC1009' == doc.dxfversion
12
13
14@pytest.fixture(scope='module')
15def dwg_r12():
16    return Drawing.new('AC1009')
17
18
19def test_dxfversion_2(dwg_r12):
20    assert 'AC1009' == dwg_r12.dxfversion
21
22
23def test_acad_release(dwg_r12):
24    assert 'R12' == dwg_r12.acad_release
25
26
27def test_get_layer(dwg_r12):
28    layer = dwg_r12.layers.get('0')
29    assert '0' == layer.dxf.name
30
31
32def test_error_getting_not_existing_layer(dwg_r12):
33    with pytest.raises(DXFValueError):
34        layer = dwg_r12.layers.get('TEST_NOT_EXISTING_LAYER')
35
36
37def test_create_layer(dwg_r12):
38    layer = dwg_r12.layers.new('TEST_NEW_LAYER')
39    assert 'TEST_NEW_LAYER' == layer.dxf.name
40
41
42def test_error_adding_existing_layer(dwg_r12):
43    with pytest.raises(DXFValueError):
44        layer = dwg_r12.layers.new('0')
45
46
47def test_has_layer(dwg_r12):
48    assert '0' in dwg_r12.layers
49
50
51def test_has_not_layer(dwg_r12):
52    assert 'TEST_LAYER_NOT_EXISTS' not in dwg_r12.layers
53
54
55def test_removing_layer(dwg_r12):
56    dwg_r12.layers.new('TEST_NEW_LAYER_2')
57    assert 'TEST_NEW_LAYER_2' in dwg_r12.layers
58    dwg_r12.layers.remove('TEST_NEW_LAYER_2')
59    assert 'TEST_NEW_LAYER_2' not in dwg_r12.layers
60
61
62def test_error_removing_not_existing_layer(dwg_r12):
63    with pytest.raises(DXFValueError):
64        dwg_r12.layers.remove('TEST_LAYER_NOT_EXISTS')
65
66
67@pytest.fixture(scope='module')
68def dwg_r2000():
69    return Drawing.new('AC1015')
70
71
72def test_r2000_dxfversion(dwg_r2000):
73    assert 'AC1015' == dwg_r2000.dxfversion
74
75
76def test_r2000_acad_release(dwg_r2000):
77    assert 'R2000' == dwg_r2000.acad_release
78
79
80@pytest.fixture
81def min_r12():
82    return Drawing.from_tags(internal_tag_compiler(MINIMALISTIC_DXF12))
83
84
85def test_min_r12_header_section(min_r12):
86    assert hasattr(min_r12, 'header')
87    assert min_r12.header['$ACADVER'] == 'AC1009'
88    assert min_r12.header['$DWGCODEPAGE'] == 'ANSI_1252'
89
90
91def test_min_r12_layers_table(min_r12):
92    assert hasattr(min_r12, 'layers')
93    assert len(min_r12.layers) == 2
94    assert '0' in min_r12.layers
95    assert 'Defpoints' in min_r12.layers
96
97
98def test_min_r12_styles_table(min_r12):
99    assert hasattr(min_r12, 'styles')
100    assert len(min_r12.styles) == 1
101    assert 'Standard' in min_r12.styles
102
103
104def test_min_r12_linetypes_table(min_r12):
105    assert hasattr(min_r12, 'linetypes')
106    assert len(min_r12.linetypes) == 3
107    assert 'continuous' in min_r12.linetypes
108    assert 'ByLayer' in min_r12.linetypes
109    assert 'ByBlock' in min_r12.linetypes
110
111
112def test_min_r12_blocks_section(min_r12):
113    assert hasattr(min_r12, 'blocks')
114    assert len(min_r12.blocks) == 2
115    assert '*Model_Space' in min_r12.blocks
116    assert '*Paper_Space' in min_r12.blocks
117
118
119def test_min_r12_entity_section(min_r12):
120    assert hasattr(min_r12, 'entities')
121    assert len(min_r12.entities) == 0
122
123
124def test_chain_layout_and_block(dwg_r12, dwg_r2000):
125    for dwg in (dwg_r12, dwg_r2000):
126        msp = dwg.modelspace()
127        line_msp = msp.add_line((0, 0), (1, 1))
128        blk = dwg.blocks.new('TEST_CHAIN')
129        line_blk = blk.add_line((0, 0), (1, 1))
130
131        handles = list(e.dxf.handle for e in dwg.chain_layouts_and_blocks())
132        # check for unique handles
133        assert len(handles) == len(set(handles))
134
135        check = {line_msp.dxf.handle, line_blk.dxf.handle}
136        assert check.intersection(handles) == check
137
138
139def test_base64_encoding_r12(dwg_r12):
140    data = dwg_r12.encode_base64()
141    doc = decode_base64(data)
142    assert doc.acad_release == 'R12'
143
144
145def test_base64_encoding_r2000(dwg_r2000):
146    data = dwg_r2000.encode_base64()
147    doc = decode_base64(data)
148    assert doc.acad_release == 'R2000'
149
150
151def test_set_drawing_units(dwg_r12):
152    dwg_r12.units = 6
153    assert dwg_r12.header['$INSUNITS'] == 6
154    dwg_r12.units = 5
155    assert dwg_r12.header['$INSUNITS'] == 5
156
157
158MINIMALISTIC_DXF12 = """  0
159SECTION
160  2
161ENTITIES
162  0
163ENDSEC
164  0
165EOF
166"""
167
168TEST_HEADER = """  0
169SECTION
170  2
171HEADER
172  9
173$ACADVER
174  1
175AC1009
176  9
177$DWGCODEPAGE
178  3
179ANSI_1252
180  9
181$HANDSEED
182  5
183FF
184  0
185ENDSEC
186  0
187SECTION
188  2
189ENTITIES
190  0
191ENDSEC
192  0
193EOF
194"""
195
196TESTCOPY = """  0
197SECTION
198  2
199HEADER
200  9
201$ACADVER
202  1
203AC1018
204  9
205$DWGCODEPAGE
206  3
207ANSI_1252
208  9
209$TDUPDATE
210 40
2110.
212  9
213$HANDSEED
214  5
215FF
216  0
217ENDSEC
218  0
219SECTION
220  2
221OBJECTS
222  0
223ENDSEC
224  0
225SECTION
226  2
227FANTASYSECTION
228  1
229everything should be copied
230  0
231ENDSEC
232  0
233SECTION
234  2
235ALPHASECTION
236  1
237everything should be copied
238  0
239ENDSEC
240  0
241SECTION
242  2
243OMEGASECTION
244  1
245everything should be copied
246  0
247ENDSEC
248  0
249EOF
250"""
251