summaryrefslogtreecommitdiff
path: root/tests/test_runner/test_shuffler.py
blob: c6ecee5cb0d6ea87fdc3faa2c15b3b2747ac81bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from unittest import mock

from django.test import SimpleTestCase
from django.test.runner import Shuffler


class ShufflerTests(SimpleTestCase):
    def test_hash_text(self):
        actual = Shuffler._hash_text("abcd")
        self.assertEqual(actual, "e2fc714c4727ee9395f324cd2e7f331f")

    def test_hash_text_hash_algorithm(self):
        class MyShuffler(Shuffler):
            hash_algorithm = "sha1"

        actual = MyShuffler._hash_text("abcd")
        self.assertEqual(actual, "81fe8bfe87576c3ecb22426f8e57847382917acf")

    def test_init(self):
        shuffler = Shuffler(100)
        self.assertEqual(shuffler.seed, 100)
        self.assertEqual(shuffler.seed_source, "given")

    def test_init_none_seed(self):
        with mock.patch("random.randint", return_value=200):
            shuffler = Shuffler(None)
        self.assertEqual(shuffler.seed, 200)
        self.assertEqual(shuffler.seed_source, "generated")

    def test_init_no_seed_argument(self):
        with mock.patch("random.randint", return_value=300):
            shuffler = Shuffler()
        self.assertEqual(shuffler.seed, 300)
        self.assertEqual(shuffler.seed_source, "generated")

    def test_seed_display(self):
        shuffler = Shuffler(100)
        shuffler.seed_source = "test"
        self.assertEqual(shuffler.seed_display, "100 (test)")

    def test_hash_item_seed(self):
        cases = [
            (1234, "64ad3fb166ddb41a2ca24f1803b8b722"),
            # Passing a string gives the same value.
            ("1234", "64ad3fb166ddb41a2ca24f1803b8b722"),
            (5678, "4dde450ad339b6ce45a0a2666e35b975"),
        ]
        for seed, expected in cases:
            with self.subTest(seed=seed):
                shuffler = Shuffler(seed=seed)
                actual = shuffler._hash_item("abc", lambda x: x)
                self.assertEqual(actual, expected)

    def test_hash_item_key(self):
        cases = [
            (lambda x: x, "64ad3fb166ddb41a2ca24f1803b8b722"),
            (lambda x: x.upper(), "ee22e8597bff91742affe4befbf4649a"),
        ]
        for key, expected in cases:
            with self.subTest(key=key):
                shuffler = Shuffler(seed=1234)
                actual = shuffler._hash_item("abc", key)
                self.assertEqual(actual, expected)

    def test_shuffle_key(self):
        cases = [
            (lambda x: x, ["a", "d", "b", "c"]),
            (lambda x: x.upper(), ["d", "c", "a", "b"]),
        ]
        for num, (key, expected) in enumerate(cases, start=1):
            with self.subTest(num=num):
                shuffler = Shuffler(seed=1234)
                actual = shuffler.shuffle(["a", "b", "c", "d"], key)
                self.assertEqual(actual, expected)

    def test_shuffle_consistency(self):
        seq = [str(n) for n in range(5)]
        cases = [
            (None, ["3", "0", "2", "4", "1"]),
            (0, ["3", "2", "4", "1"]),
            (1, ["3", "0", "2", "4"]),
            (2, ["3", "0", "4", "1"]),
            (3, ["0", "2", "4", "1"]),
            (4, ["3", "0", "2", "1"]),
        ]
        shuffler = Shuffler(seed=1234)
        for index, expected in cases:
            with self.subTest(index=index):
                if index is None:
                    new_seq = seq
                else:
                    new_seq = seq.copy()
                    del new_seq[index]
                actual = shuffler.shuffle(new_seq, lambda x: x)
                self.assertEqual(actual, expected)

    def test_shuffle_same_hash(self):
        shuffler = Shuffler(seed=1234)
        msg = "item 'A' has same hash 'a56ce89262959e151ee2266552f1819c' as item 'a'"
        with self.assertRaisesMessage(RuntimeError, msg):
            shuffler.shuffle(["a", "b", "A"], lambda x: x.upper())