test_shuffler.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from unittest import mock
  2. from django.test import SimpleTestCase
  3. from django.test.runner import Shuffler
  4. class ShufflerTests(SimpleTestCase):
  5. def test_hash_text(self):
  6. actual = Shuffler._hash_text('abcd')
  7. self.assertEqual(actual, 'e2fc714c4727ee9395f324cd2e7f331f')
  8. def test_hash_text_hash_algorithm(self):
  9. class MyShuffler(Shuffler):
  10. hash_algorithm = 'sha1'
  11. actual = MyShuffler._hash_text('abcd')
  12. self.assertEqual(actual, '81fe8bfe87576c3ecb22426f8e57847382917acf')
  13. def test_init(self):
  14. shuffler = Shuffler(100)
  15. self.assertEqual(shuffler.seed, 100)
  16. self.assertEqual(shuffler.seed_source, 'given')
  17. def test_init_none_seed(self):
  18. with mock.patch('random.randint', return_value=200):
  19. shuffler = Shuffler(None)
  20. self.assertEqual(shuffler.seed, 200)
  21. self.assertEqual(shuffler.seed_source, 'generated')
  22. def test_init_no_seed_argument(self):
  23. with mock.patch('random.randint', return_value=300):
  24. shuffler = Shuffler()
  25. self.assertEqual(shuffler.seed, 300)
  26. self.assertEqual(shuffler.seed_source, 'generated')
  27. def test_seed_display(self):
  28. shuffler = Shuffler(100)
  29. shuffler.seed_source = 'test'
  30. self.assertEqual(shuffler.seed_display, '100 (test)')
  31. def test_hash_item_seed(self):
  32. cases = [
  33. (1234, '64ad3fb166ddb41a2ca24f1803b8b722'),
  34. # Passing a string gives the same value.
  35. ('1234', '64ad3fb166ddb41a2ca24f1803b8b722'),
  36. (5678, '4dde450ad339b6ce45a0a2666e35b975'),
  37. ]
  38. for seed, expected in cases:
  39. with self.subTest(seed=seed):
  40. shuffler = Shuffler(seed=seed)
  41. actual = shuffler._hash_item('abc', lambda x: x)
  42. self.assertEqual(actual, expected)
  43. def test_hash_item_key(self):
  44. cases = [
  45. (lambda x: x, '64ad3fb166ddb41a2ca24f1803b8b722'),
  46. (lambda x: x.upper(), 'ee22e8597bff91742affe4befbf4649a'),
  47. ]
  48. for key, expected in cases:
  49. with self.subTest(key=key):
  50. shuffler = Shuffler(seed=1234)
  51. actual = shuffler._hash_item('abc', key)
  52. self.assertEqual(actual, expected)
  53. def test_shuffle_key(self):
  54. cases = [
  55. (lambda x: x, ['a', 'd', 'b', 'c']),
  56. (lambda x: x.upper(), ['d', 'c', 'a', 'b']),
  57. ]
  58. for num, (key, expected) in enumerate(cases, start=1):
  59. with self.subTest(num=num):
  60. shuffler = Shuffler(seed=1234)
  61. actual = shuffler.shuffle(['a', 'b', 'c', 'd'], key)
  62. self.assertEqual(actual, expected)
  63. def test_shuffle_consistency(self):
  64. seq = [str(n) for n in range(5)]
  65. cases = [
  66. (None, ['3', '0', '2', '4', '1']),
  67. (0, ['3', '2', '4', '1']),
  68. (1, ['3', '0', '2', '4']),
  69. (2, ['3', '0', '4', '1']),
  70. (3, ['0', '2', '4', '1']),
  71. (4, ['3', '0', '2', '1']),
  72. ]
  73. shuffler = Shuffler(seed=1234)
  74. for index, expected in cases:
  75. with self.subTest(index=index):
  76. if index is None:
  77. new_seq = seq
  78. else:
  79. new_seq = seq.copy()
  80. del new_seq[index]
  81. actual = shuffler.shuffle(new_seq, lambda x: x)
  82. self.assertEqual(actual, expected)
  83. def test_shuffle_same_hash(self):
  84. shuffler = Shuffler(seed=1234)
  85. msg = "item 'A' has same hash 'a56ce89262959e151ee2266552f1819c' as item 'a'"
  86. with self.assertRaisesMessage(RuntimeError, msg):
  87. shuffler.shuffle(['a', 'b', 'A'], lambda x: x.upper())