@@ -1909,10 +1909,11 @@ def draw_integer(
1909
1909
)
1910
1910
1911
1911
if self .ir_tree_nodes is not None and observe :
1912
- node = self ._pop_ir_tree_node ("integer" , kwargs , forced = forced )
1913
- assert isinstance (node .value , int )
1914
- forced = node .value
1915
- fake_forced = not node .was_forced
1912
+ node = self ._pop_ir_tree_node ("integer" , kwargs )
1913
+ if forced is None :
1914
+ assert isinstance (node .value , int )
1915
+ forced = node .value
1916
+ fake_forced = True
1916
1917
1917
1918
value = self .provider .draw_integer (
1918
1919
** kwargs , forced = forced , fake_forced = fake_forced
@@ -1965,10 +1966,11 @@ def draw_float(
1965
1966
)
1966
1967
1967
1968
if self .ir_tree_nodes is not None and observe :
1968
- node = self ._pop_ir_tree_node ("float" , kwargs , forced = forced )
1969
- assert isinstance (node .value , float )
1970
- forced = node .value
1971
- fake_forced = not node .was_forced
1969
+ node = self ._pop_ir_tree_node ("float" , kwargs )
1970
+ if forced is None :
1971
+ assert isinstance (node .value , float )
1972
+ forced = node .value
1973
+ fake_forced = True
1972
1974
1973
1975
value = self .provider .draw_float (
1974
1976
** kwargs , forced = forced , fake_forced = fake_forced
@@ -2006,10 +2008,11 @@ def draw_string(
2006
2008
},
2007
2009
)
2008
2010
if self .ir_tree_nodes is not None and observe :
2009
- node = self ._pop_ir_tree_node ("string" , kwargs , forced = forced )
2010
- assert isinstance (node .value , str )
2011
- forced = node .value
2012
- fake_forced = not node .was_forced
2011
+ node = self ._pop_ir_tree_node ("string" , kwargs )
2012
+ if forced is None :
2013
+ assert isinstance (node .value , str )
2014
+ forced = node .value
2015
+ fake_forced = True
2013
2016
2014
2017
value = self .provider .draw_string (
2015
2018
** kwargs , forced = forced , fake_forced = fake_forced
@@ -2041,10 +2044,11 @@ def draw_bytes(
2041
2044
kwargs : BytesKWargs = self ._pooled_kwargs ("bytes" , {"size" : size })
2042
2045
2043
2046
if self .ir_tree_nodes is not None and observe :
2044
- node = self ._pop_ir_tree_node ("bytes" , kwargs , forced = forced )
2045
- assert isinstance (node .value , bytes )
2046
- forced = node .value
2047
- fake_forced = not node .was_forced
2047
+ node = self ._pop_ir_tree_node ("bytes" , kwargs )
2048
+ if forced is None :
2049
+ assert isinstance (node .value , bytes )
2050
+ forced = node .value
2051
+ fake_forced = True
2048
2052
2049
2053
value = self .provider .draw_bytes (
2050
2054
** kwargs , forced = forced , fake_forced = fake_forced
@@ -2082,10 +2086,11 @@ def draw_boolean(
2082
2086
kwargs : BooleanKWargs = self ._pooled_kwargs ("boolean" , {"p" : p })
2083
2087
2084
2088
if self .ir_tree_nodes is not None and observe :
2085
- node = self ._pop_ir_tree_node ("boolean" , kwargs , forced = forced )
2086
- assert isinstance (node .value , bool )
2087
- forced = node .value
2088
- fake_forced = not node .was_forced
2089
+ node = self ._pop_ir_tree_node ("boolean" , kwargs )
2090
+ if forced is None :
2091
+ assert isinstance (node .value , bool )
2092
+ forced = node .value
2093
+ fake_forced = True
2089
2094
2090
2095
value = self .provider .draw_boolean (
2091
2096
** kwargs , forced = forced , fake_forced = fake_forced
@@ -2122,9 +2127,7 @@ def _pooled_kwargs(self, ir_type, kwargs):
2122
2127
POOLED_KWARGS_CACHE [key ] = kwargs
2123
2128
return kwargs
2124
2129
2125
- def _pop_ir_tree_node (
2126
- self , ir_type : IRTypeName , kwargs : IRKWargsType , * , forced : Optional [IRType ]
2127
- ) -> IRNode :
2130
+ def _pop_ir_tree_node (self , ir_type : IRTypeName , kwargs : IRKWargsType ) -> IRNode :
2128
2131
assert self .ir_tree_nodes is not None
2129
2132
2130
2133
if self .ir_tree_nodes == []:
@@ -2151,32 +2154,6 @@ def _pop_ir_tree_node(
2151
2154
if not ir_value_permitted (node .value , node .ir_type , kwargs ):
2152
2155
self .mark_invalid () # pragma: no cover # FIXME @tybug
2153
2156
2154
- if forced is not None :
2155
- # if we expected a forced node but are instead returning a non-forced
2156
- # node, something has gone terribly wrong. If we allowed this combination,
2157
- # we risk violating core invariants that rely on forced draws being,
2158
- # well, forced to a particular value.
2159
- #
2160
- # In particular, this can manifest while shrinking. Consider the tree
2161
- # [boolean True [forced] {"p": 0.5}]
2162
- # [boolean False {"p": 0.5}]
2163
- #
2164
- # and the shrinker tries to reorder these to
2165
- # [boolean False {"p": 0.5}]
2166
- # [boolean True [forced] {"p": 0.5}].
2167
- #
2168
- # However, maybe we got lucky and the non-forced node is returning
2169
- # the same value that was expected from the forced draw. We lucked
2170
- # into an aligned tree in this case and can let it slide.
2171
- if not node .was_forced and not ir_value_equal (ir_type , forced , node .value ):
2172
- self .mark_invalid ()
2173
-
2174
- # similarly, if we expected a forced node with a certain value, and
2175
- # are returning a forced node with a different value, this is an
2176
- # equally bad misalignment.
2177
- if node .was_forced and not ir_value_equal (ir_type , forced , node .value ):
2178
- self .mark_invalid ()
2179
-
2180
2157
return node
2181
2158
2182
2159
def as_result (self ) -> Union [ConjectureResult , _Overrun ]:
0 commit comments