def find(draw, check, settings=None): seen = False def test_function(data): nonlocal seen value = draw(data) try: if DEBUG: print(data.buffer[:data.index], "->", value) if check(value): seen = True data.incur_cost(len(repr(data))) data.mark_interesting() elif not seen and DEBUG: print(data.buffer[:data.index], "->", value) except UnsatisfiedAssumption: data.mark_invalid() buffer = find_interesting_buffer( test_function, settings=settings or Settings( generations=5000, )) if buffer is not None: result = draw(TestData(buffer)) assert check(result) return result raise NoSuchExample()
def new_buffer(self): buffer = os.urandom( self.fill_size) + bytes(self.settings.buffer_size - self.fill_size) self.last_data = TestData(buffer) self.test_function(self.last_data) self.last_data.freeze() self.update_fill_size()
def incorporate_new_buffer(self, buffer: bytes) -> bool: if buffer == self.last_data.buffer: return False data = TestData(buffer) self.test_function(data) data.freeze() if self.consider_new_test_data(data): if self.last_data.status == Status.INTERESTING: self.shrinks += 1 self.last_data = data self.update_fill_size() self.changed += 1 if self.shrinks >= self.settings.max_shrinks: raise StopShrinking() return True return False
def find(draw, check, settings=None): def test_function(data): value = draw(data) if check(value): data.incur_cost(len(repr(data))) if DEBUG: print(data.buffer[:data.index], "->", value) data.mark_interesting() buffer = find_interesting_buffer( test_function, settings=settings or Settings( mutations=50, generations=500, )) if buffer is not None: result = draw(TestData(buffer)) assert check(result) return result raise NoSuchExample()
def new_buffer(self): buffer = self.rand_bytes(self.settings.buffer_size) self.last_data = TestData(buffer) self.test_function(self.last_data) self.last_data.freeze()