def test_parallel_many_events(self):
        event_group = EventGroupParallel([
            EventGroupParallel([Event('a'), Event('b')]),
            # Event('c'), Event('d'), Event('e'), Event('f'), Event('g'),
            # Event('h'),
            # Event('i'),
            Event('j'),
            Event('k'),
            Event('l'),
            Event('m'),
            Event('n'),
            EventGroupParallel([Event('o'), Event('p'),
                                Event('q')])
        ])

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, [
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
                'm', 'n'
            ], dict())
        char_list = events_to_char_list(model_result)
        print(events_to_char_list(model_result))
        self.assertEqual(-10, result)
        self.assertCountEqual([x for x in 'abcdefghijklmn'], char_list)
    def test_nw_with_wrapper_parallel(self):
        event_group = EventGroupParallel(string_to_events('pqacezxys'))

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['z', 'x', 'k', 'l', 'm', 'n', 'o', 'z', 'x'], dict())
        print(events_to_char_list(model_result))
        self.assertEqual(-14, result)
        self.assertCountEqual([x for x in ['z', 'x']],
                              events_to_char_list(model_result))
        self.assertEqual(['z', 'x'], events_to_char_list(model_result))
    def test_nw_with_wrapper(self):
        event_group = EventGroup(string_to_events('pqacezxys'))

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['z', 'x', 'a', 'b', 'c', 'd', 'e', 'z', 'x'], dict())
        print(events_to_char_list(model_result))
        self.assertEqual(-8, result)
        self.assertCountEqual([x for x in ['a', 'c', 'e', 'z', 'x']],
                              events_to_char_list(model_result))
        self.assertEqual(['a', 'c', 'e', 'z', 'x'],
                         events_to_char_list(model_result))
    def test_nw_with_wrapper_parallel_inside_7(self):
        event_group = EventGroupParallel(
            [EventGroupParallel(string_to_events('tp')),
             Event('q')])

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['q'], dict())
        char_list = events_to_char_list(model_result)
        print(events_to_char_list(model_result))
        self.assertEqual(-2, result)
        self.assertCountEqual([x for x in ['q']], char_list)
        self.assertEqual(['q'], events_to_char_list(model_result))
    def test_nw_with_wrapper_parallel_inside(self):
        event_group = EventGroupParallel(
            [Event('t'),
             EventGroupParallel(string_to_events('spqacezxy'))])

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['z', 'x', 'a', 'b', 'c', 'd', 'e', 'z', 't'], dict())
        char_list = events_to_char_list(model_result)
        print(events_to_char_list(model_result))
        self.assertEqual(-7, result)
        self.assertCountEqual([x for x in ['z', 'x', 'a', 'c', 'e', 't']],
                              char_list)
        self.assertEqual(['z', 'x', 'a', 'c', 'e', 't'],
                         events_to_char_list(model_result))
    def test_additional3(self):
        event_group = EventGroup([
            EventGroupParallel([Event('c'), Event('f')]),
            EventGroupParallel([Event('a'), Event('b')]),
            Event('c')
        ])

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['b', 'c', 'd'], dict())
        char_list = events_to_char_list(model_result)
        print(events_to_char_list(model_result))
        self.assertEqual(-4, result)
        self.assertCountEqual([x for x in ['b', 'c']], char_list)
        self.assertEqual(['b', 'c'], events_to_char_list(model_result))
    def test_nw_with_wrapper_model_bigger(self):
        event_group_events = []
        for x in 'pqacezxysabc':
            event_group_events.append(Event(x))
        event_group = EventGroup(event_group_events)

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['z', 'x', 'a', 'b', 'c', 'd', 'e', 'z', 'x'], dict())
        print(events_to_char_list(model_result))
        self.assertEqual(-11, result)
        self.assertCountEqual([x for x in ['a', 'c', 'e', 'z', 'x']],
                              events_to_char_list(model_result))
        self.assertEqual(['a', 'c', 'e', 'z', 'x'],
                         events_to_char_list(model_result))
    def test_all_events_in_model(self):
        # when your algorithm is smarter than you
        event_group = EventGroupParallel([
            Event('a'),
            Event('f'),
            EventGroupParallel(string_to_events('bec')),
            Event('d')
        ])

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['a', 'b', 'c', 'd', 'e', 'f'], dict())
        char_list = events_to_char_list(model_result)
        print(events_to_char_list(model_result))
        self.assertEqual(-2, result)
        self.assertCountEqual([x for x in ['a', 'b', 'c', 'e', 'f']],
                              char_list)
    def test_legend(self):
        event_group = EventGroup([
            Event('a'),
            EventGroupParallel([Event('c'), Event('d')]),
            Event('e'),
            Event('h')
        ])

        alignment_cached = BestAlignmentCached()
        result, model_result = alignment_cached.get_best_alignment(
            event_group, ['a', 'c', 'd', 'e', 'h'], dict())
        char_list = events_to_char_list(model_result)
        print(events_to_char_list(model_result))
        self.assertEqual(0, result)
        self.assertCountEqual([x for x in ['a', 'c', 'd', 'e', 'h']],
                              char_list)
        self.assertEqual(['a', 'c', 'd', 'e', 'h'],
                         events_to_char_list(model_result))