def evaluate(self, history: List[Pairs], members: Members) -> List[Pairs]: if not history: return PairTree.possible_pairs(members.combinations()) filtered_pair_trees = self.pair_must_have_only_either_member_of_last_pair( history[-1], members.combinations()) if not filtered_pair_trees: filtered_pair_trees = members.combinations() possible_pairs: List[Pairs] = PairTree.possible_pairs( filtered_pair_trees) possible_pairs = self.member_is_must_not_in_same_position_at_three_times( history, possible_pairs) good_pairs = possible_pairs for i in range(1, len(history) + 1): tmp = self.pair_should_not_exist_same_pair_in_near_history( history[-i:], possible_pairs) if not tmp: break else: good_pairs = tmp return good_pairs
def test_filter_and_empty(self): members = Members([Member('a'), Member('b')]) tree = members.combinations() filtered = EvaluationService( ).pair_must_have_only_either_member_of_last_pair( Pairs([Pair(Member('a'), Member('b'))]), tree) self.assertEqual(filtered, [])
class MembersTest(TestCase): def setUp(self): self.members = Members([Member('a'), Member('b'), Member('c')]) self.single_members = Members([Member('a')]) def test_select_first_pairs(self): self.assertEqual( self.members.select_first_pairs(), [(Pair(Member('a'), Member('b')), Members([Member('c')])), (Pair(Member('a'), Member('c')), Members([Member('b')])), (Pair(Member('b'), Member('c')), Members([Member('a')]))]) def test_select_first_pairs_with_single_members(self): self.assertEqual(self.single_members.select_first_pairs(), [(Pair(Member('a'), None), Members([]))]) def test_combinations(self): self.assertEqual(self.members.combinations(), [ PairTree(Pair(Member('a'), Member('b')), [PairTree(Pair(Member('c'), None), [])]), PairTree(Pair(Member('a'), Member('c')), [PairTree(Pair(Member('b'), None), [])]), PairTree(Pair(Member('b'), Member('c')), [PairTree(Pair(Member('a'), None), [])]) ]) def test_possible_pair(self): pass
def test_evaluate_three_times(self): history = [ Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]), Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('c'), Member('d')), Pair(Member('b'), Member('e')), Pair(Member('a'), None) ]) ] members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate(history, members) self.assertEqual(pairs, [ Pairs([ Pair(Member('d'), Member('e')), Pair(Member('a'), Member('b')), Pair(Member('c'), None) ]) ])
def setUp(self): self.last_pairs3 = Pairs( [Pair(Member('a'), Member('b')), Pair(Member('c'), None)]) self.members3 = Members([Member('a'), Member('b'), Member('c')]) self.last_pairs5 = Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]) self.members5 = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')])
def test_evaluate(self): last_pairs = Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]) members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate([last_pairs], members) self.assertEqual(pairs, [ Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('a'), Member('d')), Pair(Member('c'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('a'), Member('e')), Pair(Member('b'), Member('c')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('a'), Member('e')), Pair(Member('b'), Member('d')), Pair(Member('c'), None) ]), Pairs([ Pair(Member('b'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('b'), Member('d')), Pair(Member('c'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('c')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('d')), Pair(Member('c'), None) ]), ])
def test_run(self): pairs_list = self.use_case.run( Members([Member('a'), Member('b'), Member('c')])) self.assertEqual(pairs_list, [ Pairs([Pair(Member('a'), Member('b')), Pair(Member('c'), None)]), Pairs([Pair(Member('a'), Member('c')), Pair(Member('b'), None)]), Pairs([Pair(Member('b'), Member('c')), Pair(Member('a'), None)]) ])
def test_run_with_history(self): self.repository.save( PairsHistory( PairsHistoryId('id'), Pairs( [Pair(Member('a'), Member('b')), Pair(Member('c'), None)]))) pairs_list = self.use_case.run( Members([Member('a'), Member('b'), Member('c')])) self.assertEqual(pairs_list, [ Pairs([Pair(Member('a'), Member('c')), Pair(Member('b'), None)]), Pairs([Pair(Member('b'), Member('c')), Pair(Member('a'), None)]) ])
def load_members(self, message: pair_pb2.Members) -> Members: return Members([self.load_member(m) for m in message.members])
def next(self, *members) -> List[Pairs]: """e.g. pairpair.py next test1 test2 test3""" pairs_list = next_pairs_by_history().run( Members.from_list(list(members))) return pairs_list
def test_select_first_pairs(self): self.assertEqual( self.members.select_first_pairs(), [(Pair(Member('a'), Member('b')), Members([Member('c')])), (Pair(Member('a'), Member('c')), Members([Member('b')])), (Pair(Member('b'), Member('c')), Members([Member('a')]))])
def setUp(self): self.members = Members([Member('a'), Member('b'), Member('c')]) self.single_members = Members([Member('a')])
class EvaluationServiceTest(TestCase): def setUp(self): self.last_pairs3 = Pairs( [Pair(Member('a'), Member('b')), Pair(Member('c'), None)]) self.members3 = Members([Member('a'), Member('b'), Member('c')]) self.last_pairs5 = Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]) self.members5 = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) def test_filter(self): tree = self.members3.combinations() filtered_tree = EvaluationService( ).pair_must_have_only_either_member_of_last_pair( self.last_pairs3, tree) self.assertEqual(filtered_tree, [ PairTree(Pair(Member('a'), Member('c')), [PairTree(Pair(Member('b'), None), [])]), PairTree(Pair(Member('b'), Member('c')), [PairTree(Pair(Member('a'), None), [])]) ]) def test_filter2(self): tree = self.members5.combinations() filtered_tree = EvaluationService( ).pair_must_have_only_either_member_of_last_pair( self.last_pairs5, tree) self.assertEqual(filtered_tree, [ PairTree(Pair(Member('a'), Member('c')), [ PairTree(Pair(Member('d'), Member('e')), [PairTree(Pair(Member('b'), None), [])]) ]), PairTree(Pair(Member('a'), Member('d')), [ PairTree(Pair(Member('c'), Member('e')), [PairTree(Pair(Member('b'), None), [])]) ]), PairTree(Pair(Member('a'), Member('e')), [ PairTree(Pair(Member('b'), Member('c')), [PairTree(Pair(Member('d'), None), [])]), PairTree(Pair(Member('b'), Member('d')), [PairTree(Pair(Member('c'), None), [])]) ]), PairTree(Pair(Member('b'), Member('c')), [ PairTree(Pair(Member('d'), Member('e')), [PairTree(Pair(Member('a'), None), [])]) ]), PairTree(Pair(Member('b'), Member('d')), [ PairTree(Pair(Member('c'), Member('e')), [PairTree(Pair(Member('a'), None), [])]) ]), PairTree(Pair(Member('b'), Member('e')), [ PairTree(Pair(Member('a'), Member('c')), [PairTree(Pair(Member('d'), None), [])]), PairTree(Pair(Member('a'), Member('d')), [PairTree(Pair(Member('c'), None), [])]) ]) ]) def test_filter_and_empty(self): members = Members([Member('a'), Member('b')]) tree = members.combinations() filtered = EvaluationService( ).pair_must_have_only_either_member_of_last_pair( Pairs([Pair(Member('a'), Member('b'))]), tree) self.assertEqual(filtered, []) def test_position_filter(self): history = [ Pairs([Pair(Member('a'), Member('b')), Pair(Member('c'), None)]), Pairs([Pair(Member('a'), Member('c')), Pair(Member('b'), None)]) ] tree = self.members3.combinations() possible_pairs = PairTree.possible_pairs(tree) filtered_tree = EvaluationService( ).member_is_must_not_in_same_position_at_three_times( history, possible_pairs) self.assertEqual( filtered_tree, [Pairs([Pair(Member('b'), Member('c')), Pair(Member('a'), None)])]) def test_filter_same_pair(self): history = [ Pairs([Pair(Member('a'), Member('b')), Pair(Member('c'), None)]) ] pairs = PairTree.possible_pairs(self.members3.combinations()) filtered_pairs = EvaluationService( ).pair_should_not_exist_same_pair_in_near_history(history, pairs) self.assertEqual(filtered_pairs, [ Pairs([Pair(Member('a'), Member('c')), Pair(Member('b'), None)]), Pairs([Pair(Member('b'), Member('c')), Pair(Member('a'), None)]) ]) def test_filter_same_pair2(self): history = [ Pairs([Pair(Member('a'), Member('b')), Pair(Member('c'), None)]), Pairs([Pair(Member('a'), Member('c')), Pair(Member('b'), None)]) ] pairs = PairTree.possible_pairs(self.members3.combinations()) filtered_pairs = EvaluationService( ).pair_should_not_exist_same_pair_in_near_history(history, pairs) self.assertEqual( filtered_pairs, [Pairs([Pair(Member('b'), Member('c')), Pair(Member('a'), None)])]) def test_filter_same_pair3(self): history = [ Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]) ] tree = self.members5.combinations() s = EvaluationService() filtered_pairs = s.pair_should_not_exist_same_pair_in_near_history( history, PairTree.possible_pairs( s.pair_must_have_only_either_member_of_last_pair( history[-1], tree))) self.assertEqual(filtered_pairs, [ Pairs([ Pair(Member('a'), Member('e')), Pair(Member('b'), Member('c')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('a'), Member('e')), Pair(Member('b'), Member('d')), Pair(Member('c'), None) ]), Pairs([ Pair(Member('b'), Member('d')), Pair(Member('c'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('c')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('d')), Pair(Member('c'), None) ]) ]) def test_evaluate(self): last_pairs = Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]) members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate([last_pairs], members) self.assertEqual(pairs, [ Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('a'), Member('d')), Pair(Member('c'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('a'), Member('e')), Pair(Member('b'), Member('c')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('a'), Member('e')), Pair(Member('b'), Member('d')), Pair(Member('c'), None) ]), Pairs([ Pair(Member('b'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('b'), Member('d')), Pair(Member('c'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('c')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('d')), Pair(Member('c'), None) ]), ]) def test_evaluate_twice(self): history = [ Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]), Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]) ] members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate(history, members) self.assertEqual(pairs, [ Pairs([ Pair(Member('b'), Member('c')), Pair(Member('a'), Member('e')), Pair(Member('d'), None) ]), Pairs([ Pair(Member('c'), Member('d')), Pair(Member('b'), Member('e')), Pair(Member('a'), None) ]) ]) def test_evaluate_three_times(self): history = [ Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]), Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('c'), Member('d')), Pair(Member('b'), Member('e')), Pair(Member('a'), None) ]) ] members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate(history, members) self.assertEqual(pairs, [ Pairs([ Pair(Member('d'), Member('e')), Pair(Member('a'), Member('b')), Pair(Member('c'), None) ]) ]) def test_evaluate_four_times(self): history = [ Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]), Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('c'), Member('d')), Pair(Member('b'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('d'), Member('e')), Pair(Member('a'), Member('b')), Pair(Member('c'), None) ]) ] members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate(history, members) self.assertEqual(pairs, [ Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('c')), Pair(Member('d'), None) ]) ]) def test_evaluate_five_times(self): history = [ Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]), Pairs([ Pair(Member('a'), Member('c')), Pair(Member('d'), Member('e')), Pair(Member('b'), None) ]), Pairs([ Pair(Member('c'), Member('d')), Pair(Member('b'), Member('e')), Pair(Member('a'), None) ]), Pairs([ Pair(Member('d'), Member('e')), Pair(Member('a'), Member('b')), Pair(Member('c'), None) ]), Pairs([ Pair(Member('b'), Member('e')), Pair(Member('a'), Member('c')), Pair(Member('d'), None) ]) ] members = Members( [Member('a'), Member('b'), Member('c'), Member('d'), Member('e')]) pairs = EvaluationService().evaluate(history, members) self.assertEqual(pairs, [ Pairs([ Pair(Member('a'), Member('b')), Pair(Member('c'), Member('d')), Pair(Member('e'), None) ]) ])
def test_select_first_pairs_with_single_members(self): self.assertEqual(self.single_members.select_first_pairs(), [(Pair(Member('a'), None), Members([]))])