from django.test import TestCase
from registration.models import Event, Division, EventLink
from .models import KataBracket
import math
import logging
log = logging.getLogger()
[docs]def make_bracket(n):
e = Event(name="test event", format=Event.EventFormat.kata)
e.save()
b = e.get_format_class(n)()
b.name = "asdf"
b.save()
people = [EventLink(manual_name=chr(ord("a")+i), event=e) for i in range(n)]
for p in people:
p.save()
b.build(people)
return b
[docs]def get_person(bracket, name):
return bracket.get_people().get(manual_name=name)
# Create your tests here.
[docs]class TestKataBracket(TestCase):
[docs] def test_two(self):
b = make_bracket(2)
self.assertIsInstance(b, KataBracket)
# Initial state
rounds = b.kataround_set.all()
self.assertEqual(len(rounds), 1)
self.assertEqual(b.n_round, 1)
winners = b.get_winners()
self.assertEqual(winners, [(1, None), (2, None)])
# First Score
# a - 5 6 7 8 9
# b - ?
m = b.get_next_match()
m.scores = (5, 6, 7, 8, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, None)])
# Second Score
# a - 5 6 7 8 9
# b - 5 7 8 9 10
m = b.get_next_match()
m.scores = (5, 7, 8, 9, 10)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "b")), (2, get_person(b, "a"))])
# Change a so it wins by tie break
# a - 6 7 8 9 10
# b - 5 7 8 9 10
m = b.rounds[0].matches.get(eventlink__manual_name="a")
m.scores = (6, 7, 8, 9, 10)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b"))])
# Tie break
# a - 6 7 8 9 10
# b - 7 7 8 9 9
# ---
# a - ?
# b - ?
m = b.rounds[0].matches.get(eventlink__manual_name="b")
m.scores = (7, 7, 8, 9, 9)
m.save()
self.assertEqual(b.n_round, 2)
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "b"))])
# Second round
# # a - 6 7 8 9 10
# b - 7 7 8 9 9
# ---
# a - 8 9 9 9 9
# b - ?
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.eventlink.manual_name, "a")
m.scores = (8, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b"))])
# Second round
# # a - 6 7 8 9 10
# b - 7 7 8 9 9
# ---
# a - 8 9 9 9 9
# b - 9 9 9 9 9
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.eventlink.manual_name, "b")
m.scores = (9, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "b")), (2, get_person(b, "a"))])
# Done
m = b.get_next_match()
self.assertEqual(m, None)
[docs] def test_six(self):
b = make_bracket(6)
self.assertIsInstance(b, KataBracket)
# Initial state
rounds = b.kataround_set.all()
self.assertEqual(len(rounds), 1)
self.assertEqual(b.n_round, 1)
winners = b.get_winners()
self.assertEqual(winners, [(1, None), (2, None), (3, None)])
# First round
# a - 9 9 9 9 9 - 1
# b - 8 8 8 8 8 - 3
# c - 9 9 9 9 9 - 1
# d - 8 8 8 8 8 - 3
# e - 5 5 5 5 5 - 6
# f - 8 8 8 8 8 - 3
# a
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "a")
m.scores = (9, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, None), (3, None)])
# b
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "b")
m.scores = (8, 8, 8, 8, 8)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b")), (3, None)])
# c
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "c")
m.scores = (9, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c")), (3, get_person(b, "b"))])
# d
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "d")
m.scores = (8, 8, 8, 8, 8)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c")),
(3, get_person(b, "b")), (3, get_person(b, "d"))])
# e
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "e")
m.scores = (5, 5, 5, 5, 5)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c")),
(3, get_person(b, "b")), (3, get_person(b, "d"))])
# f
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "f")
m.scores = (8, 8, 8, 8, 8)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c")),
(3, get_person(b, "b")), (3, get_person(b, "d")), (3, get_person(b, "f"))])
# second round
# a - 9 9 9 9 9 - 1
# b - 8 8 8 8 8 - 3
# c - 9 9 9 9 9 - 1
# d - 8 8 8 8 8 - 3
# e - 5 5 5 5 5 - 6
# f - 8 8 8 8 8 - 3
# ---
# b - 9 9 9 9 9 - 3
# d - 9 9 9 9 9 - 3
# f - 5 5 5 5 5 - 5
# ---
# a - 1 1 0 1 1 - 2
# c - 1 1 1 1 1 - 1
# b
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.eventlink.manual_name, "b")
m.scores = (9, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c")), (3, get_person(b, "b"))])
# d
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.eventlink.manual_name, "d")
m.scores = (9, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c"))
, (3, get_person(b, "b")), (3, get_person(b, "d"))])
# f
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.eventlink.manual_name, "f")
m.scores = (5, 5, 5, 5, 5)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (1, get_person(b, "c")),
(3, get_person(b, "b")), (3, get_person(b, "d"))])
# a
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.round.order, 0)
self.assertEqual(m.eventlink.manual_name, "a")
m.scores = (1, 1, 0, 1, 1)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "c")),
(3, get_person(b, "b")), (3, get_person(b, "d"))])
# c
m = b.get_next_match()
self.assertEqual(m.round.round, 1)
self.assertEqual(m.round.order, 0)
self.assertEqual(m.eventlink.manual_name, "c")
m.scores = (1, 1, 1, 1, 1)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "c")), (2, get_person(b, "a")),
(3, get_person(b, "b")), (3, get_person(b, "d"))])
# third round
# a - 9 9 9 9 9 - 1
# b - 8 8 8 8 8 - 3
# c - 9 9 9 9 9 - 1
# d - 8 8 8 8 8 - 3
# e - 5 5 5 5 5 - 6
# f - 8 8 8 8 8 - 3
# ====
# b - 9 9 9 9 9 - 3
# d - 9 9 9 9 9 - 3
# f - 5 5 5 5 5 - 5
# ---
# a - 1 1 0 1 1 - 2
# c - 1 1 1 1 1 - 1
# ===
# b - 1 2 3 4 5 - 4
# d - 4 5 6 7 8 - 3
# b
m = b.get_next_match()
self.assertEqual(m.round.round, 2)
self.assertEqual(m.round.order, 0)
self.assertEqual(m.eventlink.manual_name, "b")
m.scores = (1, 2, 3, 4, 5)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "c")), (2, get_person(b, "a")),
(3, get_person(b, "b"))])
# d
m = b.get_next_match()
self.assertEqual(m.round.round, 2)
self.assertEqual(m.round.order, 0)
self.assertEqual(m.eventlink.manual_name, "d")
m.scores = (4, 5, 6, 7, 8)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "c")), (2, get_person(b, "a")),
(3, get_person(b, "d"))])
self.assertEqual(b.get_next_match(), None)
[docs] def test_ignorable_tie(self):
b = make_bracket(5)
self.assertIsInstance(b, KataBracket)
# Initial state
rounds = b.kataround_set.all()
self.assertEqual(len(rounds), 1)
self.assertEqual(b.n_round, 1)
winners = b.get_winners()
self.assertEqual(winners, [(1, None), (2, None), (3, None)])
# First round
# a - 9 9 9 9 9 - 1
# b - 8 8 8 8 8 - 2
# c - 7 7 7 7 7 - 3
# d - 6 6 6 6 6 - 4
# e - 6 6 6 6 6 - 4
# a
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "a")
m.scores = (9, 9, 9, 9, 9)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, None), (3, None)])
# b
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "b")
m.scores = (8, 8, 8, 8, 8)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b")), (3, None)])
# c
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "c")
m.scores = (7, 7, 7, 7, 7)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b")), (3, get_person(b, "c"))])
# d
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "d")
m.scores = (6, 6, 6, 6, 6)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b")), (3, get_person(b, "c"))])
# e
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "e")
m.scores = (6, 6, 6, 6, 6)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, get_person(b, "b")), (3, get_person(b, "c"))])
# There should be no second round
m = b.get_next_match()
self.assertEqual(m, None)
[docs] def test_rounding_error(self):
"""Test for an issue where storing scores as floats has round off error and the wrong person wins.
a and d should have the same combined_score but a wins on the tie break. There can be round off error in d's favour.
"""
b = make_bracket(4)
self.assertIsInstance(b, KataBracket)
# Initial state
rounds = b.kataround_set.all()
self.assertEqual(len(rounds), 1)
self.assertEqual(b.n_round, 1)
winners = b.get_winners()
self.assertEqual(winners, [(1, None), (2, None), (3, None)])
# First round
# a - 7.6, 7.5, 7.6, 7.5, 7.6 - 3
# b - 7.7, 7.7, 7.7, 7.7, 7.7 - 1
# c - 7.7, 7.6, 7.6, 7.7, 7.6 - 2
# d - 7.6, 7.6, 7.5, 7.3, 7.6 - 4
# a
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "a")
m.scores = (7.6, 7.5, 7.6, 7.5, 7.6)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "a")), (2, None), (3, None)])
# b
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "b")
m.scores = (7.7, 7.7, 7.7, 7.7, 7.7)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "b")), (2, get_person(b, "a")), (3, None)])
# c
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "c")
m.scores = (7.7, 7.6, 7.6, 7.7, 7.6)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "b")), (2, get_person(b, "c")), (3, get_person(b, "a"))])
# d
m = b.get_next_match()
self.assertEqual(m.round.round, 0)
self.assertEqual(m.eventlink.manual_name, "d")
m.scores = (7.6, 7.6, 7.5, 7.3, 7.6)
m.save()
winners = b.get_winners()
self.assertEqual(winners, [(1, get_person(b, "b")), (2, get_person(b, "c")), (3, get_person(b, "a"))])
# There should be no second round
m = b.get_next_match()
self.assertEqual(m, None)
[docs] def test_rounding_error_postgres(self):
"""Test for an issue where storing scores as floats has round off error and the wrong person wins. Only failed on PostgreSQL.
a and b should have the same combined_score but b wins on the tie
break. With PostgreSQL, the sort was working incorrectly and Django
was incorrectly finding a tie. Seems like they were using slightly
different numbers. Fixed by switching to DecimalField.
"""
scores = (
(8.6, 8.5, 8.6, 8.7, 8.7), # 2
(8.6, 8.6, 8.6, 8.7, 8.7), # 1
(8.6, 8.6, 8.5, 8.4, 8.7), # 3
(1.0, 1.0, 1.0, 1.0, 1.0),
(1.0, 1.0, 1.0, 1.0, 1.0),
)
b = make_bracket(5)
self.assertIsInstance(b, KataBracket)
for score in scores:
m = b.get_next_match()
m.scores =score
m.save()
# There should be no second round
m = b.get_next_match()
self.assertEqual(m, None)
self.assertEqual(b.get_winners(), [(1, get_person(b, "b")), (2, get_person(b, "a")), (3, get_person(b, "c"))])
[docs]class TestKataMatch(TestCase):
[docs] def test_cmp(self):
"""Test that comparisson works properly."""
b = make_bracket(2)
r = b.kataround_set.get()
m1 = r.katamatch_set.all()[0]
m2 = r.katamatch_set.all()[1]
# Comparisson with other object types
self.assertFalse(m1 == 1)
with self.assertRaises(TypeError):
m1 >= 1
with self.assertRaises(TypeError):
m1 <= 1
with self.assertRaises(TypeError):
m1 < 1
with self.assertRaises(TypeError):
m1 < 1
self.assertFalse(1 == m1)
with self.assertRaises(TypeError):
1 >= m2
with self.assertRaises(TypeError):
1 <= m2
with self.assertRaises(TypeError):
1 < m2
with self.assertRaises(TypeError):
1 < m2
# Both not set
self.assertTrue(m1 == m2)
self.assertTrue(m1 >= m2)
self.assertTrue(m1 <= m2)
self.assertFalse(m1 > m2)
self.assertFalse(m1 < m2)
# One set
m1.scores = (5, 6, 7, 8, 9)
m1.save()
self.assertFalse(m1 == m2)
self.assertTrue(m1 >= m2)
self.assertFalse(m1 <= m2)
self.assertTrue(m1 > m2)
self.assertFalse(m1 < m2)
# Two set, clear winner m2
m2.scores = (5, 6, 8, 8, 9)
m2.save()
self.assertFalse(m1 == m2)
self.assertFalse(m1 >= m2)
self.assertTrue(m1 <= m2)
self.assertFalse(m1 > m2)
self.assertTrue(m1 < m2)
# Two set, tie winner m1
m2.scores = (5, 6, 7, 8, 8)
m2.save()
self.assertFalse(m1 == m2)
self.assertTrue(m1 >= m2)
self.assertFalse(m1 <= m2)
self.assertTrue(m1 > m2)
self.assertFalse(m1 < m2)
# Two set, tie
m2.scores = (5, 6, 7, 8, 9)
m2.save()
self.assertTrue(m1 == m2)
self.assertTrue(m1 >= m2)
self.assertTrue(m1 <= m2)
self.assertFalse(m1 > m2)
self.assertFalse(m1 < m2)