tests/quadrilaterals.py

changeset 62
f0a6bf48b05e
parent 32
75f44d3063da
child 64
1c0884f5506e
--- a/tests/quadrilaterals.py	Wed Jun 05 00:33:50 2019 +0300
+++ b/tests/quadrilaterals.py	Sat Jun 08 01:32:25 2019 +0300
@@ -1,11 +1,12 @@
 from math import radians
-from testsuite import warning, error, notice
+from testsuite import problem_type, report_problem
 from geometry import *
 
 def sign_consistency(container):
     # Returns whether all elements in container have the same sign
     return min(container) * max(container) >= 0
 
+@problem_type('concave', severity = 'error', message = 'concave quadrilateral')
 def concave_test(model):
     ''' Checks that all quadrilaterals are convex. '''
     for quadrilateral in model.quadrilaterals:
@@ -19,8 +20,22 @@
             for v1, v2, v3 in pairs(geometry.vertices, count = 3)
         ]
         if not sign_consistency(z_scores):
-            yield error(quadrilateral, 'concave-error')
+            yield report_problem('concave', bad_object = quadrilateral)
 
+@problem_type('skew-major',
+    severity = 'error',
+    message = lambda skew_angle:
+        str.format('skew quadrilateral (plane angle {})',
+            degree_rep(skew_angle),
+        ),
+)
+@problem_type('skew-minor',
+    severity = 'notice',
+    message = lambda skew_angle:
+        str.format('slightly skew quadrilateral (plane angle {})',
+            degree_rep(skew_angle),
+        ),
+)
 def skew_test(model):
     ''' Checks that all quadrilaterals are coplanar. '''
     for quadrilateral in model.quadrilaterals:
@@ -29,16 +44,24 @@
             plane_2 = triangle_plane_normal(triangles[1])
             skew_angle = vector_angle(plane_1, plane_2, normalized = True)
             if skew_angle > radians(3.0):
-                yield error(quadrilateral, 'skew-error',
+                yield report_problem(
+                    'skew-major',
+                    bad_object = quadrilateral,
                     skew_angle = skew_angle,
                 )
                 break
             elif skew_angle > radians(1.0):
-                yield warning(quadrilateral, 'skew-warning',
+                yield report_problem(
+                    'skew-minor',
+                    bad_object = quadrilateral,
                     skew_angle = skew_angle,
                 )
                 break
 
+@problem_type('self-intersecting',
+    severity = 'error',
+    message = 'self-intersecting quadrilateral',
+)
 def bowtie_test(model):
     for quadrilateral in model.quadrilaterals:
         geometry = transform_to_xy(quadrilateral.geometry)
@@ -48,52 +71,44 @@
             line_2 = LineSegment(vertices[2 + i], vertices[3 + i])
             intersection = line_segment_intersection_xy(line_1, line_2)
             if intersection:
-                yield error(quadrilateral, 'self-intersecting')
+                yield report_problem(
+                    'self-intersecting',
+                    bad_object = quadrilateral,
+                )
                 break
 
+@problem_type('collinear', severity = 'error', message = 'collinear polygon')
 def collinear_test(model):
     for element in model.body:
         if hasattr(element, 'geometry') and len(element.geometry.vertices) >= 3:
             for a, b, c in pairs(element.geometry.vertices, count = 3):
                 if cross_product(b - a, c - a).length() < 1e-5:
-                    yield error(element, 'collinearity-error')
+                    yield report_problem('collinear', bad_object = element)
 
-def hairline_score(smallest_angle):
-    from math import log10
-    return max(0, -log10(smallest_angle))
-
+@problem_type('hairline-polygon',
+    severity = 'notice',
+    message = lambda smallest_angle: str.format(
+        'hairline polygon (smallest angle {})',
+        degree_rep(smallest_angle),
+    ),
+)
 def hairline_test(model):
     for element in model.body:
         if hasattr(element, 'geometry') and len(element.geometry.vertices) >= 3:
             smallest_angle = element.geometry.smallest_angle
             if smallest_angle < radians(0.5):
-                yield notice(element, 'hairline-warning',
+                yield report_problem(
+                    'hairline-polygon',
+                    bad_object = element,
                     smallest_angle = smallest_angle,
                 )
 
 manifest = {
-    'tests': {
-        'skew': skew_test,
-        'concave': concave_test,
-        'bowtie': bowtie_test,
-        'collinearity': collinear_test,
-        'hairline': hairline_test,
-    },
-    'messages': {
-        'skew-error': lambda skew_angle:
-            str.format('skew quadrilateral (plane angle {})',
-                degree_rep(skew_angle),
-            ),
-        'skew-warning': lambda skew_angle:
-            str.format('slightly skew quadrilateral (plane angle {})',
-                degree_rep(skew_angle),
-            ),
-        'concave-error': 'concave quadrilateral',
-        'self-intersecting': 'bowtie quadrilateral',
-        'collinearity-error': 'collinear polygon',
-        'hairline-warning': lambda smallest_angle:
-            str.format('hairline polygon (smallest angle {})',
-                degree_rep(smallest_angle),
-            ),
-    },
+    'tests': [
+        skew_test,
+        concave_test,
+        bowtie_test,
+        collinear_test,
+        hairline_test,
+    ],
 }

mercurial