From 85861ea78311419419156340270a5739018ae0cc Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Mon, 8 May 2017 17:20:33 -0400 Subject: [PATCH 1/3] bpo-30308: Code coverage for argument in random.shuffle --- Lib/test/test_random.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 48077fb5dbcc02..d6f309dd4f6efd 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -8,6 +8,11 @@ from math import log, exp, pi, fsum, sin, factorial from test import support from fractions import Fraction +try: + from secrets import randbelow as secrets_randbelow +except ImportError: + secrets_randbelow = partial(random.uniform, 0.0) + class TestBasicOps: # Superclass with tests common to all generators. @@ -88,6 +93,33 @@ def test_shuffle(self): self.assertTrue(lst != shuffled_lst) shuffle(lst) self.assertTrue(lst != shuffled_lst) + self.assertRaises(TypeError, shuffle, (1, 2, 3)) + self.assertRaises(TypeError, shuffle, {1, 2, 3}) + self.assertRaises(TypeError, shuffle, 'shuffle') + self.assertRaises(KeyError, shuffle, dict(a=1, b=2)) + + def test_shuffle_random_argument(self): + # Test random argument. + shuffle = self.gen.shuffle + seq = list(range(10)) + shuffled_seq = list(range(10)) + shuffle(shuffled_seq, random=partial(secrets_randbelow, 1)) + self.assertEqual(len(seq), len(shuffled_seq)) + self.assertEqual(set(seq), set(shuffled_seq)) + self.assertRaises(IndexError, shuffle, seq, random=lambda: 1.0) + # The docs state that the random argument should be a function + # that returns a float in the range [0, 1). However, the negative + # values to over -1.0 currently work. + seq = bytearray(b'abcdefghijk') + shuffle(seq, random=lambda: -1.0) + self.assertEqual(seq, b'kbcdefghija') + self.assertRaises(IndexError, shuffle, seq, random=lambda: -1.1) + self.assertRaises(TypeError, shuffle, seq, random=lambda x: x) + # Interesting result + seq = dict(zip(range(9), 'abcdefghi')) + shuffle(seq, lambda: 0.5) + self.assertEqual(seq, {0: 'a', 1: 'f', 2: 'b', 3: 'h', 4: 'c', 5: 'g', + 6: 'd', 7: 'i', 8: 'e'}) def test_choice(self): choice = self.gen.choice From 3589c8b740558c8e4df3d58cb72e32b5b11cb6ef Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Tue, 9 May 2017 19:04:14 -0400 Subject: [PATCH 2/3] bpo-30308: Code coverage for argument in random.shuffle --- Lib/test/test_random.py | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index d6f309dd4f6efd..07984e2c1248a4 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -8,10 +8,6 @@ from math import log, exp, pi, fsum, sin, factorial from test import support from fractions import Fraction -try: - from secrets import randbelow as secrets_randbelow -except ImportError: - secrets_randbelow = partial(random.uniform, 0.0) class TestBasicOps: @@ -55,7 +51,7 @@ def __hash__(self): @unittest.mock.patch('random._urandom') # os.urandom def test_seed_when_randomness_source_not_found(self, urandom_mock): # Random.seed() uses time.time() when an operating system specific - # randomness source is not found. To test this on machines were it + # randomness source is not found. To test this on machines where it # exists, run the above test, test_seedargs(), again after mocking # os.urandom() so that it raises the exception expected when the # randomness source is not available. @@ -98,28 +94,20 @@ def test_shuffle(self): self.assertRaises(TypeError, shuffle, 'shuffle') self.assertRaises(KeyError, shuffle, dict(a=1, b=2)) + @unittest.expectedFailure + def test_shuffle_dict_with_numeric_keys(self): + shuffle = self.gen.shuffle + seq = dict(zip(range(9), 'abcdefghi')) + self.assertRaises(KeyError, shuffle, seq) + def test_shuffle_random_argument(self): - # Test random argument. + # Test random argument to shuffle. shuffle = self.gen.shuffle - seq = list(range(10)) - shuffled_seq = list(range(10)) - shuffle(shuffled_seq, random=partial(secrets_randbelow, 1)) - self.assertEqual(len(seq), len(shuffled_seq)) - self.assertEqual(set(seq), set(shuffled_seq)) - self.assertRaises(IndexError, shuffle, seq, random=lambda: 1.0) - # The docs state that the random argument should be a function - # that returns a float in the range [0, 1). However, the negative - # values to over -1.0 currently work. + mock_random = unittest.mock.Mock(return_value=0.5) seq = bytearray(b'abcdefghijk') - shuffle(seq, random=lambda: -1.0) - self.assertEqual(seq, b'kbcdefghija') - self.assertRaises(IndexError, shuffle, seq, random=lambda: -1.1) - self.assertRaises(TypeError, shuffle, seq, random=lambda x: x) - # Interesting result - seq = dict(zip(range(9), 'abcdefghi')) - shuffle(seq, lambda: 0.5) - self.assertEqual(seq, {0: 'a', 1: 'f', 2: 'b', 3: 'h', 4: 'c', 5: 'g', - 6: 'd', 7: 'i', 8: 'e'}) + shuffle(seq, mock_random) + self.assertEqual(seq, b'ajbhcgdiekf') + mock_random.assert_called_with() def test_choice(self): choice = self.gen.choice From 4b8698bf32c6b6ee86e52feb04e45a6b454793c9 Mon Sep 17 00:00:00 2001 From: Cheryl Sabella Date: Wed, 10 May 2017 05:18:35 -0400 Subject: [PATCH 3/3] bpo-30308: Code coverage for argument in random.shuffle --- Lib/test/test_random.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 07984e2c1248a4..45468c7ce49041 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -90,15 +90,6 @@ def test_shuffle(self): shuffle(lst) self.assertTrue(lst != shuffled_lst) self.assertRaises(TypeError, shuffle, (1, 2, 3)) - self.assertRaises(TypeError, shuffle, {1, 2, 3}) - self.assertRaises(TypeError, shuffle, 'shuffle') - self.assertRaises(KeyError, shuffle, dict(a=1, b=2)) - - @unittest.expectedFailure - def test_shuffle_dict_with_numeric_keys(self): - shuffle = self.gen.shuffle - seq = dict(zip(range(9), 'abcdefghi')) - self.assertRaises(KeyError, shuffle, seq) def test_shuffle_random_argument(self): # Test random argument to shuffle. @@ -106,7 +97,6 @@ def test_shuffle_random_argument(self): mock_random = unittest.mock.Mock(return_value=0.5) seq = bytearray(b'abcdefghijk') shuffle(seq, mock_random) - self.assertEqual(seq, b'ajbhcgdiekf') mock_random.assert_called_with() def test_choice(self):