def change_random_call(self, test_case: tc.TestCase, statement: stmt.Statement) -> bool: """Change the call represented by this statement to another one. Args: test_case: The test case statement: The new statement Returns: Whether or not the operation was successful """ if statement.return_value.is_type_unknown(): return False objects = test_case.get_all_objects(statement.get_position()) type_ = statement.return_value.variable_type assert type_, "Cannot change change call, when type is unknown" calls = self._get_possible_calls(type_, objects) acc_object = statement.accessible_object() if acc_object in calls: calls.remove(acc_object) if len(calls) == 0: return False call = randomness.choice(calls) try: self.change_call(test_case, statement, call) return True except ConstructionFailedException: self._logger.info("Failed to change call for statement.") return False
def handle(self, statement: st.Statement) -> None: """Actually handle the given statement. Args: statement: the statement that is visited. """ value = self._exec_ctx.get_variable_value(self._variable) if is_primitive_type(type(value)): return self._trace.add_entry( statement.get_position(), self._variable, nte.NoneTraceEntry(self._variable, value is None), )
def get_assertions(self, statement: stmt.Statement) -> Set[ass.Assertion]: """Get all assertions contained within this trace for the given statement. Args: statement: the statement for which all recorded assertions should be generated. Returns: All assertions in this trace for the given statement. """ position = statement.get_position() assertions = set() if position in self._trace: for _, entry in self._trace[position].items(): assertions.update(entry.get_assertions()) return assertions