Exemplo n.º 1
0
class TestPowerPairedWithAllocatedSidesDrawGeneratorPartOddBrackets(unittest.TestCase):
    """Basic unit test for core functionality of power-paired draws with allocated
    sides. Not comprehensive."""

    brackets = dict()
    brackets[1] = OrderedDict([
        (5, {"aff": [1], "neg": [14]}),
        (4, {"aff": [2, 3], "neg": [15]}),
        (3, {"aff": [4, 5, 6, 7, 8], "neg": [16, 17, 18]}),
        (2, {"aff": [9, 10], "neg": [19, 20, 21]}),
        (1, {"aff": [11, 12], "neg": [22, 23, 24, 25]}),
        (0, {"aff": [13], "neg": [26]}),
    ])
    brackets[2] = OrderedDict([
        (5, {"aff": [], "neg": [16, 17]}),
        (4, {"aff": [1, 2, 3, 4], "neg": [18, 19, 20, 21]}),
        (3, {"aff": [5, 6, 7], "neg": [22, 23]}),
        (2, {"aff": [8, 9, 10], "neg": []}),
        (1, {"aff": [11, 12, 13, 14], "neg": [24, 25, 26, 27]}),
        (0, {"aff": [15], "neg": [28, 29, 30]}),
    ])
    brackets[3] = OrderedDict([
        (5, {"aff": [1, 2], "neg": []}),
        (4, {"aff": [3, 4], "neg": [13]}),
        (3, {"aff": [5, 6, 7, 8, 9], "neg": [14, 15, 16]}),
        (2, {"aff": [], "neg": [17, 18, 19]}),
        (1, {"aff": [10, 11], "neg": [20, 21, 22, 23, 24]}),
        (0, {"aff": [12], "neg": []}),
    ])
    brackets[4] = OrderedDict([
        (3, {"aff": ["Yale 2", "Stanford 2", "Yale 1"], "neg": []}),
        (2, {"aff": ["John Hopkins 1", "Stanford 1", "MIT 1", "Stanford 3", "Berkeley 1"], "neg": ["MIT 2", "Columbia 1", "Caltech 1", "Caltech 3"]}),
        (1, {"aff": ["Caltech 2", "Cornell 1", "Yale 3", "Princeton 1"], "neg": ["Chicago 2", "Chicago 1", "Pennsylvania 1", "Chicago 3", "Princeton 2"]}),
        (0, {"aff": [], "neg": ["Pennsylvania 2", "Harvard 1", "Harvard 2"]}),
    ])
    brackets[99] = OrderedDict([ # Uneven aff/neg, should raise exception
        (5, {"aff": [1, 2], "neg": []}),
        (4, {"aff": [3, 4], "neg": [14]}),
        (3, {"aff": [5, 6, 7, 8, 9], "neg": [15, 16]}),
        (2, {"aff": [], "neg": [17, 18, 19, 20]}),
        (1, {"aff": [10, 11], "neg": [21, 22, 23, 24]}),
        (0, {"aff": [12, 13], "neg": []}),
    ])

    def setUp(self):
        self.ppd = DrawGenerator("power_paired", DUMMY_TEAMS, side_allocations="preallocated")

    def tearDown(self):
        del self.ppd

    def bracket_resolve_odd(self, name, expecteds):
        self.ppd.options["odd_bracket"] = name
        for index, expected in expecteds.iteritems():
            self.b2 = copy.deepcopy(self.brackets[index])
            self.ppd.resolve_odd_brackets(self.b2)
            self.assertDictEqual(self.b2, expected)
            del self.b2

    def test_pullup_invalid(self):
        for name in ["pullup_top", "pullup_bottom", "pullup_random", "intermediate1", "intermediate2"]:
            self.ppd.options["odd_bracket"] = name
            self.b2 = copy.deepcopy(self.brackets[99])
            self.assertRaises(DrawError, self.ppd.resolve_odd_brackets, self.b2)

    def test_pullup_top(self):
        expecteds = dict()
        expecteds[1] = OrderedDict([
            (5, {"aff": [1], "neg": [14]}),
            (4, {"aff": [2, 3], "neg": [15, 16]}),
            (3, {"aff": [4, 5, 6, 7, 8], "neg": [17, 18, 19, 20, 21]}),
            (2, {"aff": [9, 10], "neg": [22, 23]}),
            (1, {"aff": [11, 12], "neg": [24, 25]}),
            (0, {"aff": [13], "neg": [26]}),
        ])
        expecteds[2] = OrderedDict([
            (5, {"aff": [1, 2], "neg": [16, 17]}),
            (4, {"aff": [3, 4, 5, 6], "neg": [18, 19, 20, 21]}),
            (3, {"aff": [7, 8], "neg": [22, 23]}),
            (2, {"aff": [9, 10], "neg": [24, 25]}),
            (1, {"aff": [11, 12, 13, 14], "neg": [26, 27, 28, 29]}),
            (0, {"aff": [15], "neg": [30]}),
        ])
        expecteds[3] = OrderedDict([
            (5, {"aff": [1, 2], "neg": [13, 14]}),
            (4, {"aff": [3, 4], "neg": [15, 16]}),
            (3, {"aff": [5, 6, 7, 8, 9], "neg": [17, 18, 19, 20, 21]}),
            (2, {"aff": [], "neg": []}),
            (1, {"aff": [10, 11, 12], "neg": [22, 23, 24]}),
            (0, {"aff": [], "neg": []}),
        ])
        expecteds[4] = OrderedDict([
            (3, {"aff": ["Yale 2", "Stanford 2", "Yale 1"], "neg": ["MIT 2", "Columbia 1", "Caltech 1"]}),
            (2, {"aff": ["John Hopkins 1", "Stanford 1", "MIT 1", "Stanford 3", "Berkeley 1"], "neg": ["Caltech 3", "Chicago 2", "Chicago 1", "Pennsylvania 1", "Chicago 3"]}),
            (1, {"aff": ["Caltech 2", "Cornell 1", "Yale 3", "Princeton 1"], "neg": ["Princeton 2", "Pennsylvania 2", "Harvard 1", "Harvard 2"]}),
            (0, {"aff": [], "neg": []}),
        ])
        self.bracket_resolve_odd("pullup_top", expecteds)

    def test_pullup_bottom(self):
        expecteds = dict()
        expecteds[1] = OrderedDict([
            (5, {"aff": [1], "neg": [14]}),
            (4, {"aff": [2, 3], "neg": [15, 18]}),
            (3, {"aff": [4, 5, 6, 7, 8], "neg": [16, 17, 19, 20, 21]}),
            (2, {"aff": [9, 10], "neg": [24, 25]}),
            (1, {"aff": [11, 12], "neg": [22, 23]}),
            (0, {"aff": [13], "neg": [26]}),
        ])
        expecteds[2] = OrderedDict([
            (5, {"aff": [3, 4], "neg": [16, 17]}),
            (4, {"aff": [1, 2, 6, 7], "neg": [18, 19, 20, 21]}),
            (3, {"aff": [5, 10], "neg": [22, 23]}),
            (2, {"aff": [8, 9], "neg": [26, 27]}),
            (1, {"aff": [11, 12, 13, 14], "neg": [24, 25, 29, 30]}),
            (0, {"aff": [15], "neg": [28]}),
        ])
        expecteds[3] = OrderedDict([
            (5, {"aff": [1, 2], "neg": [13, 16]}),
            (4, {"aff": [3, 4], "neg": [14, 15]}),
            (3, {"aff": [5, 6, 7, 8, 9], "neg": [17, 18, 19, 23, 24]}),
            (2, {"aff": [], "neg": []}),
            (1, {"aff": [10, 11, 12], "neg": [20, 21, 22]}),
            (0, {"aff": [], "neg": []}),
        ])
        expecteds[4] = OrderedDict([
            (3, {"aff": ["Yale 2", "Stanford 2", "Yale 1"], "neg": ["Columbia 1", "Caltech 1", "Caltech 3"]}),
            (2, {"aff": ["John Hopkins 1", "Stanford 1", "MIT 1", "Stanford 3", "Berkeley 1"], "neg": ["MIT 2", "Chicago 1", "Pennsylvania 1", "Chicago 3", "Princeton 2"]}),
            (1, {"aff": ["Caltech 2", "Cornell 1", "Yale 3", "Princeton 1"], "neg": ["Chicago 2", "Pennsylvania 2", "Harvard 1", "Harvard 2"]}),
            (0, {"aff": [], "neg": []}),
        ])
        self.bracket_resolve_odd("pullup_bottom", expecteds)

    def test_intermediate_brackets_1(self):
        expecteds = dict()
        expecteds[1] = OrderedDict([
            (5,   {"aff": [1], "neg": [14]}),
            (4,   {"aff": [2], "neg": [15]}),
            (3.5, {"aff": [3], "neg": [16]}),
            (3,   {"aff": [4, 5], "neg": [17, 18]}),
            (2.5, {"aff": [6, 7, 8], "neg": [19, 20, 21]}),
            (2,   {"aff": [], "neg": []}),
            (1.5, {"aff": [9, 10], "neg": [22, 23]}),
            (1,   {"aff": [11, 12], "neg": [24, 25]}),
            (0,   {"aff": [13], "neg": [26]}),
        ])
        expecteds[2] = OrderedDict([
            (5,   {"aff": [], "neg": []}),
            (4.5, {"aff": [1, 2], "neg": [16, 17]}),
            (4,   {"aff": [3, 4], "neg": [18, 19]}),
            (3.5, {"aff": [5, 6], "neg": [20, 21]}),
            (3,   {"aff": [7], "neg": [22]}),
            (2.5, {"aff": [8], "neg": [23]}),
            (2,   {"aff": [], "neg": []}),
            (1.5, {"aff": [9, 10], "neg": [24, 25]}),
            (1,   {"aff": [11, 12], "neg": [26, 27]}),
            (0.5, {"aff": [13, 14], "neg": [28, 29]}),
            (0,   {"aff": [15], "neg": [30]}),
        ])
        expecteds[3] = OrderedDict([
            (5,   {"aff": [], "neg": []}),
            (4.5, {"aff": [1, 2], "neg": [13, 14]}),
            (4,   {"aff": [], "neg": []}),
            (3.5, {"aff": [3, 4], "neg": [15, 16]}),
            (3,   {"aff": [], "neg": []}),
            (2.5, {"aff": [5, 6, 7, 8, 9], "neg":[17, 18, 19, 20, 21]}),
            (2,   {"aff": [], "neg": []}),
            (1,   {"aff": [10, 11], "neg": [22, 23]}),
            (0.5, {"aff": [12], "neg": [24]}),
            (0,   {"aff": [], "neg": []}),
        ])
        expecteds[4] = OrderedDict([
            (3,   {"aff": [], "neg": []}),
            (2.5, {"aff": ["Yale 2", "Stanford 2", "Yale 1"], "neg": ["MIT 2", "Columbia 1", "Caltech 1"]}),
            (2,   {"aff": ["John Hopkins 1"], "neg": ["Caltech 3"]}),
            (1.5, {"aff": ["Stanford 1", "MIT 1", "Stanford 3", "Berkeley 1"], "neg": ["Chicago 2", "Chicago 1", "Pennsylvania 1", "Chicago 3"]}),
            (1,   {"aff": ["Caltech 2"], "neg": ["Princeton 2"]}),
            (0.5, {"aff": ["Cornell 1", "Yale 3", "Princeton 1"], "neg": ["Pennsylvania 2", "Harvard 1", "Harvard 2"]}),
            (0,   {"aff": [], "neg": []}),
        ])
        self.bracket_resolve_odd("intermediate1", expecteds)

    def test_intermediate_brackets_2(self):
        expecteds = dict()
        expecteds[1] = OrderedDict([
            (5,   {"aff": [1], "neg": [14]}),
            (4,   {"aff": [2], "neg": [15]}),
            (3.5, {"aff": [3], "neg": [16]}),
            (3,   {"aff": [4, 5], "neg": [17, 18]}),
            (2.5, {"aff": [6, 7, 8], "neg": [19, 20, 21]}),
            (2,   {"aff": [], "neg": []}),
            (1.5, {"aff": [9, 10], "neg": [22, 23]}),
            (1,   {"aff": [11, 12], "neg": [24, 25]}),
            (0,   {"aff": [13], "neg": [26]}),
        ])
        expecteds[2] = OrderedDict([
            (5,   {"aff": [], "neg": []}),
            (4.5, {"aff": [1, 2], "neg": [16, 17]}),
            (4,   {"aff": [3, 4], "neg": [18, 19]}),
            (3.5, {"aff": [5, 6], "neg": [20, 21]}),
            (3,   {"aff": [7], "neg": [22]}),
            (2.5, {"aff": [8], "neg": [23]}),
            (2,   {"aff": [], "neg": []}),
            (1.5, {"aff": [9, 10], "neg": [24, 25]}),
            (1,   {"aff": [11, 12], "neg": [26, 27]}),
            (0.5, {"aff": [13, 14], "neg": [28, 29]}),
            (0,   {"aff": [15], "neg": [30]}),
        ])
        expecteds[3] = OrderedDict([
            (5,      {"aff": [], "neg": []}),
            (4+2./3, {"aff": [1], "neg": [13]}),
            (4+1./3, {"aff": [2], "neg": [14]}),
            (4,      {"aff": [], "neg": []}),
            (3.5,    {"aff": [3, 4], "neg": [15, 16]}),
            (3,      {"aff": [], "neg": []}),
            (2+2./3, {"aff": [5, 6, 7], "neg":[17, 18, 19]}),
            (2+1./3, {"aff": [8, 9], "neg": [20, 21]}),
            (2,      {"aff": [], "neg": []}),
            (1,      {"aff": [10, 11], "neg": [22, 23]}),
            (0.5,    {"aff": [12], "neg": [24]}),
            (0,      {"aff": [], "neg": []}),
        ])
        expecteds[4] = OrderedDict([
            (3,   {"aff": [], "neg": []}),
            (2.5, {"aff": ["Yale 2", "Stanford 2", "Yale 1"], "neg": ["MIT 2", "Columbia 1", "Caltech 1"]}),
            (2,   {"aff": ["John Hopkins 1"], "neg": ["Caltech 3"]}),
            (1.5, {"aff": ["Stanford 1", "MIT 1", "Stanford 3", "Berkeley 1"], "neg": ["Chicago 2", "Chicago 1", "Pennsylvania 1", "Chicago 3"]}),
            (1,   {"aff": ["Caltech 2"], "neg": ["Princeton 2"]}),
            (0.5, {"aff": ["Cornell 1", "Yale 3", "Princeton 1"], "neg": ["Pennsylvania 2", "Harvard 1", "Harvard 2"]}),
            (0,   {"aff": [], "neg": []}),
        ])
        self.maxDiff = None
        self.bracket_resolve_odd("intermediate2", expecteds)

    def test_pullup_random(self):
        for j in range(10):
            # Just doing the third one because it's hardest, too lazy to write
            # random tests for the others.
            b2 = copy.deepcopy(self.brackets[3])
            self.ppd.options["odd_bracket"] = "pullup_random"
            self.ppd.resolve_odd_brackets(b2)

            self.assertEqual(b2[5]["aff"], [1, 2])
            self.assertIn(13, b2[5]["neg"])
            self.assertEqual([i in b2[5]["neg"] for i in [14, 15, 16]].count(True), 1)
            self.assertEqual(b2[4]["aff"], [3, 4])
            self.assertEqual([i in b2[4]["neg"] for i in [14, 15, 16]].count(True), 2)
            self.assertItemsEqual(b2[5]["neg"] + b2[4]["neg"], [13, 14, 15, 16])
            self.assertEqual(b2[3]["aff"], [5, 6, 7, 8, 9])
            self.assertTrue(all(i in b2[3]["neg"] for i in [17, 18, 19]))
            self.assertEqual([i in b2[3]["neg"] for i in [20, 21, 22, 23, 24]].count(True), 2)
            self.assertEqual(b2[2], {"aff": [], "neg": []})
            self.assertEqual(b2[1]["aff"], [10, 11, 12])
            self.assertEqual([i in b2[1]["neg"] for i in [20, 21, 22, 23, 24]].count(True), 3)
            self.assertEqual(b2[0], {"aff": [], "neg": []})
