# HG changeset patch # User Laman # Date 2021-10-14 18:07:25 # Node ID 6644c5267fb5f805588463da43fb9d15e4386a51 # Parent d908ea134adb7ee3c081d7537f843bff7e751570 added tests diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -1,1 +1,2 @@ .idea/ +__pycache__/ diff --git a/rank_progress.py b/rank_progress.py --- a/rank_progress.py +++ b/rank_progress.py @@ -36,6 +36,7 @@ class Record: class RankTracker: def __init__(self, rating): + assert rating >= -900 self._rounded_rating = round_rating(rating) @property @@ -43,22 +44,24 @@ class RankTracker: return rating_to_rank(self._rounded_rating) def update(self, rating): + assert rating >= -900 rounded_rating = round_rating(rating) + old_rank = self.rank if rounded_rating == self._rounded_rating: - return False + pass elif rounded_rating > self._rounded_rating: # promotion self._rounded_rating = rounded_rating - return self.rank else: # demotion - if rounded_rating >= 1500 and self._rounded_rating - rating > 100: + if self._rounded_rating >= 1600 and self._rounded_rating - rating > 100: self._rounded_rating = rounded_rating - return self.rank elif self._rounded_rating - rating > 150: self._rounded_rating = rounded_rating+100 - return self.rank else: - return False + pass + + new_rank = self.rank + return new_rank if new_rank != old_rank else False def parse_record(record): diff --git a/test.py b/test.py new file mode 100644 --- /dev/null +++ b/test.py @@ -0,0 +1,54 @@ +from unittest import TestCase + +from rank_progress import RankTracker + + +class TestRankTracker(TestCase): + def test_no_change(self): + t = RankTracker(1945) # 2k + for r in [1945, 1949, 1900, 1850]: + self.assertFalse(t.update(r), r) + + def test_promotion(self): + # basic + t = RankTracker(1945) + for (rating, rank) in [(1950, "1k"), (1945, False), (2000, False), (2049, False), (2051, "1d")]: + self.assertEqual(t.update(rating), rank, (rating, rank)) + + # 2+ ranks leaps + + # limited when pushing the personal best + self.skipTest("not yet implemented") + t = RankTracker(1100) + self.assertEqual(t.update(1299), "9k") + self.assertEqual(t.update(1250), "8k") + self.assertEqual(t.update(1500), "6k") + + # regular below the personal best + t = RankTracker(1201) # 9k + t.update(1000) + t.update(900) + t.update(849) # 11k + self.assertEqual(t.update(1250), "8k") + + def test_demotion(self): + t = RankTracker(2069) + self.assertEqual(t.update(1995), "1k") + + t = RankTracker(1590) + self.assertEqual(t.update(1387), "7k") + + t = RankTracker(1087) + self.assertFalse(t.update(995)) + self.assertEqual(t.update(940), "11k") + + def test_edges_cases(self): + t = RankTracker(-900) + self.assertEqual(t.rank, "30k") + with self.assertRaises(AssertionError): + t.update(-901) + + t = RankTracker(2700) + self.assertEqual(t.rank, "7d") + self.assertFalse(t.update(2750)) + self.assertFalse(t.update(2800))