diff --git a/app/index.html b/app/index.html
new file mode 100644
index 0000000..552818d
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+Calculator
+
+
+Calculator
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/test_api.py b/tests/test_api.py
new file mode 100644
index 0000000..b1502cd
--- /dev/null
+++ b/tests/test_api.py
@@ -0,0 +1,87 @@
+# retoor
+
+import json
+import unittest
+
+from app import app
+
+
+class TestCalculatorAPI(unittest.TestCase):
+
+ def setUp(self) -> None:
+ self.client = app.test_client()
+
+ def test_add_success(self) -> None:
+ response = self.client.get('/add?left=3&right=5')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json, {'result': 8})
+
+ def test_add_missing_param_returns_400(self) -> None:
+ response = self.client.get('/add?left=3')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_add_invalid_type_returns_400(self) -> None:
+ response = self.client.get('/add?left=abc&right=5')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_subtract_success(self) -> None:
+ response = self.client.get('/subtract?left=10&right=3')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json, {'result': 7})
+
+ def test_subtract_missing_param_returns_400(self) -> None:
+ response = self.client.get('/subtract?right=3')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_subtract_invalid_type_returns_400(self) -> None:
+ response = self.client.get('/subtract?left=10&right=xyz')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_clamp_success(self) -> None:
+ response = self.client.get('/clamp?value=5&low=0&high=10')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json, {'result': 5})
+
+ def test_clamp_value_below_low_returns_low(self) -> None:
+ response = self.client.get('/clamp?value=-5&low=0&high=10')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json, {'result': 0})
+
+ def test_clamp_missing_param_returns_400(self) -> None:
+ response = self.client.get('/clamp?value=5&low=0')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_clamp_invalid_type_returns_400(self) -> None:
+ response = self.client.get('/clamp?value=abc&low=0&high=10')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_clamp_low_greater_than_high_returns_400(self) -> None:
+ response = self.client.get('/clamp?value=5&low=10&high=0')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_clamp_to_byte_success(self) -> None:
+ response = self.client.get('/clamp_to_byte?value=100')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json, {'result': 100})
+
+ def test_clamp_to_byte_above_255_returns_255(self) -> None:
+ response = self.client.get('/clamp_to_byte?value=300')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.json, {'result': 255})
+
+ def test_clamp_to_byte_missing_param_returns_400(self) -> None:
+ response = self.client.get('/clamp_to_byte')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)
+
+ def test_clamp_to_byte_invalid_type_returns_400(self) -> None:
+ response = self.client.get('/clamp_to_byte?value=abc')
+ self.assertEqual(response.status_code, 400)
+ self.assertIn('error', response.json)