Skip to content

Commit f96e9df

Browse files
authored
Merge pull request #60 from Jon-Becker/jon-becker/float-validation
fix(validation): floating point rounding error validation
2 parents 43992b1 + 626639d commit f96e9df

File tree

4 files changed

+221
-1
lines changed

4 files changed

+221
-1
lines changed

.DS_Store

-10 KB
Binary file not shown.

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,5 @@ coverage.xml
3232

3333
*metadata/*.json
3434
*images/*.png
35+
36+
.DS_Store

src/common/validate.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ def validate_config(config: dict) -> bool:
9292
)
9393
)
9494

95-
if sum(layer["weights"]) != 100:
95+
# ensure the sum of the weights is 100
96+
# make sure to round the sum to 100 to account for floating point errors
97+
if round(sum(layer["weights"]), 2) != 100:
9698
raise ConfigValidationError(
9799
'config["layers"][{}]["{}"]: The sum of the weights must be 100. Current sum: {}'.format(
98100
i, required_key[0], sum(layer["weights"])

tests/test_floating_point_errors.py

+216
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
from unittest.mock import patch
2+
3+
from src.common.validate import validate_config
4+
5+
6+
@patch("os.path.isfile", return_value=True)
7+
def test_floating_point_errors(mock_isfile):
8+
valid_config = {
9+
"layers": [
10+
{
11+
"name": "Background",
12+
"values": [
13+
"1.4.png",
14+
"1.4.png",
15+
"1.4.png",
16+
"1.4.png",
17+
"2.5.png",
18+
"1.4.png",
19+
"1.7.png",
20+
"9.2.png",
21+
"2.5.png",
22+
"1.4.png",
23+
"0.3.png",
24+
"1.7.png",
25+
"1.7.png",
26+
"1.2.png",
27+
"0.7.png",
28+
"1.4.png",
29+
"0.9.png",
30+
"1.4.png",
31+
"1.7.png",
32+
"0.5.png",
33+
"1.7.png",
34+
"1.4.png",
35+
"0.2.png",
36+
"1.png",
37+
"2.2.png",
38+
"1.7.png",
39+
"1.8.png",
40+
"1.4.png",
41+
"1.7.png",
42+
"1.4.png",
43+
"1.7.png",
44+
"1.4.png",
45+
"1.4.png",
46+
"1.4.png",
47+
"1.4.png",
48+
"1.4.png",
49+
"1.4.png",
50+
"1.4.png",
51+
"1.7.png",
52+
"1.7.png",
53+
"1.8.png",
54+
"1.7.png",
55+
"1.4.png",
56+
"1.4.png",
57+
"1.7.png",
58+
"2.png",
59+
"0.7.png",
60+
"1.8.png",
61+
"0.9.png",
62+
"1.8.png",
63+
"1.4.png",
64+
"1.4.png",
65+
"1.4.png",
66+
"1.7.png",
67+
"1.7.png",
68+
"1.8.png",
69+
"1.7.png",
70+
"1.png",
71+
"1.7.png",
72+
"1.4.png",
73+
"0.9.png",
74+
"1.7.png",
75+
"1.8.png",
76+
],
77+
"trait_path": "./trait-layers/foreground",
78+
"filename": [
79+
"1.4.png",
80+
"1.4.png",
81+
"1.4.png",
82+
"1.4.png",
83+
"2.5.png",
84+
"1.4.png",
85+
"1.7.png",
86+
"9.2.png",
87+
"2.5.png",
88+
"1.4.png",
89+
"0.3.png",
90+
"1.7.png",
91+
"1.7.png",
92+
"1.2.png",
93+
"0.7.png",
94+
"1.4.png",
95+
"0.9.png",
96+
"1.4.png",
97+
"1.7.png",
98+
"0.5.png",
99+
"1.7.png",
100+
"1.4.png",
101+
"0.2.png",
102+
"1.png",
103+
"2.2.png",
104+
"1.7.png",
105+
"1.8.png",
106+
"1.4.png",
107+
"1.7.png",
108+
"1.4.png",
109+
"1.7.png",
110+
"1.4.png",
111+
"1.4.png",
112+
"1.4.png",
113+
"1.4.png",
114+
"1.4.png",
115+
"1.4.png",
116+
"1.4.png",
117+
"1.7.png",
118+
"1.7.png",
119+
"1.8.png",
120+
"1.7.png",
121+
"1.4.png",
122+
"1.4.png",
123+
"1.7.png",
124+
"2.png",
125+
"0.7.png",
126+
"1.8.png",
127+
"0.9.png",
128+
"1.8.png",
129+
"1.4.png",
130+
"1.4.png",
131+
"1.4.png",
132+
"1.7.png",
133+
"1.7.png",
134+
"1.8.png",
135+
"1.7.png",
136+
"1.png",
137+
"1.7.png",
138+
"1.4.png",
139+
"0.9.png",
140+
"1.7.png",
141+
"1.8.png",
142+
],
143+
"weights": [
144+
1.4,
145+
1.4,
146+
1.4,
147+
1.4,
148+
2.5,
149+
1.4,
150+
1.7,
151+
9.2,
152+
2.5,
153+
1.4,
154+
0.3,
155+
1.7,
156+
1.7,
157+
1.2,
158+
0.7,
159+
1.4,
160+
0.9,
161+
1.4,
162+
1.7,
163+
0.5,
164+
1.7,
165+
1.4,
166+
0.2,
167+
1,
168+
2.2,
169+
1.7,
170+
1.8,
171+
1.4,
172+
1.7,
173+
1.4,
174+
1.7,
175+
1.4,
176+
1.4,
177+
1.4,
178+
1.4,
179+
1.4,
180+
1.4,
181+
1.4,
182+
1.7,
183+
1.7,
184+
1.8,
185+
1.7,
186+
1.4,
187+
1.4,
188+
1.7,
189+
2,
190+
0.7,
191+
1.8,
192+
0.9,
193+
1.8,
194+
1.4,
195+
1.4,
196+
1.4,
197+
1.7,
198+
1.7,
199+
1.8,
200+
1.7,
201+
1,
202+
1.7,
203+
1.4,
204+
0.9,
205+
1.7,
206+
1.8,
207+
],
208+
}
209+
],
210+
"incompatibilities": [],
211+
"baseURI": ".",
212+
"name": "NFT #",
213+
"description": "This is a description for this NFT series.",
214+
}
215+
216+
assert validate_config(valid_config) is None # It should not raise an exception

0 commit comments

Comments
 (0)