def tuple_check(self, stream, checker): """Check each tuple on a stream. For each tuple ``t`` on `stream` ``checker(t)`` is called. If the return evaluates to `False` then the condition fails. Once the condition fails it can never become valid. Otherwise the condition becomes or remains valid. The first tuple on the stream makes the condition valid if the checker callable evaluates to `True`. The condition can be combined with :py:meth:`tuple_count` with ``exact=False`` to test a stream map or filter with random input data. An example of combining `tuple_count` and `tuple_check` to test a filter followed by a map is working correctly across a random set of values:: def rands(): r = random.Random() while True: yield r.random() class TestFilterMap(unittest.testCase): # Set up omitted def test_filter(self): # Declare the application to be tested topology = Topology() r = topology.source(rands()) r = r.filter(lambda x : x > 0.7) r = r.map(lambda x : x + 0.2) # Create tester and assign conditions tester = Tester(topology) # Ensure at least 1000 tuples pass through the filter. tester.tuple_count(r, 1000, exact=False) tester.tuple_check(r, lambda x : x > 0.9) # Submit the application for test # If it fails an AssertionError will be raised. tester.test(self.test_ctxtype, self.test_config) Args: stream(Stream): Stream to be tested. checker(callable): Callable that must evaluate to True for each tuple. """ name = stream.name + '_check' cond = sttrt._TupleCheck(checker, name) self.topology.graph.add_dependency(checker) return self.add_condition(stream, cond)