Exemplo n.º 2
0
class TestPowerPairedDrawGeneratorParts(unittest.TestCase):
    """Basic unit test for core functionality of power-paired draws.
    Nowhere near comprehensive."""

    brackets = OrderedDict([
        (4, [1, 2, 3, 4, 5]),
        (3, [6, 7, 8, 9]),
        (2, [10, 11, 12, 13, 14]),
        (1, [15, 16])
    ])

    def setUp(self):
        self.b2 = copy.deepcopy(self.brackets)
        self.ppd = DrawGenerator("power_paired", DUMMY_TEAMS)

    def tearDown(self):
        del self.b2
        del self.ppd

    def bracket_resolve_odd(self, name, expected):
        self.ppd.options["odd_bracket"] = name
        self.ppd.resolve_odd_brackets(self.b2)
        self.assertDictEqual(self.b2, expected)

    def test_pullup_invalid(self):
        brackets = OrderedDict([
            (4, [1, 2, 3, 4, 5]),
            (3, [6, 7, 8]),
            (2, [9, 10, 11, 12, 13]),
            (1, [14, 15])
        ])
        for name in ["pullup_top", "pullup_bottom", "pullup_random", "intermediate"]:
            b2 = copy.deepcopy(brackets)
            self.ppd.options["odd_bracket"] = name
            self.assertRaises(DrawError, self.ppd.resolve_odd_brackets, b2)

    def test_pullup_top(self):
        self.bracket_resolve_odd("pullup_top", OrderedDict([
            (4, [1, 2, 3, 4, 5, 6]),
            (3, [7, 8, 9, 10]),
            (2, [11, 12, 13, 14]),
            (1, [15, 16])
        ]))

    def test_pullup_bottom(self):
        self.bracket_resolve_odd("pullup_bottom", OrderedDict([
            (4, [1, 2, 3, 4, 5, 9]),
            (3, [6, 7, 8, 14]),
            (2, [10, 11, 12, 13]),
            (1, [15, 16])
        ]))

    def test_intermediate_brackets(self):
        self.bracket_resolve_odd("intermediate", OrderedDict([
            (4, [1, 2, 3, 4]),
            (3.5, [5, 6]),
            (3, [7, 8]),
            (2.5, [9, 10]),
            (2, [11, 12, 13, 14]),
            (1, [15, 16])
        ]))

    def test_pullup_random(self):
        for j in range(5):
            b2 = self.b2
            self.ppd.options["odd_bracket"] = "pullup_random"
            self.ppd.resolve_odd_brackets(b2)
            self.assertTrue(all(i in b2[4] for i in [1, 2, 3, 4, 5]))
            self.assertEqual([i in b2[4] for i in [6, 7, 8, 9]].count(True), 1)
            self.assertEqual([i in b2[3] for i in [6, 7, 8, 9]].count(True), 3)
            self.assertEqual([i in b2[3] for i in [10, 11, 12, 13, 14]].count(True), 1)
            self.assertEqual([i in b2[2] for i in [10, 11, 12, 13, 14]].count(True), 4)
            self.assertEqual([15, 16], b2[1])

    def brackets_intermediate_bubble_up_down(self, brackets, expected):
        b2 = copy.deepcopy(brackets)
        expected_team_flags = dict()
        # Set up the brackets
        for p, b in b2.iteritems():
            for i, x in enumerate(b):
                if isinstance(x[-1], str) and len(x) > 2:
                    flags = [x[-1]]
                    x = x[:-1]
                else:
                    flags = None
                if len(x) == 2:
                    t = TestTeam(x[0], x[1], p)
                else:
                    t = TestTeam(x[0], x[1], p, x[2:])
                b[i] = t
                expected_team_flags[t] = flags
        # Run the odd bracket resolution
        self.ppd.options["odd_bracket"] = "intermediate_bubble_up_down"
        self.ppd.resolve_odd_brackets(b2)
        # Check that the brackets are correct
        b3 = dict()
        for p, b in b2.iteritems():
            b3[p] = map(lambda x: x.id, b)
        self.assertDictEqual(b3, expected)
        # Check that the team flags worked
        for team, flags in expected_team_flags.iteritems():
            if team in self.ppd.team_flags:
                self.assertEqual(self.ppd.team_flags[team], flags)
            else:
                self.assertIsNone(flags)

    def test_intermediate_brackets_avoid_conflicts_1(self):
        brackets = OrderedDict([
            (4, [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'A', 'bub_up_accom'), (5, 'C', 12, 'bub_up_inst')]),
            (3, [(6, 'C'), (7, 'D'), (8, 'A', 10), (9, 'B', 10)]),
            (2, [(10, 'D', 8, 9, 'bub_dn_hist'), (11, 'A', 'bub_dn_accom'), (12, 'C', 5), (13, 'B'), (14, 'C', 15)]),
            (1, [(15, 'C', 14), (16, 'C')])
        ])
        expected = OrderedDict([
            (4, [1, 2, 3, 5]),
            (3.5, [4, 6]), # bubble-up (institution)
            (3, [7, 8]),
            (2.5, [9, 11]), # bubble-down (history, history)
            (2, [10, 12, 13, 14]),
            (1, [15, 16])
        ])
        self.brackets_intermediate_bubble_up_down(brackets, expected)

    def test_intermediate_brackets_avoid_conflicts_2(self):
        brackets = OrderedDict([
            (4, [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'A', 'bub_up_accom'), (5, 'C', 12, 'bub_up_inst')]),
            (3, [(6, 'C'), (7, 'D'), (8, 'A', 'bub_up_accom'), (9, 'B', 10, 'bub_up_hist')]),
            (2, [(10, 'D', 9), (11, 'A'), (12, 'C', 5), (13, 'B'), (14, 'C', 15)]),
            (1, [(15, 'C', 14), (16, 'C')])
        ])
        expected = OrderedDict([
            (4, [1, 2, 3, 5]),
            (3.5, [4, 6]), # bubble-up (institution)
            (3, [7, 9]),
            (2.5, [8, 10]), # bubble-up (history)
            (2, [11, 12, 13, 14]),
            (1, [15, 16])
        ])
        self.brackets_intermediate_bubble_up_down(brackets, expected)

    def test_intermediate_brackets_avoid_conflicts_3(self):
        brackets = OrderedDict([
            (4, [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'A', 'bub_up_accom'), (5, 'C', 12, 'bub_up_inst')]),
            (3, [(6, 'C'), (7, 'D'), (8, 'D'), (9, 'B', 10)]),
            (2, [(10, 'D', 9, 'bub_dn_hist'), (11, 'A', 'bub_dn_accom'), (12, 'C', 5), (13, 'B'), (14, 'C', 15)]),
            (1, [(15, 'C', 14), (16, 'C')])
        ])
        expected = OrderedDict([
            (4, [1, 2, 3, 5]),
            (3.5, [4, 6]), # bubble-up (institution)
            (3, [7, 8]),
            (2.5, [9, 11]), # bubble-down (history, institution)
            (2, [10, 12, 13, 14]),
            (1, [15, 16])
        ])
        self.brackets_intermediate_bubble_up_down(brackets, expected)

    def test_intermediate_brackets_avoid_conflicts_none(self):
        brackets = OrderedDict([
            (4, [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'A'), (5, 'C', 12)]),
            (3, [(6, 'B'), (7, 'D'), (8, 'D'), (9, 'B')]),
            (2, [(10, 'D'), (11, 'A'), (12, 'C', 5), (13, 'B'), (14, 'C', 15)]),
            (1, [(15, 'C', 14), (16, 'C')])
        ])
        expected = OrderedDict([
            (4, [1, 2, 3, 4]),
            (3.5, [5, 6]),
            (3, [7, 8]),
            (2.5, [9, 10]),
            (2, [11, 12, 13, 14]),
            (1, [15, 16])
        ])
        self.brackets_intermediate_bubble_up_down(brackets, expected)

    def test_intermediate_brackets_avoid_conflicts_exhaust(self):
        brackets = OrderedDict([
            (4, [(1, 'A'), (2, 'B'), (3, 'C'), (4, 'A', 'bub_up_accom'), (5, 'C', 12, 'bub_up_inst')]),
            (3, [(6, 'C'), (7, 'D'), (8, 'D'), (9, 'B', 10, 'no_bub_updn')]),
            (2, [(10, 'D', 9), (11, 'B'), (12, 'C', 5), (13, 'B'), (14, 'C', 15)]),
            (1, [(15, 'C', 14), (16, 'C')])
        ])
        expected = OrderedDict([
            (4, [1, 2, 3, 5]),
            (3.5, [4, 6]), # bubble-up (institution)
            (3, [7, 8]),
            (2.5, [9, 10]), # no bubble (exhausted)
            (2, [11, 12, 13, 14]),
            (1, [15, 16])
        ])
        self.brackets_intermediate_bubble_up_down(brackets, expected)

    def pairings(self, name, expected):
        ppd = self.ppd
        ppd.options["odd_bracket"] = "pullup_top"
        ppd.options["pairing_method"] = name
        ppd.resolve_odd_brackets(self.b2)
        pairings = ppd.generate_pairings(self.b2)
        pairings_list = list()
        for bracket in pairings.itervalues():
            pairings_list.extend(bracket)
        result = tuple(tuple(p.teams) for p in pairings_list)
        self.assertEqual(result, expected)

    def test_pairings_fold(self):
        self.pairings("fold", (
            (1, 6), (2, 5), (3, 4), (7, 10), (8, 9), (11, 14), (12, 13), (15, 16)
        ))

    def test_pairings_slide(self):
        self.pairings("slide", (
            (1, 4), (2, 5), (3, 6), (7, 9), (8, 10), (11, 13), (12, 14), (15, 16)
        ))


    def one_up_one_down(self, data, expected, **options):
        for option, value in options.iteritems():
            self.ppd.options[option] = value
        pairings = []
        for data1, data2 in data:
            team1 = TestTeam(*data1)
            team2 = TestTeam(*data2)
            pairing = Pairing([team1, team2], None, None)
            pairings.append(pairing)
        pairings_dict = {0: pairings}
        self.ppd.avoid_conflicts(pairings_dict)
        self.assertEqual(len(expected), len(pairings))
        for (exp_teams, exp_flags), pair in zip(expected, pairings):
            self.assertEqual(tuple(t.id for t in pair.teams), exp_teams)
            self.assertEqual(pair.flags, exp_flags)

    @staticmethod
    def _1u1d_no_change(data):
        return [((t1[0], t2[0]), []) for t1, t2 in data]

    def test_no_swap(self):
        data = (((1, 'A'), (5, 'B')),
                ((2, 'C'), (6, 'A')),
                ((3, 'B'), (7, 'D')),
                ((4, 'C'), (8, 'A')))
        expected = self._1u1d_no_change(data)
        self.one_up_one_down(data, expected)

    def test_swap_institution(self):
        data = (((1, 'A'), (5, 'A')),
                ((2, 'C'), (6, 'B')),
                ((3, 'B'), (7, 'D')),
                ((4, 'C'), (8, 'A')))
        expected = [((1, 6), ["1u1d_inst"]),
                    ((2, 5), ["1u1d_other"]),
                    ((3, 7), []),
                    ((4, 8), [])]
        self.one_up_one_down(data, expected)

    def test_no_swap_institution(self):
        data = (((1, 'A'), (5, 'A')),
                ((2, 'C'), (6, 'B')),
                ((3, 'B'), (7, 'D')),
                ((4, 'C'), (8, 'A')))
        expected = self._1u1d_no_change(data)
        self.one_up_one_down(data, expected, avoid_institution=False)

    def test_swap_history(self):
        data = (((1, 'A', None, 5), (5, 'B')),
                ((2, 'C'), (6, 'A')),
                ((3, 'B'), (7, 'D')),
                ((4, 'C'), (8, 'A')))
        expected = [((1, 6), ["1u1d_hist"]),
                    ((2, 5), ["1u1d_other"]),
                    ((3, 7), []),
                    ((4, 8), [])]
        self.one_up_one_down(data, expected)

    def test_no_swap_history(self):
        data = (((1, 'A', None, 5), (5, 'B')),
                ((2, 'C'), (6, 'A')),
                ((3, 'B'), (7, 'D')),
                ((4, 'C'), (8, 'A')))
        expected = self._1u1d_no_change(data)
        self.one_up_one_down(data, expected, avoid_history=False)

    def test_last_swap(self):
        data = (((1, 'A'), (5, 'B')),
                ((2, 'C'), (6, 'A')),
                ((3, 'B'), (7, 'D')),
                ((4, 'C', None, 8), (8, 'A')))
        expected = [((1, 5), []),
                    ((2, 6), []),
                    ((3, 8), ["1u1d_other"]),
                    ((4, 7), ["1u1d_hist"])]
        self.one_up_one_down(data, expected)