Move repetitive hypothesis strategy definition to separate functions
Marco Ricci

Marco Ricci commited on 2025-01-25 00:16:59
Zeige 1 geänderte Dateien mit 29 Einfügungen und 19 Löschungen.


Apart from higher resistance to typos, this also communicates the intent
of the strategy more clearly.
... ...
@@ -16,18 +16,36 @@ import tests
16 16
 from derivepassphrase import _types
17 17
 
18 18
 
19
-@tests.hypothesis_settings_coverage_compatible
20
-@hypothesis.given(
21
-    value=strategies.one_of(
22
-        strategies.recursive(
19
+@strategies.composite
20
+def js_atoms_strategy(
21
+    draw: strategies.DrawFn,
22
+) -> int | float | str | bytes | bool | None:
23
+    """Yield a JS atom."""
24
+    return draw(
23 25
         strategies.one_of(
24
-                strategies.none(),
25
-                strategies.booleans(),
26 26
             strategies.integers(),
27 27
             strategies.floats(allow_nan=False, allow_infinity=False),
28 28
             strategies.text(max_size=100),
29 29
             strategies.binary(max_size=100),
30
+            strategies.booleans(),
31
+            strategies.none(),
30 32
         ),
33
+    )
34
+
35
+
36
+@strategies.composite
37
+def js_nested_strategy(draw: strategies.DrawFn) -> Any:
38
+    """Yield an arbitrary and perhaps nested JS value."""
39
+    return draw(
40
+        strategies.one_of(
41
+            js_atoms_strategy(),
42
+            strategies.builds(tuple),
43
+            strategies.builds(list),
44
+            strategies.builds(dict),
45
+            strategies.builds(set),
46
+            strategies.builds(frozenset),
47
+            strategies.recursive(
48
+                js_atoms_strategy(),
31 49
                 lambda s: strategies.one_of(
32 50
                     strategies.frozensets(s, max_size=100),
33 51
                     strategies.builds(
... ...
@@ -37,27 +55,19 @@ from derivepassphrase import _types
37 55
                 max_leaves=8,
38 56
             ),
39 57
             strategies.recursive(
40
-            strategies.one_of(
41
-                strategies.none(),
42
-                strategies.booleans(),
43
-                strategies.integers(),
44
-                strategies.floats(allow_nan=False, allow_infinity=False),
45
-                strategies.text(max_size=100),
46
-                strategies.binary(max_size=100),
47
-            ),
58
+                js_atoms_strategy(),
48 59
                 lambda s: strategies.one_of(
49 60
                     strategies.lists(s, max_size=100),
50 61
                     strategies.dictionaries(strategies.text(max_size=100), s),
51 62
                 ),
52 63
                 max_leaves=25,
53 64
             ),
54
-        strategies.builds(tuple),
55
-        strategies.builds(list),
56
-        strategies.builds(dict),
57
-        strategies.builds(set),
58
-        strategies.builds(frozenset),
59 65
         ),
60 66
     )
67
+
68
+
69
+@tests.hypothesis_settings_coverage_compatible
70
+@hypothesis.given(value=js_nested_strategy())
61 71
 @hypothesis.example(float('nan'))
62 72
 def test_100_js_truthiness(value: Any) -> None:
63 73
     """Determine the truthiness of a value according to JavaScript.
64 74