1import unittest
2from unittest.mock import mock_open, patch
3
4from bangaranga import does_the_banga_rang, TheBangaDoesNotRangError
5
6
7class DoesTheBangaRangTests(unittest.TestCase):
8 def assert_banga_result(self, file_content, expected_result):
9 with patch("builtins.open", mock_open(read_data=file_content)):
10 result = does_the_banga_rang("some-file.txt")
11 self.assertEqual(result, expected_result)
12
13 def test_forms_target_from_a_single_whole_word(self):
14 self.assert_banga_result("bangaranga", 1)
15
16 def test_forms_target_from_multiple_words_in_file_order_while_ignoring_irrelevant_words(self):
17 self.assert_banga_result("banga the ranga", 2)
18
19 def test_requires_matching_words_to_follow_file_order(self):
20 self.assert_banga_result("ranga banga", 0)
21
22 def test_returns_minimum_number_of_words_when_multiple_sequences_match(self):
23 self.assert_banga_result("bang a banga ranga bangaranga", 1)
24
25 def test_matches_words_case_insensitively(self):
26 self.assert_banga_result("BANGA something RANGA", 2)
27
28 def test_does_not_use_partial_word_matches(self):
29 self.assert_banga_result("xxbangaranga", 0)
30
31 def test_returns_zero_when_no_matching_sequence_exists(self):
32 self.assert_banga_result("Does the banga rang?", 0)
33
34 def test_raises_custom_error_when_file_cannot_be_read(self):
35 with patch("builtins.open", side_effect=OSError):
36 with self.assertRaises(TheBangaDoesNotRangError):
37 does_the_banga_rang("missing-file.txt")
38
39
40if __name__ == "__main__":
41 unittest.main()
..........
----------------------------------------------------------------------
Ran 10 tests in 0.221s
OK