1# Copyright (c) 2020, Manfred Moitzi
2# License: MIT License
3import pytest
4
5from ezdxf.lldxf.validator import (
6    is_in_integer_range, is_valid_aci_color, is_valid_layer_name,
7    is_valid_lineweight, is_not_null_vector, is_positive,
8    fix_lineweight, is_integer_bool, is_valid_one_line_text,
9    fix_one_line_text, is_not_zero, is_not_negative, is_one_of,
10    is_in_float_range, fit_into_float_range, fix_integer_bool,
11    fit_into_integer_range, is_valid_bitmask, fix_bitmask,
12    is_greater_or_equal_zero
13)
14from ezdxf.entities.layer import is_valid_layer_color_index, fix_layer_color
15
16
17def test_invalid_layer_name():
18    assert is_valid_layer_name('Layer Layer') is True
19    assert is_valid_layer_name('Layer/') is False
20    assert is_valid_layer_name('Layer*') is False
21    assert is_valid_layer_name('*Layer') is False
22    assert is_valid_layer_name('Layer=') is False
23    assert is_valid_layer_name('Layer;') is False
24    assert is_valid_layer_name('Layer:') is False
25    assert is_valid_layer_name('Layer<') is False
26    assert is_valid_layer_name('Layer>') is False
27    assert is_valid_layer_name('Layer`') is False
28    assert is_valid_layer_name('\\Layer`') is False
29    assert is_valid_layer_name('"Layer"') is False
30
31
32def test_strange_but_valid_layer_name():
33    assert is_valid_layer_name('Layer|Layer') is True
34
35
36def test_is_adsk_special_layer():
37    assert is_valid_layer_name('*adsk_xyz') is True
38    assert is_valid_layer_name('*ADSK_xyz') is True
39    assert is_valid_layer_name('ADSK_xyz*') is False
40
41
42def test_is_valid_lineweight():
43    assert is_valid_lineweight(0) is True
44    assert is_valid_lineweight(50) is True
45    assert is_valid_lineweight(211) is True
46    assert is_valid_lineweight(-4) is False, 'is too small'
47    assert is_valid_lineweight(212) is False, 'is too big'
48    assert is_valid_lineweight(10) is False
49
50
51def test_lineweight_fixer():
52    assert fix_lineweight(-4) == -1, 'too small, fix as BYLAYER'
53    assert fix_lineweight(212) == 211, 'too big, fix as biggest lineweight'
54    assert fix_lineweight(10) == 13, 'invalid, fix as next valid lineweight'
55
56
57def test_is_valid_aci_color():
58    assert is_valid_aci_color(-1) is False
59    assert is_valid_aci_color(0) is True
60    assert is_valid_aci_color(257) is True
61    assert is_valid_aci_color(258) is False
62
63
64def test_is_in_integer_range():
65    validator = is_in_integer_range(1, 10)
66    assert validator(0) is False
67    assert validator(1) is True
68    assert validator(9) is True
69    assert validator(10) is False, 'exclude end value'
70
71
72def test_fit_into_integer_range():
73    fixer = fit_into_integer_range(0, 6)
74    assert fixer(-1) == 0
75    assert fixer(0) == 0
76    assert fixer(5) == 5
77    assert fixer(6) == 5, 'exclude end value'
78
79
80def test_is_in_float_range():
81    validator = is_in_float_range(1, 10)
82    assert validator(0) is False
83    assert validator(1) is True
84    assert validator(9) is True
85    assert validator(10) is True, 'include end value'
86
87
88def test_fit_into_float_range():
89    fixer = fit_into_float_range(0.25, 4.00)
90    assert fixer(0.24) == 0.25
91    assert fixer(0.25) == 0.25
92    assert fixer(0.50) == 0.50
93    assert fixer(4.00) == 4.00, 'include end value'
94    assert fixer(4.01) == 4.00
95
96
97def test_is_not_null_vector():
98    assert is_not_null_vector((0, 0, 1)) is True
99    assert is_not_null_vector((0, 1, 0)) is True
100    assert is_not_null_vector((1, 0, 0)) is True
101    assert is_not_null_vector((0, 0, 0)) is False
102
103
104def test_is_positive_value():
105    assert is_positive(1) is True
106    assert is_positive(0.5) is True
107    assert is_positive(0) is False
108    assert is_positive(0.0) is False
109    assert is_positive(-1) is False
110
111
112def test_is_integer_bool():
113    assert is_integer_bool(0) is True
114    assert is_integer_bool(1) is True
115    assert is_integer_bool(2) is False
116    assert is_integer_bool(-1) is False
117
118
119def test_fix_integer_bool():
120    assert fix_integer_bool(0) == 0
121    assert fix_integer_bool(1) == 1
122    assert fix_integer_bool(None) == 0
123    assert fix_integer_bool('') == 0
124    assert fix_integer_bool('A') == 1
125    assert fix_integer_bool(2) == 1
126    assert fix_integer_bool(-1) == 1
127
128
129@pytest.mark.parametrize('invalid_text', [
130    'test\ntext\r',
131    'test\r\ntext',
132    'testtext^',
133    'test\ntext^',
134    'test\ntext^\r',
135])
136def test_is_valid_one_line_text(invalid_text):
137    assert is_valid_one_line_text(invalid_text) is False
138
139
140@pytest.mark.parametrize('invalid_text', [
141    'test\ntext\r',
142    'test\r\ntext',
143    'testtext^',
144    'test\ntext^',
145    'test\ntext^\r',
146])
147def test_fix_invalid_one_line_text(invalid_text):
148    assert fix_one_line_text(invalid_text) == 'testtext'
149
150
151def test_is_not_negative():
152    assert is_not_negative(-1) is False
153    assert is_not_negative(-1e-9) is False
154    assert is_not_negative(0) is True
155    assert is_not_negative(1e-9) is True
156    assert is_not_negative(1) is True
157
158
159def test_is_not_zero():
160    assert is_not_zero(-1) is True
161    assert is_not_zero(-1e-9) is True
162    assert is_not_zero(1e-9) is True
163    assert is_not_zero(1) is True
164    assert is_not_zero(0) is False
165    assert is_not_zero(0.0) is False
166    assert is_not_zero(1e-12) is False
167    assert is_not_zero(-1e-12) is False
168
169
170def test_is_one_of():
171    _validator = is_one_of({1, 3, 5})
172    assert _validator(0) is False
173    assert _validator(2) is False
174    assert _validator(4) is False
175    assert _validator(1) is True
176    assert _validator(3) is True
177    assert _validator(5) is True
178
179
180def test_is_greater_or_equal_zero():
181    assert is_greater_or_equal_zero(-1) is False
182    assert is_greater_or_equal_zero(0) is True
183    assert is_greater_or_equal_zero(1) is True
184
185
186def test_is_valid_bitmask():
187    validator = is_valid_bitmask(3)
188    assert validator(0) is True
189    assert validator(1) is True
190    assert validator(2) is True
191    assert validator(3) is True
192    assert validator(4) is False
193
194
195def test_fix_bitmask():
196    fixer = fix_bitmask(3)
197    assert fixer(0) == 0
198    assert fixer(1) == 1
199    assert fixer(2) == 2
200    assert fixer(3) == 3
201    assert fixer(4) == 0
202    assert fixer(5) == 1
203
204
205@pytest.mark.parametrize('aci', [255, -7, -1, 1, 7, 255])
206def test_is_valid_layer_color(aci):
207    assert is_valid_layer_color_index(aci) is True
208    assert fix_layer_color(aci) == aci
209
210
211@pytest.mark.parametrize('aci', [256, 0, 256])
212def test_is_not_valid_layer_color(aci):
213    assert is_valid_layer_color_index(aci) is False
214    assert fix_layer_color(aci) == 7
215
216
217if __name__ == '__main__':
218    pytest.main([__file__])
219