From 1b5b668d8d43e234377b18614fa6cb15a1089a7f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:38:49 +0000 Subject: [PATCH] Refactor Calculator.py to conditionally evaluate arithmetic operations Calculations for addition, subtraction, multiplication, and division were previously evaluated eagerly before checking the user's selected operation. This could lead to a crash due to `ZeroDivisionError` when the user inputted `0` for `num2` even if division wasn't selected. Moved calculation logic to the respective branches. Also added a division by zero check, protected input from EOFError, and added subprocess unit tests. Co-authored-by: ManupaKDU <95234271+ManupaKDU@users.noreply.github.com> --- Part-1/wHATTA/Basics/Calculator.py | 21 ++++++++---- Part-1/wHATTA/Basics/test_calculator.py | 45 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 Part-1/wHATTA/Basics/test_calculator.py diff --git a/Part-1/wHATTA/Basics/Calculator.py b/Part-1/wHATTA/Basics/Calculator.py index d0ba607..a3bb8c5 100644 --- a/Part-1/wHATTA/Basics/Calculator.py +++ b/Part-1/wHATTA/Basics/Calculator.py @@ -1,17 +1,24 @@ num1 = input("Enter you first number: ") num2 = input("Enter you second number: ") choice = input("Do you want to add(a) / substract(s) / mmultiply(m) / divide(d) ? ") -add = int(num1)+int(num2) -subs = int(num1)-int(num2) -mult = int(num1)*int(num2) -div = int(num1)/int(num2) if choice == 'a' : + add = int(num1)+int(num2) print("The addition is " + str(add)) elif choice == 's' : + subs = int(num1)-int(num2) print("The substraction is " + str(subs)) elif choice == 'm' : + mult = int(num1)*int(num2) print("The multipication is " + str(mult)) elif choice == 'd' : - print("The division is " + str(div)) -input(""".............Thank you............. -Please press the ENTER button""") \ No newline at end of file + if int(num2) == 0: + print("Cannot divide by zero") + else: + div = int(num1)/int(num2) + print("The division is " + str(div)) + +try: + input(""".............Thank you............. +Please press the ENTER button""") +except EOFError: + pass \ No newline at end of file diff --git a/Part-1/wHATTA/Basics/test_calculator.py b/Part-1/wHATTA/Basics/test_calculator.py new file mode 100644 index 0000000..9576428 --- /dev/null +++ b/Part-1/wHATTA/Basics/test_calculator.py @@ -0,0 +1,45 @@ +import unittest +import subprocess +import os + +class TestCalculator(unittest.TestCase): + def run_calculator(self, input_text): + script_path = os.path.join(os.path.dirname(__file__), 'Calculator.py') + process = subprocess.Popen(['python3', script_path], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + stdout, stderr = process.communicate(input=input_text) + return stdout, stderr, process.returncode + + def test_addition(self): + stdout, stderr, returncode = self.run_calculator("10\n5\na\n") + self.assertEqual(returncode, 0) + self.assertIn("The addition is 15", stdout) + + def test_addition_zero_division_avoided(self): + # Even if num2 is 0, addition should work and not crash + stdout, stderr, returncode = self.run_calculator("10\n0\na\n") + self.assertEqual(returncode, 0) + self.assertIn("The addition is 10", stdout) + self.assertEqual(stderr, "") + + def test_subtraction(self): + stdout, stderr, returncode = self.run_calculator("10\n5\ns\n") + self.assertEqual(returncode, 0) + self.assertIn("The substraction is 5", stdout) + + def test_multiplication(self): + stdout, stderr, returncode = self.run_calculator("10\n5\nm\n") + self.assertEqual(returncode, 0) + self.assertIn("The multipication is 50", stdout) + + def test_division(self): + stdout, stderr, returncode = self.run_calculator("10\n5\nd\n") + self.assertEqual(returncode, 0) + self.assertIn("The division is 2.0", stdout) + + def test_division_by_zero(self): + stdout, stderr, returncode = self.run_calculator("10\n0\nd\n") + self.assertEqual(returncode, 0) + self.assertIn("Cannot divide by zero", stdout) + +if __name__ == '__main__': + unittest.main()