From f8f495ca4a7b1e4ce038e02d3920feb1bd46fbbb Mon Sep 17 00:00:00 2001 From: cmccandless Date: Sat, 21 Oct 2017 03:17:15 -0500 Subject: [PATCH] Improve exception tests by making use of Context Managers to resolve #477 --- README.md | 1 + exercises/binary-search/binary_search_test.py | 13 ++++++++----- exercises/binary/binary_test.py | 12 ++++++++---- exercises/meetup/meetup_test.py | 4 ++-- exercises/minesweeper/minesweeper_test.py | 9 ++++++--- exercises/ocr-numbers/ocr_numbers_test.py | 19 +++++++++++-------- .../pythagorean_triplet_test.py | 3 ++- exercises/saddle-points/saddle_points_test.py | 3 ++- exercises/simple-cipher/simple_cipher_test.py | 6 ++++-- exercises/triangle/triangle_test.py | 15 ++++++++++----- exercises/wordy/wordy_test.py | 13 ++++++++----- 11 files changed, 62 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index dbd93dd9..0649d23b 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ A list of missing exercise can be found here: http://exercism.io/languages/pytho - We use minimalistic stub files for all exercises (#272). - We use `unittest` (Python Standard Library) and no 3rd-party-framework. - We use the parameter order `self.assertEqual(actual, expected)` (#440). +- We use context managers (`with self.assertRaises(\):`) for testing for exceptions (#477). ### Testing diff --git a/exercises/binary-search/binary_search_test.py b/exercises/binary-search/binary_search_test.py index 96200e4c..c539d15f 100644 --- a/exercises/binary-search/binary_search_test.py +++ b/exercises/binary-search/binary_search_test.py @@ -27,17 +27,20 @@ class BinarySearchTests(unittest.TestCase): 5) def test_identifies_value_missing(self): - self.assertRaises(ValueError, binary_search, [1, 3, 4, 6, 8, 9, 11], 7) + with self.assertRaises(ValueError): + binary_search([1, 3, 4, 6, 8, 9, 11], 7) def test_value_smaller_than_arrays_minimum(self): - self.assertRaises(ValueError, binary_search, [1, 3, 4, 6, 8, 9, 11], 0) + with self.assertRaises(ValueError): + binary_search([1, 3, 4, 6, 8, 9, 11], 0) def test_value_larger_than_arrays_maximum(self): - self.assertRaises(ValueError, binary_search, [1, 3, 4, 6, 8, 9, 11], - 13) + with self.assertRaises(ValueError): + binary_search([1, 3, 4, 6, 8, 9, 11], 13) def test_empty_array(self): - self.assertRaises(ValueError, binary_search, [], 1) + with self.assertRaises(ValueError): + binary_search([], 1) if __name__ == '__main__': diff --git a/exercises/binary/binary_test.py b/exercises/binary/binary_test.py index 8254d7b5..28ce8fcd 100644 --- a/exercises/binary/binary_test.py +++ b/exercises/binary/binary_test.py @@ -32,16 +32,20 @@ class BinaryTests(unittest.TestCase): self.assertEqual(parse_binary("10001101000"), 1128) def test_invalid_binary_text_only(self): - self.assertRaises(ValueError, parse_binary, "carrot") + with self.assertRaises(ValueError): + parse_binary("carrot") def test_invalid_binary_number_not_base2(self): - self.assertRaises(ValueError, parse_binary, "102011") + with self.assertRaises(ValueError): + parse_binary("102011") def test_invalid_binary_numbers_with_text(self): - self.assertRaises(ValueError, parse_binary, "10nope") + with self.assertRaises(ValueError): + parse_binary("10nope") def test_invalid_binary_text_with_numbers(self): - self.assertRaises(ValueError, parse_binary, "nope10") + with self.assertRaises(ValueError): + parse_binary("nope10") if __name__ == '__main__': diff --git a/exercises/meetup/meetup_test.py b/exercises/meetup/meetup_test.py index eb01a4bc..4455bb8f 100644 --- a/exercises/meetup/meetup_test.py +++ b/exercises/meetup/meetup_test.py @@ -399,8 +399,8 @@ class MeetupTest(unittest.TestCase): meetup_day(2015, 3, 'Monday', '5th'), date(2015, 3, 30)) def test_nonexistent_fifth_monday_of_february_2015(self): - self.assertRaises(MeetupDayException, meetup_day, 2015, 2, 'Monday', - '5th') + with self.assertRaises(MeetupDayException): + meetup_day(2015, 2, 'Monday', '5th') if __name__ == '__main__': diff --git a/exercises/minesweeper/minesweeper_test.py b/exercises/minesweeper/minesweeper_test.py index f3518f3c..542944bd 100644 --- a/exercises/minesweeper/minesweeper_test.py +++ b/exercises/minesweeper/minesweeper_test.py @@ -141,19 +141,22 @@ class MinesweeperTest(unittest.TestCase): "|* |", "| |", "+-+"] - self.assertRaises(ValueError, board, inp) + with self.assertRaises(ValueError): + board(inp) def test_faulty_border(self): inp = ["+-----+", "* * |", "+-- --+"] - self.assertRaises(ValueError, board, inp) + with self.assertRaises(ValueError): + board(inp) def test_invalid_char(self): inp = ["+-----+", "|X * |", "+-----+"] - self.assertRaises(ValueError, board, inp) + with self.assertRaises(ValueError): + board(inp) if __name__ == '__main__': diff --git a/exercises/ocr-numbers/ocr_numbers_test.py b/exercises/ocr-numbers/ocr_numbers_test.py index 1fae0d10..2be89357 100644 --- a/exercises/ocr-numbers/ocr_numbers_test.py +++ b/exercises/ocr-numbers/ocr_numbers_test.py @@ -43,15 +43,17 @@ class OcrTest(unittest.TestCase): " "]), '?') def test_too_short_row(self): - self.assertRaises(ValueError, number, [" ", - " _|", - " |", - " "]) + with self.assertRaises(ValueError): + number([" ", + " _|", + " |", + " "]) def test_insufficient_rows(self): - self.assertRaises(ValueError, number, [" ", - " _|", - " X|"]) + with self.assertRaises(ValueError): + number([" ", + " _|", + " X|"]) def test_grid0(self): self.assertEqual(grid('0'), [" _ ", @@ -114,7 +116,8 @@ class OcrTest(unittest.TestCase): ]) def test_invalid_grid(self): - self.assertRaises(ValueError, grid, '123a') + with self.assertRaises(ValueError): + grid('123a') if __name__ == '__main__': diff --git a/exercises/pythagorean-triplet/pythagorean_triplet_test.py b/exercises/pythagorean-triplet/pythagorean_triplet_test.py index 4d9b29d1..3c46fa5b 100644 --- a/exercises/pythagorean-triplet/pythagorean_triplet_test.py +++ b/exercises/pythagorean-triplet/pythagorean_triplet_test.py @@ -80,7 +80,8 @@ class PythagoreanTripletTest(unittest.TestCase): self.assertIs(is_triplet((924, 43, 925)), True) def test_odd_number(self): - self.assertRaises(ValueError, primitive_triplets, 5) + with self.assertRaises(ValueError): + primitive_triplets(5) if __name__ == '__main__': diff --git a/exercises/saddle-points/saddle_points_test.py b/exercises/saddle-points/saddle_points_test.py index 2579b054..065b24de 100644 --- a/exercises/saddle-points/saddle_points_test.py +++ b/exercises/saddle-points/saddle_points_test.py @@ -28,7 +28,8 @@ class SaddlePointTest(unittest.TestCase): def test_irregular_matrix(self): inp = [[3, 2, 1], [0, 1], [2, 1, 0]] - self.assertRaises(ValueError, saddle_points, inp) + with self.assertRaises(ValueError): + saddle_points(inp) if __name__ == '__main__': diff --git a/exercises/simple-cipher/simple_cipher_test.py b/exercises/simple-cipher/simple_cipher_test.py index fb0d51f9..d61cbc71 100644 --- a/exercises/simple-cipher/simple_cipher_test.py +++ b/exercises/simple-cipher/simple_cipher_test.py @@ -68,8 +68,10 @@ class CipherTest(unittest.TestCase): 'All items in the key must be chars and lowercase!') def test_cipher_wrong_key(self): - self.assertRaises(ValueError, Cipher, 'a1cde') - self.assertRaises(ValueError, Cipher, 'aBcde') + with self.assertRaises(ValueError): + Cipher('a1cde') + with self.assertRaises(ValueError): + Cipher('aBcde') if __name__ == '__main__': diff --git a/exercises/triangle/triangle_test.py b/exercises/triangle/triangle_test.py index 6566744f..38d0ba42 100644 --- a/exercises/triangle/triangle_test.py +++ b/exercises/triangle/triangle_test.py @@ -34,19 +34,24 @@ class TriangleTests(unittest.TestCase): self.assertEqual(Triangle(0.4, 0.6, 0.3).kind(), "scalene") def test_triangles_with_no_size_are_illegal(self): - self.assertRaises(TriangleError, Triangle, 0, 0, 0) + with self.assertRaises(TriangleError): + Triangle(0, 0, 0) def test_triangles_with_negative_sides_are_illegal(self): - self.assertRaises(TriangleError, Triangle, 3, 4, -5) + with self.assertRaises(TriangleError): + Triangle(3, 4, -5) def test_triangles_violating_triangle_inequality_are_illegal(self): - self.assertRaises(TriangleError, Triangle, 1, 1, 3) + with self.assertRaises(TriangleError): + Triangle(1, 1, 3) def test_triangles_violating_triangle_inequality_are_illegal_2(self): - self.assertRaises(TriangleError, Triangle, 2, 4, 2) + with self.assertRaises(TriangleError): + Triangle(2, 4, 2) def test_triangles_violating_triangle_inequality_are_illegal_3(self): - self.assertRaises(TriangleError, Triangle, 7, 3, 2) + with self.assertRaises(TriangleError): + Triangle(7, 3, 2) if __name__ == '__main__': diff --git a/exercises/wordy/wordy_test.py b/exercises/wordy/wordy_test.py index c35fe385..588f1904 100644 --- a/exercises/wordy/wordy_test.py +++ b/exercises/wordy/wordy_test.py @@ -49,17 +49,20 @@ class WordyTest(unittest.TestCase): calculate("What is -12000 divided by 25 divided by -30?"), 16) def test_invalid_operation(self): - self.assertRaises(ValueError, calculate, "What is 4 xor 7?") + with self.assertRaises(ValueError): + calculate("What is 4 xor 7?") def test_missing_operation(self): - self.assertRaises(ValueError, calculate, "What is 2 2 minus 3?") + with self.assertRaises(ValueError): + calculate("What is 2 2 minus 3?") def test_missing_number(self): - self.assertRaises(ValueError, calculate, - "What is 7 plus multiplied by -2?") + with self.assertRaises(ValueError): + calculate("What is 7 plus multiplied by -2?") def test_irrelevant_question(self): - self.assertRaises(ValueError, calculate, "Which is greater, 3 or 2?") + with self.assertRaises(ValueError): + calculate("Which is greater, 3 or 2?") if __name__ == '__main__':