def test_constraints_and_basic(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Pear', 2), 'Pear, 2 times', 3000, line_source) clues_lists = [ ([ Clue(('Milk', 3), 'Milk, 3 times', 50, line_source), Clue(('Chocolate', 2), 'Chocolate, 2 times', 100, line_source), Clue(('Pear', 2), 'Pear, 2 times', 150, line_source) ], 1), ([ Clue(('Pear', 2), 'Pear, 2 times', 1050, line_source), Clue(('Milk', 1), 'Milk, 1 times', 1100, line_source) ], 1) ] # yapf: disable constraints = [ { 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} }, { 'clues_groups': [[0, 2], [1, 2], [2, 2]], 'name': 'identical', 'params': {} } ] causes = Verifier.constraints_and(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.AND for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Pear', 2), 'Pear, 2 times', 150, line_source)), FrontInput.from_clue(Clue( ('Pear', 2), 'Pear, 2 times', 1050, line_source)) ] # yapf: disable
def test_constraints_and_basic(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Pear', 2), 'Pear, 2 times', 3000, line_source) clues_lists = [ ([ Clue(('Milk', 3), 'Milk, 3 times', 50, line_source), Clue(('Chocolate', 2), 'Chocolate, 2 times', 100, line_source), Clue(('Pear', 2), 'Pear, 2 times', 150, line_source) ], 1), ([ Clue(('Pear', 2), 'Pear, 2 times', 1050, line_source), Clue(('Milk', 1), 'Milk, 1 times', 1100, line_source) ], 1) ] # yapf: disable constraints = [{ 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} }, { 'clues_groups': [[0, 2], [1, 2], [2, 2]], 'name': 'identical', 'params': {} }] causes = Verifier.constraints_and(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.AND for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Pear', 2), 'Pear, 2 times', 150, line_source)), FrontInput.from_clue(Clue( ('Pear', 2), 'Pear, 2 times', 1050, line_source)) ] # yapf: disable
def test_constraints_or_without_constraints(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Pineapple', 44), 'Pineapple, 44 times', 3000, line_source) clues_lists = [ ([ Clue(('Banana', 2), 'Banana, 2 times', 1050, line_source), Clue(('Milk', 1), 'Milk, 2 times', 1100, line_source) ], 1), ([ Clue(('Chocolate', 2), 'Chocolate, 2 times', 100, line_source) ], 1) ] # yapf: disable constraints = [] causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 2 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Banana', 2), 'Banana, 2 times', 1050, line_source)), FrontInput.from_clue(Clue( ('Chocolate', 2), 'Chocolate, 2 times', 100, line_source)) ] # yapf: disable assert causes[1].lines == [ FrontInput.from_clue(Clue( ('Milk', 1), 'Milk, 2 times', 1100, line_source)), FrontInput.from_clue(Clue( ('Chocolate', 2), 'Chocolate, 2 times', 100, line_source)) ] # yapf: disable assert all(not cause.constraints for cause in causes)
def test_constraints_check_same_cause_parser_as_effect(self): rule = Rule( [self.cause_a], self.cause_a, [ { 'clues_groups': [[0, 1], [1, 1]], 'name': 'identical', 'params': {} } ], Rule.LINKAGE_AND ) # yapf: disable effect_clues_dict = { 'cause_a': Clue((42, ), '42 carrots', 1420, self.line_source) } clues = { # it's dictionary of the same type as clues dict collected in SearchManager 'cause_a': [ Clue((40,), '40 carrots', 400, self.line_source), Clue((42,), '42 carrots', 420, self.line_source), Clue((44,), '44 carrots', 440, self.line_source) ], 'dummy': [ Clue((98,), '98 foo bar', 980, self.line_source), Clue((99,), '99 foo bar', 990, self.line_source) ] } # yapf: disable results = rule.constraints_check(clues, effect_clues_dict) assert len(results) == 1 assert results[0].lines == [ FrontInput.from_clue( Clue((42,), '42 carrots', 420, self.line_source)) ] # yapf: disable
def test_constraints_or_two_time_constraints(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Foo occurred', datetime(2000, 6, 14, second=15)), 'Foo occurred, 2000 06 14 00:00:15', 500, line_source) clues_lists = [ ([ Clue(('Bar occurred', datetime(2000, 6, 14, second=10)), 'Bar occurred, 2000 06 14 00:00:10', 250, line_source), ], 1) ] # yapf: disable constraints = [{ 'clues_groups': [[1, 2], [0, 2]], 'name': 'time_delta', 'params': { 'max_delta': 8.0 } }, { 'clues_groups': [[1, 2], [0, 2]], 'name': 'time_delta', 'params': { 'max_delta': 3.0 } }] causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Bar occurred', datetime(2000, 6, 14, second=10)), 'Bar occurred, 2000 06 14 00:00:10', 250, line_source)) ] # yapf: disable assert len(causes[0].constraints) == 1 assert causes[0].constraints[0] == constraints[0]
def test_constraints_or_two_time_constraints(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue( ('Foo occurred', datetime(2000, 6, 14, second=15)), 'Foo occurred, 2000 06 14 00:00:15', 500, line_source ) clues_lists = [ ([ Clue(('Bar occurred', datetime(2000, 6, 14, second=10)), 'Bar occurred, 2000 06 14 00:00:10', 250, line_source), ], 1) ] # yapf: disable constraints = [ { 'clues_groups': [[1, 2], [0, 2]], 'name': 'time_delta', 'params': {'max_delta': 8.0} }, { 'clues_groups': [[1, 2], [0, 2]], 'name': 'time_delta', 'params': {'max_delta': 3.0} } ] causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Bar occurred', datetime(2000, 6, 14, second=10)), 'Bar occurred, 2000 06 14 00:00:10', 250, line_source)) ] # yapf: disable assert len(causes[0].constraints) == 1 assert causes[0].constraints[0] == constraints[0]
def test_constraints_check_same_cause_parser_as_effect(self): rule = Rule( [self.cause_a], self.cause_a, [ { 'clues_groups': [[0, 1], [1, 1]], 'name': 'identical', 'params': {} } ], Rule.LINKAGE_AND ) # yapf: disable effect_clues_dict = {'cause_a': Clue((42,), '42 carrots', 1420, self.line_source)} clues = { # it's dictionary of the same type as clues dict collected in SearchManager 'cause_a': [ Clue((40,), '40 carrots', 400, self.line_source), Clue((42,), '42 carrots', 420, self.line_source), Clue((44,), '44 carrots', 440, self.line_source) ], 'dummy': [ Clue((98,), '98 foo bar', 980, self.line_source), Clue((99,), '99 foo bar', 990, self.line_source) ] } # yapf: disable results = rule.constraints_check(clues, effect_clues_dict) assert len(results) == 1 assert results[0].lines == [ FrontInput.from_clue( Clue((42,), '42 carrots', 420, self.line_source)) ] # yapf: disable
def test_constraints_and_verification_failed_when_or_succeeded(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Banana', 44), 'Banana, 44 times', 3000, line_source) clues_lists = [ ([ Clue(('Milk', 3), 'Milk, 3 times', 50, line_source), Clue(('Chocolate', 4), 'Chocolate, 4 times', 100, line_source), Clue(('Pear', 2), 'Pear, 2 times', 150, line_source) # <- should be found (parser 1) ], 1), ([ Clue(('Pineapple', 2), 'Pineapple, 2 times', 1050, line_source), # <- should be found (parser 2) Clue(('Milk', 1), 'Milk, 1 times', 1100, line_source) ], 1) ] # yapf: disable constraints = [ { 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} }, { 'clues_groups': [[1, 2], [2, 2]], 'name': 'identical', 'params': {} } ] # testing 'and' causes = Verifier.constraints_and(clues_lists, effect, constraints, ConstraintManager()) assert not causes # testing 'or' causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Pear', 2), 'Pear, 2 times', 150, line_source)), FrontInput.from_clue(Clue( ('Pineapple', 2), 'Pineapple, 2 times', 1050, line_source)) ] # yapf: disable assert causes[0].constraints == [ { 'clues_groups': [[1, 2], [2, 2]], 'name': 'identical', 'params': {} } ]
def test_constraints_and_verification_failed_when_or_succeeded(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Banana', 44), 'Banana, 44 times', 3000, line_source) clues_lists = [ ([ Clue(('Milk', 3), 'Milk, 3 times', 50, line_source), Clue(('Chocolate', 4), 'Chocolate, 4 times', 100, line_source), Clue(('Pear', 2), 'Pear, 2 times', 150, line_source) # <- should be found (parser 1) ], 1), ([ Clue(('Pineapple', 2), 'Pineapple, 2 times', 1050, line_source), # <- should be found (parser 2) Clue(('Milk', 1), 'Milk, 1 times', 1100, line_source) ], 1) ] # yapf: disable constraints = [{ 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} }, { 'clues_groups': [[1, 2], [2, 2]], 'name': 'identical', 'params': {} }] # testing 'and' causes = Verifier.constraints_and(clues_lists, effect, constraints, ConstraintManager()) assert not causes # testing 'or' causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Pear', 2), 'Pear, 2 times', 150, line_source)), FrontInput.from_clue(Clue( ('Pineapple', 2), 'Pineapple, 2 times', 1050, line_source)) ] # yapf: disable assert causes[0].constraints == [{ 'clues_groups': [[1, 2], [2, 2]], 'name': 'identical', 'params': {} }]
def _create_investigation_result(cls, clues_combination, constraints, linkage): """ basing on clues combination and constraints, returns appropriate InvestigationResult object which collects information about lines (FrontInput objects) instead of Clues """ return InvestigationResult( [FrontInput.from_clue(clue) for clue in clues_combination], constraints, linkage )
def _create_investigation_result(cls, clues_combination, constraints, linkage): """ basing on clues combination and constraints, returns appropriate InvestigationResult object which collects information about lines (FrontInput objects) instead of Clues """ return InvestigationResult( [FrontInput.from_clue(clue) for clue in clues_combination], constraints, linkage)
def test_constraints_check_basic(self): rule = Rule( [self.cause_a, self.cause_b], self.effect, [ { 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} } ], Rule.LINKAGE_AND ) # yapf: disable effect_clues_dict = { 'effect': Clue((42, ), '42 dinners', 1420, self.line_source) } clues = { # it's dictionary of the same type as clues dict collected in SearchManager 'cause_a': [ Clue((40,), '40 carrots', 400, self.line_source), Clue((42,), '42 carrots', 420, self.line_source), Clue((44,), '44 carrots', 440, self.line_source) ], 'cause_b': [ Clue((32,), '32 broccoli', 100, self.line_source), Clue((42,), '42 broccoli', 120, self.line_source), Clue((52,), '52 broccoli', 140, self.line_source) ], 'dummy': [ Clue((42,), '42 foo bar', 980, self.line_source), Clue((84,), '84 foo bar', 990, self.line_source) ] } # yapf: disable results = rule.constraints_check(clues, effect_clues_dict) assert len(results) == 1 assert results[0].lines == [ FrontInput.from_clue( Clue((42,), '42 carrots', 420, self.line_source)), FrontInput.from_clue( Clue((42,), '42 broccoli', 120, self.line_source)) ] # yapf: disable
def test_constraints_check_basic(self): rule = Rule( [self.cause_a, self.cause_b], self.effect, [ { 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} } ], Rule.LINKAGE_AND ) # yapf: disable effect_clues_dict = {'effect': Clue((42,), '42 dinners', 1420, self.line_source)} clues = { # it's dictionary of the same type as clues dict collected in SearchManager 'cause_a': [ Clue((40,), '40 carrots', 400, self.line_source), Clue((42,), '42 carrots', 420, self.line_source), Clue((44,), '44 carrots', 440, self.line_source) ], 'cause_b': [ Clue((32,), '32 broccoli', 100, self.line_source), Clue((42,), '42 broccoli', 120, self.line_source), Clue((52,), '52 broccoli', 140, self.line_source) ], 'dummy': [ Clue((42,), '42 foo bar', 980, self.line_source), Clue((84,), '84 foo bar', 990, self.line_source) ] } # yapf: disable results = rule.constraints_check(clues, effect_clues_dict) assert len(results) == 1 assert results[0].lines == [ FrontInput.from_clue( Clue((42,), '42 carrots', 420, self.line_source)), FrontInput.from_clue( Clue((42,), '42 broccoli', 120, self.line_source)) ] # yapf: disable
def test_constraints_when_one_unmatched(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Banana', 2), 'Banana, 2 times', 3000, line_source) clues_lists = [ ([ ], 1), ([ Clue(('Banana', 2), 'Banana, 2 times', 1050, line_source), Clue(('Milk', 1), 'Milk, 1 times', 1100, line_source) ], 1) ] # yapf: disable constraints = [ { 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} }, { 'clues_groups': [[0, 2], [2, 2]], 'name': 'identical', 'params': {} } ] # testing 'or' causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Banana', 2), 'Banana, 2 times', 1050, line_source)) ] # yapf: disable assert causes[0].constraints == [ { 'clues_groups': [[0, 2], [2, 2]], 'name': 'identical', 'params': {} } ] # testing 'and' causes = Verifier.constraints_and(clues_lists, effect, constraints, ConstraintManager()) assert not causes
def test_constraints_when_one_unmatched(self): line_source = LineSource('localhost', 'node_0.log') effect = Clue(('Banana', 2), 'Banana, 2 times', 3000, line_source) clues_lists = [ ([ ], 1), ([ Clue(('Banana', 2), 'Banana, 2 times', 1050, line_source), Clue(('Milk', 1), 'Milk, 1 times', 1100, line_source) ], 1) ] # yapf: disable constraints = [{ 'clues_groups': [[0, 1], [1, 1], [2, 1]], 'name': 'identical', 'params': {} }, { 'clues_groups': [[0, 2], [2, 2]], 'name': 'identical', 'params': {} }] # testing 'or' causes = Verifier.constraints_or(clues_lists, effect, constraints, ConstraintManager()) assert len(causes) == 1 assert all(cause.constraints_linkage == InvestigationResult.OR for cause in causes) assert causes[0].lines == [ FrontInput.from_clue(Clue( ('Banana', 2), 'Banana, 2 times', 1050, line_source)) ] # yapf: disable assert causes[0].constraints == [{ 'clues_groups': [[0, 2], [2, 2]], 'name': 'identical', 'params': {} }] # testing 'and' causes = Verifier.constraints_and(clues_lists, effect, constraints, ConstraintManager()) assert not causes