Skip to content

Commit

Permalink
Complete strategies
Browse files Browse the repository at this point in the history
  • Loading branch information
lycantropos committed Dec 18, 2020
1 parent 856df2c commit 4c88155
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 67 deletions.
12 changes: 5 additions & 7 deletions tests/planar_tests/strategies.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from hypothesis import strategies

from tests.strategies import (points_strategies,
rational_points_strategies,
rational_segments_strategies,
segments_strategies)
from tests.utils import (Contour,
Point,
Expand All @@ -20,10 +18,10 @@
contours = (points_strategies.flatmap(partial(strategies.lists,
min_size=3))
.map(Contour))
non_triangular_rational_contours = (rational_points_strategies
.flatmap(partial(strategies.lists,
min_size=4))
.map(Contour))
non_triangular_contours = (points_strategies
.flatmap(partial(strategies.lists,
min_size=4))
.map(Contour))
triangular_contours = (points_strategies
.flatmap(partial(strategies.lists,
min_size=3,
Expand Down Expand Up @@ -61,7 +59,7 @@ def to_overlapped_segments(segments: List[Segment],
segments_lists |= strategies.builds(to_overlapped_segments, segments_lists,
strategies.integers(1, 100))
empty_segments_lists = strategies.builds(list)
non_empty_segments_lists = ((rational_segments_strategies
non_empty_segments_lists = ((segments_strategies
.flatmap(partial(strategies.lists,
min_size=1)))
| nets)
Expand Down
2 changes: 1 addition & 1 deletion tests/planar_tests/test_edges_intersect.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def test_base_case(segment_containment_checker: SegmentContainmentChecker,
mid_vertex)


@given(strategies.non_triangular_rational_contours)
@given(strategies.non_triangular_contours)
def test_step(segments_intersector: SegmentsIntersector,
segments_relater: SegmentsRelater,
contour: Contour) -> None:
Expand Down
2 changes: 0 additions & 2 deletions tests/strategies/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
from .base import (points_strategies,
rational_points_strategies,
rational_segments_strategies,
segments_strategies)
59 changes: 2 additions & 57 deletions tests/strategies/base.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import sys
from decimal import Decimal
from fractions import Fraction
from operator import ne
from typing import Optional

from ground.hints import Coordinate
from hypothesis import strategies
Expand All @@ -13,58 +10,10 @@
pack,
to_pairs)

MAX_FLOAT = 1.e15
MIN_FLOAT = -MAX_FLOAT


def to_floats(min_value: Optional[Coordinate] = MIN_FLOAT,
max_value: Optional[Coordinate] = MAX_FLOAT,
*,
allow_nan: bool = False,
allow_infinity: bool = False) -> Strategy:
return (strategies.floats(min_value=min_value,
max_value=max_value,
allow_nan=allow_nan,
allow_infinity=allow_infinity)
.map(to_digits_count))


def to_digits_count(number: float,
*,
max_digits_count: int = sys.float_info.dig) -> float:
decimal = Decimal(number).normalize()
_, significant_digits, exponent = decimal.as_tuple()
significant_digits_count = len(significant_digits)
if exponent < 0:
fixed_digits_count = (1 - exponent
if exponent <= -significant_digits_count
else significant_digits_count)
else:
fixed_digits_count = exponent + significant_digits_count
if fixed_digits_count <= max_digits_count:
return number
whole_digits_count = max(significant_digits_count + exponent, 0)
if whole_digits_count:
whole_digits_offset = max(whole_digits_count - max_digits_count, 0)
decimal /= 10 ** whole_digits_offset
whole_digits_count -= whole_digits_offset
else:
decimal *= 10 ** (-exponent - significant_digits_count)
whole_digits_count = 1
decimal = round(decimal, max(max_digits_count - whole_digits_count, 0))
return float(str(decimal))


rational_coordinates_strategies_factories = {Fraction: strategies.fractions,
int: strategies.integers}
coordinates_strategies_factories = {
float: to_floats,
**rational_coordinates_strategies_factories}
coordinates_strategies_factories = {Fraction: strategies.fractions,
int: strategies.integers}
coordinates_strategies = strategies.sampled_from(
[factory() for factory in coordinates_strategies_factories.values()])
rational_coordinates_strategies = strategies.sampled_from(
[factory()
for factory in rational_coordinates_strategies_factories.values()])


def coordinates_to_segments(coordinates: Strategy[Coordinate]
Expand All @@ -80,8 +29,4 @@ def coordinates_to_points(coordinates: Strategy[Coordinate]


points_strategies = coordinates_strategies.map(coordinates_to_points)
rational_points_strategies = (rational_coordinates_strategies
.map(coordinates_to_points))
segments_strategies = coordinates_strategies.map(coordinates_to_segments)
rational_segments_strategies = (rational_coordinates_strategies
.map(coordinates_to_segments))

0 comments on commit 4c88155

Please sign in to comment.