From c8790a2d4bb922d6f1461e2c09b0a190bbf57bdd Mon Sep 17 00:00:00 2001 From: muoimeo <bvnminh6a01@gmail.com> Date: Fri, 21 Mar 2025 11:39:57 +0700 Subject: [PATCH] Add lab 11 works --- lab11/my_sum.py | 15 ++++ lab11/ptest/__MACOSX/._uwe_logo.png | Bin 0 -> 176 bytes lab11/ptest/piltest.py | 28 ++++++++ lab11/ptest/uwe_logo.png | Bin 0 -> 23761 bytes lab11/study_unittest/basic.ipynb | 82 +++++++++++++++++++++ lab11/study_unittest/inc_dec.py | 5 ++ lab11/study_unittest/test_unittest.py | 13 ++++ lab11/test_my_sum.py | 98 ++++++++++++++++++++++++++ 8 files changed, 241 insertions(+) create mode 100644 lab11/my_sum.py create mode 100644 lab11/ptest/__MACOSX/._uwe_logo.png create mode 100644 lab11/ptest/piltest.py create mode 100644 lab11/ptest/uwe_logo.png create mode 100644 lab11/study_unittest/basic.ipynb create mode 100644 lab11/study_unittest/inc_dec.py create mode 100644 lab11/study_unittest/test_unittest.py create mode 100644 lab11/test_my_sum.py diff --git a/lab11/my_sum.py b/lab11/my_sum.py new file mode 100644 index 0000000..44cfd36 --- /dev/null +++ b/lab11/my_sum.py @@ -0,0 +1,15 @@ +class Calculate: + + def sum(self, a, b): + return a + b + + def multiply(self, a, b): + return a * b + + def subtract(self, a, b): + return a - b + + def divide(self, a, b): + if b == 0: + raise ValueError("Division by zero is not allowed") + return a / b diff --git a/lab11/ptest/__MACOSX/._uwe_logo.png b/lab11/ptest/__MACOSX/._uwe_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea62ea99b4fc0b23d2f9b41a3db4fdf23cb5d24 GIT binary patch literal 176 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3Cj$e65d#B59RmZHzkz{)f#E+CfY{ivV@OC4 zR0gDD1_J|w1e6b>7#SECpyHy*`MG+D1qC^&dWEHlMTvPOnR%%Uh57~t7KYYlrl!dj QNvY=6&KX7dxvAC+04rM_%m4rY literal 0 HcmV?d00001 diff --git a/lab11/ptest/piltest.py b/lab11/ptest/piltest.py new file mode 100644 index 0000000..8ed7876 --- /dev/null +++ b/lab11/ptest/piltest.py @@ -0,0 +1,28 @@ +# This program will test the installation of tkinter/PIL +# If you see a UWE logo and a button then it is working + +# Use this to test the setup on any machnes you will be using for ASD development + +import tkinter as tk +import tkinter.messagebox as tkm +from PIL import ImageTk, Image + +window = tk.Tk() + +def buttonPressed(): + tkm.showinfo("Alert!","Hooray!") + +label = tk.Label(text="If you see the UWE logo below PIL is working!"); +label.pack() + +button = tk.Button(master=window, text="OK",command=buttonPressed) +button.pack() + +c = tk.Canvas(master=window,bg="red",width=700, height=350) + +# Use an absolute path to the image file +im = tk.PhotoImage(file = r"d:\UWE\2nd Year\2nd semester\Advanced Software Dev\twinkter lab\lab11\ptest\uwe_logo.png") +image = c.create_image(0, 0,anchor="nw", image=im) + +c.pack() +window.mainloop() \ No newline at end of file diff --git a/lab11/ptest/uwe_logo.png b/lab11/ptest/uwe_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a22d6bd7de2df56f91992284bee6d9a7770460d3 GIT binary patch literal 23761 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�B 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 KKbLh*2~7Y`ipY-u literal 0 HcmV?d00001 diff --git a/lab11/study_unittest/basic.ipynb b/lab11/study_unittest/basic.ipynb new file mode 100644 index 0000000..aa59a16 --- /dev/null +++ b/lab11/study_unittest/basic.ipynb @@ -0,0 +1,82 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Everything passed\n" + ] + } + ], + "source": [ + "# test_sum_list\n", + "\n", + "def test_sum():\n", + " assert sum([1, 2, 3]) == 6, \"Should be 6\"\n", + "\n", + "if __name__ == \"__main__\":\n", + " test_sum()\n", + " print(\"Everything passed\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "AssertionError", + "evalue": "Should be 6", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAssertionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[2], line 11\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;18m__name__\u001b[39m \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m__main__\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m 10\u001b[0m test_sum()\n\u001b[1;32m---> 11\u001b[0m \u001b[43mtest_sum_tuple\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 12\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mEverything passed\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "Cell \u001b[1;32mIn[2], line 7\u001b[0m, in \u001b[0;36mtest_sum_tuple\u001b[1;34m()\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtest_sum_tuple\u001b[39m():\n\u001b[1;32m----> 7\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28msum\u001b[39m((\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m2\u001b[39m)) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m6\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mShould be 6\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", + "\u001b[1;31mAssertionError\u001b[0m: Should be 6" + ] + } + ], + "source": [ + "# test_sum_tuple\n", + "\n", + "def test_sum():\n", + " assert sum([1, 2, 3]) == 6, \"Should be 6\"\n", + "\n", + "def test_sum_tuple():\n", + " assert sum((1, 2, 2)) == 6, \"Should be 6\"\n", + "\n", + "if __name__ == \"__main__\":\n", + " test_sum()\n", + " test_sum_tuple()\n", + " print(\"Everything passed\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lab11/study_unittest/inc_dec.py b/lab11/study_unittest/inc_dec.py new file mode 100644 index 0000000..d7c396c --- /dev/null +++ b/lab11/study_unittest/inc_dec.py @@ -0,0 +1,5 @@ +def increment(x): + return x + 1 + +def decrement(x): + return x - 1 diff --git a/lab11/study_unittest/test_unittest.py b/lab11/study_unittest/test_unittest.py new file mode 100644 index 0000000..c09d62e --- /dev/null +++ b/lab11/study_unittest/test_unittest.py @@ -0,0 +1,13 @@ +import inc_dec # The code to test +import unittest # The test framework + +class Test_TestIncrementDecrement(unittest.TestCase): + def test_increment(self): + self.assertEqual(inc_dec.increment(3), 4) + + # This test is designed to fail for demonstration purposes. + def test_decrement(self): + self.assertEqual(inc_dec.decrement(3), 4) + +if __name__ == '__main__': + unittest.main() diff --git a/lab11/test_my_sum.py b/lab11/test_my_sum.py new file mode 100644 index 0000000..79c5092 --- /dev/null +++ b/lab11/test_my_sum.py @@ -0,0 +1,98 @@ +import unittest +from my_sum import Calculate + +class TestCalculate(unittest.TestCase): + def setUp(self): + self.calc = Calculate() # Create instance + + # 5 Correct Expected Values + def test_sum_positive(self): + """Test sum with two positive numbers""" + self.assertEqual(self.calc.sum(3, 4), 7) + + def test_sum_negative(self): + """Test sum with two negative numbers""" + self.assertEqual(self.calc.sum(-2, -3), -5) + + def test_sum_mixed(self): + """Test sum with positive and negative numbers""" + self.assertEqual(self.calc.sum(5, -2), 3) + + def test_multiply_positive(self): + """Test multiply with two positive numbers""" + self.assertEqual(self.calc.multiply(2, 3), 6) + + def test_multiply_negative(self): + """Test multiply with positive and negative numbers""" + self.assertEqual(self.calc.multiply(4, -2), -8) + + # 5 Incorrect Expected Values + def test_sum_wrong_positive(self): + """Test sum with incorrect positive result""" + self.assertEqual(self.calc.sum(3, 4), 8) # Should be 7 + + def test_sum_wrong_negative(self): + """Test sum with incorrect negative result""" + self.assertEqual(self.calc.sum(-2, -3), -4) # Should be -5 + + def test_sum_wrong_zero(self): + """Test sum with incorrect zero result""" + self.assertEqual(self.calc.sum(5, -5), 1) # Should be 0 + + def test_multiply_wrong_positive(self): + """Test multiply with incorrect positive result""" + self.assertEqual(self.calc.multiply(2, 3), 5) # Should be 6 + + def test_multiply_wrong_negative(self): + """Test multiply with incorrect negative result""" + self.assertEqual(self.calc.multiply(4, -2), -7) # Should be -8 + + # Tests for subtract() + def test_subtract_positive_integers(self): + """Test subtract with positive integers""" + self.assertEqual(self.calc.subtract(5, 3), 2) + + def test_subtract_negative_integers(self): + """Test subtract with negative integers""" + self.assertEqual(self.calc.subtract(-5, -2), -3) + + def test_subtract_mixed(self): + """Test subtract with positive and negative integers""" + self.assertEqual(self.calc.subtract(5, -2), 7) + + def test_subtract_floats(self): + """Test subtract with floating-point numbers""" + self.assertEqual(self.calc.subtract(3.5, 1.5), 2.0) + + def test_subtract_wrong(self): + """Test subtract with incorrect result""" + self.assertEqual(self.calc.subtract(5, 3), 3) # Should be 2 + + # Tests for divide() + def test_divide_positive_integers(self): + """Test divide with positive integers""" + self.assertEqual(self.calc.divide(6, 2), 3) + + def test_divide_negative_integers(self): + """Test divide with negative integers""" + self.assertEqual(self.calc.divide(-6, -2), 3) + + def test_divide_mixed(self): + """Test divide with positive and negative integers""" + self.assertEqual(self.calc.divide(8, -2), -4) + + def test_divide_floats(self): + """Test divide with floating-point numbers""" + self.assertEqual(self.calc.divide(4.5, 1.5), 3.0) + + def test_divide_by_zero(self): + """Test divide by zero raises ValueError""" + with self.assertRaises(ValueError): + self.calc.divide(5, 0) + + def test_divide_wrong(self): + """Test divide with incorrect result""" + self.assertEqual(self.calc.divide(6, 2), 2) # Should be 3 + +if __name__ == '__main__': + unittest.main() \ No newline at end of file -- GitLab