From 1c29c35e4d3b18f1ed63f6792760d6b78dde37e9 Mon Sep 17 00:00:00 2001 From: Joakim Persson Date: Fri, 12 Jul 2024 16:59:21 +0200 Subject: [PATCH] Hanterar felaktiga indata samt testar detta --- hanoi/hanoi.py | 28 ++++++++------ hanoi/unittest_hanoi.py | 81 +++++++++++++++++++++-------------------- 2 files changed, 57 insertions(+), 52 deletions(-) diff --git a/hanoi/hanoi.py b/hanoi/hanoi.py index 9d922c3..a621dfb 100644 --- a/hanoi/hanoi.py +++ b/hanoi/hanoi.py @@ -1,6 +1,7 @@ -import io def hanoi(n, source, auxiliary, target): + # Example usage: + # hanoi(3, 'A', 'B', 'C') if n < 1: print(f"No disks, nothing to do") return @@ -14,16 +15,19 @@ def hanoi(n, source, auxiliary, target): # Move the n-1 disks that we left on auxiliary to target hanoi(n - 1, auxiliary, source, target) -# Example usage: -# hanoi(3, 'A', 'B', 'C') +def get_hanoi_input(): + # Returns a positive integer, otherwise throws an exception + while True: + user_input = input("Please enter an integer: ") + try: + user_integer = int(user_input) + return user_integer + except ValueError: + print("That's not a valid integer. Please try again.") if __name__== "__main__": - user_input = input("Please enter an integer: ") - try: - user_integer = int(user_input) - print(f"You entered the integer: {user_integer}") - except ValueError: - print("That's not a valid integer. Please try again.") - - hanoi(user_integer,'A','B','C') - + # Call the new function to get the input + user_integer = get_hanoi_input() + # Now call hanoi with the obtained integer + hanoi(user_integer, 'A', 'B', 'C') + \ No newline at end of file diff --git a/hanoi/unittest_hanoi.py b/hanoi/unittest_hanoi.py index 03418e2..72d1da9 100644 --- a/hanoi/unittest_hanoi.py +++ b/hanoi/unittest_hanoi.py @@ -1,46 +1,47 @@ import unittest -from unittest import mock -from hanoi import hanoi # Assuming the code is in a file named hanoi.py import io -import sys +from unittest.mock import patch +from hanoi import hanoi, get_hanoi_input class TestHanoi(unittest.TestCase): - - def test_hanoi_with_one_disk(self): - with self.subTest(n=1, source='A', auxiliary='B', target='C'): - expected_output = "Move disk 1 from A to C\n" - with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: - hanoi(1, 'A', 'B', 'C') - self.assertEqual(mock_stdout.getvalue(), expected_output) - - def test_hanoi_with_two_disks(self): - with self.subTest(n=2, source='A', auxiliary='B', target='C'): - expected_output = "Move disk 1 from A to B\nMove disk 2 from A to C\nMove disk 1 from B to C\n" - with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: - hanoi(2, 'A', 'B', 'C') - self.assertEqual(mock_stdout.getvalue(), expected_output) - - def test_hanoi_with_three_disks(self): - with self.subTest(n=3, source='A', auxiliary='B', target='C'): - expected_output = "Move disk 1 from A to C\nMove disk 2 from A to B\nMove disk 1 from C to B\nMove disk 3 from A to C\nMove disk 1 from B to A\nMove disk 2 from B to C\nMove disk 1 from A to C\n" - with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: - hanoi(3, 'A', 'B', 'C') - self.assertEqual(mock_stdout.getvalue(), expected_output) - - def test_hanoi_with_zero_disks(self): - with self.subTest(n=0, source='A', auxiliary='B', target='C'): - expected_output = "No disks, nothing to do\n" - with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: - hanoi(0, 'A', 'B', 'C') - self.assertEqual(mock_stdout.getvalue(), expected_output) - - def test_hanoi_with_negative_disks(self): - with self.subTest(n=-1, source='A', auxiliary='B', target='C'): - expected_output = "No disks, nothing to do\n" - with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: - hanoi(-1, 'A', 'B', 'C') - self.assertEqual(mock_stdout.getvalue(), expected_output) + + def test_hanoi_zero_disks(self): + expected_output = "No disks, nothing to do\n" + # with self.assertRaises(SystemExit): + with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: + hanoi(0, 'A', 'B', 'C') + + def test_hanoi_one_disk(self): + expected_output = "Move disk 1 from A to C\n" + with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: + hanoi(1, 'A', 'B', 'C') + self.assertEqual(mock_stdout.getvalue(), expected_output) + + def test_hanoi_two_disks(self): + expected_output = "Move disk 1 from A to B\nMove disk 2 from A to C\nMove disk 1 from B to C\n" + with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: + hanoi(2, 'A', 'B', 'C') + self.assertEqual(mock_stdout.getvalue(), expected_output) + + def test_hanoi_three_disks(self): + expected_output = "Move disk 1 from A to C\nMove disk 2 from A to B\nMove disk 1 from C to B\nMove disk 3 from A to C\nMove disk 1 from B to A\nMove disk 2 from B to C\nMove disk 1 from A to C\n" + with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: + hanoi(3, 'A', 'B', 'C') + self.assertEqual(mock_stdout.getvalue(), expected_output) + + def test_hanoi_negative_input(self): + expected_output = "No disks, nothing to do\n" + # with self.assertRaises(SystemExit): + with unittest.mock.patch('sys.stdout', new=io.StringIO()) as mock_stdout: + hanoi(-1, 'A', 'B', 'C') + + def test_get_hanoi_input_valid_integer(self): + with unittest.mock.patch('builtins.input', return_value='4'): + self.assertEqual(get_hanoi_input(), 4) + + def test_get_hanoi_input_invalid_input(self): + with unittest.mock.patch('builtins.input', side_effect=['abc', '5']): + self.assertEqual(get_hanoi_input(), 5) if __name__ == "__main__": - unittest.main() - + unittest.main()