Eine Menge Aufräumarbeiten.

* Eine Testsuite um Mahrjong Ranking Berechnungen zu testen
* Erste Arbeiten um die Workarounds aus dem "utils" Paket los zu werden.
* Vieles am Code umformatiert für PEP8 conformität
This commit is contained in:
2017-06-07 13:25:30 +02:00
parent cf0bbb4c8f
commit a26a91c360
93 changed files with 33531 additions and 2737 deletions

View File

@@ -4,14 +4,101 @@ when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
import random
from django.test import TestCase
from mahjong_ranking.models import Hanchan, KyuDanRanking
class SimpleTest(TestCase):
class KyuDanTest(TestCase):
"""
Unittest to check if the hanchan calculation works against the rulebook.
"""
equal_attrs = ('dan', 'dan_points', 'kyu', 'kyu_points', 'good_hanchans',
'won_hanchans', 'hanchan_count')
def test_basic_addition(self):
fixtures = [
'test_membership.json',
'test_events.json',
'test_hanchans.json',
'test_event_rankings.json',
'test_kyu_dan_rankings.json'
]
def recalc(self):
"""
Tests that 1 + 1 always equals 2.
Test if a Kyu/Dan Ranking recalculation gives the same result as stored.
:return:
"""
self.assertEqual(1 + 1, 2)
for ranking in KyuDanRanking.objects.all():
original = {a: getattr(ranking, a) for a in self.equal_attrs}
ranking.recalculate()
for attr in self.equal_attrs:
self.assertEqual(
original[attr],
getattr(ranking, attr),
"Recalculation was different! user: {user}, attribute: "
"{attr}, original: {original}, recalc: {recalc}".format(
user=ranking.user, attr=attr, original=original[attr],
recalc=getattr(ranking, attr))
)
def test_partial_recalc(self):
"""
Test if partial recalclulation gives the same results.
:return:
"""
for ranking in KyuDanRanking.objects.all():
original = {a: getattr(ranking, a) for a in self.equal_attrs}
confirmed_hanchans = Hanchan.objects.confirmed_hanchans(
user=ranking.user,
since=ranking.legacy_date
)
rnd = random.randrange(confirmed_hanchans.count())
since = confirmed_hanchans[rnd].start
print(since)
ranking.recalculate(hanchan_start=since)
for attr in self.equal_attrs:
self.assertEqual(
original[attr],
getattr(ranking, attr),
"partial Recalculation was different! user: {user}, "
"attribute: {attr}, original: {original}, recalc: "
"{recalc}".format(
user=ranking.user, attr=attr, original=original[attr],
recalc=getattr(ranking, attr))
)
def test_points_sum(self):
"""
Test if the sum of the kyu / dan points equals the value in the Ranking.
:return: None
"""
for ranking in KyuDanRanking.objects.all():
dan_kyu = 'dan_points' if ranking.dan else 'kyu_points'
points = {
'dan_points': ranking.legacy_dan_points or 0,
'kyu_points': ranking.legacy_kyu_points or 0
}
confirmed_hanchans = Hanchan.objects.confirmed_hanchans(
user=ranking.user,
since=ranking.legacy_date
)
for hanchan in confirmed_hanchans:
hanchan.get_playerdata(ranking.user)
points[dan_kyu] += getattr(hanchan, dan_kyu) or 0
self.assertEqual(
points[dan_kyu],
getattr(ranking, dan_kyu),
"{dan_kyu} for {player} won't compute! ranking: {ranking}, sum: {sum}".format(
dan_kyu=dan_kyu, player=ranking.user,
ranking=getattr(ranking, dan_kyu), sum=points[dan_kyu])
)