Files
MicroPythonOS/tests/test_intent.py
T

305 lines
11 KiB
Python
Raw Normal View History

2025-11-14 12:45:04 +01:00
import unittest
2026-01-13 00:38:17 +01:00
from mpos import Intent
2025-11-14 12:45:04 +01:00
class TestIntent(unittest.TestCase):
"""Test suite for Intent class."""
# ============================================================
# Intent Construction
# ============================================================
def test_empty_intent(self):
"""Test creating an empty intent."""
intent = Intent()
self.assertIsNone(intent.activity_class)
self.assertIsNone(intent.action)
self.assertIsNone(intent.data)
self.assertEqual(intent.extras, {})
self.assertEqual(intent.flags, {})
def test_intent_with_activity_class(self):
"""Test creating an intent with an explicit activity class."""
class MockActivity:
pass
intent = Intent(activity_class=MockActivity)
self.assertEqual(intent.activity_class, MockActivity)
self.assertIsNone(intent.action)
def test_intent_with_action(self):
"""Test creating an intent with an action."""
intent = Intent(action="view")
self.assertEqual(intent.action, "view")
self.assertIsNone(intent.activity_class)
def test_intent_with_data(self):
"""Test creating an intent with data."""
intent = Intent(data="https://example.com")
self.assertEqual(intent.data, "https://example.com")
def test_intent_with_extras(self):
"""Test creating an intent with extras dictionary."""
extras = {"user_id": 123, "username": "alice"}
intent = Intent(extras=extras)
self.assertEqual(intent.extras, extras)
def test_intent_with_all_parameters(self):
"""Test creating an intent with all parameters."""
class MockActivity:
pass
extras = {"key": "value"}
intent = Intent(
activity_class=MockActivity,
action="share",
data="some_data",
extras=extras
)
self.assertEqual(intent.activity_class, MockActivity)
self.assertEqual(intent.action, "share")
self.assertEqual(intent.data, "some_data")
self.assertEqual(intent.extras, extras)
# ============================================================
# Extras Operations
# ============================================================
def test_put_extra_single(self):
"""Test adding a single extra to an intent."""
intent = Intent()
intent.putExtra("key", "value")
self.assertEqual(intent.extras["key"], "value")
def test_put_extra_multiple(self):
"""Test adding multiple extras to an intent."""
intent = Intent()
intent.putExtra("key1", "value1")
intent.putExtra("key2", 42)
intent.putExtra("key3", True)
self.assertEqual(intent.extras["key1"], "value1")
self.assertEqual(intent.extras["key2"], 42)
self.assertTrue(intent.extras["key3"])
def test_put_extra_chaining(self):
"""Test that putExtra returns self for method chaining."""
intent = Intent()
result = intent.putExtra("key", "value")
self.assertEqual(result, intent)
# Test actual chaining
intent.putExtra("a", 1).putExtra("b", 2).putExtra("c", 3)
self.assertEqual(intent.extras["a"], 1)
self.assertEqual(intent.extras["b"], 2)
self.assertEqual(intent.extras["c"], 3)
def test_put_extra_overwrites(self):
"""Test that putting an extra with the same key overwrites the value."""
intent = Intent()
intent.putExtra("key", "original")
intent.putExtra("key", "updated")
self.assertEqual(intent.extras["key"], "updated")
def test_put_extra_various_types(self):
"""Test putting extras of various data types."""
intent = Intent()
intent.putExtra("string", "text")
intent.putExtra("int", 123)
intent.putExtra("float", 3.14)
intent.putExtra("bool", True)
intent.putExtra("list", [1, 2, 3])
intent.putExtra("dict", {"nested": "value"})
intent.putExtra("none", None)
self.assertEqual(intent.extras["string"], "text")
self.assertEqual(intent.extras["int"], 123)
self.assertAlmostEqual(intent.extras["float"], 3.14)
self.assertTrue(intent.extras["bool"])
self.assertEqual(intent.extras["list"], [1, 2, 3])
self.assertEqual(intent.extras["dict"]["nested"], "value")
self.assertIsNone(intent.extras["none"])
# ============================================================
# Flag Operations
# ============================================================
def test_add_flag_single(self):
"""Test adding a single flag to an intent."""
intent = Intent()
intent.addFlag("clear_top")
self.assertTrue(intent.flags["clear_top"])
def test_add_flag_with_value(self):
"""Test adding a flag with a specific value."""
intent = Intent()
intent.addFlag("no_history", False)
self.assertFalse(intent.flags["no_history"])
intent.addFlag("no_animation", True)
self.assertTrue(intent.flags["no_animation"])
def test_add_flag_chaining(self):
"""Test that addFlag returns self for method chaining."""
intent = Intent()
result = intent.addFlag("clear_top")
self.assertEqual(result, intent)
# Test actual chaining
intent.addFlag("clear_top").addFlag("no_history").addFlag("no_animation")
self.assertTrue(intent.flags["clear_top"])
self.assertTrue(intent.flags["no_history"])
self.assertTrue(intent.flags["no_animation"])
def test_add_flag_overwrites(self):
"""Test that adding a flag with the same name overwrites the value."""
intent = Intent()
intent.addFlag("flag", True)
intent.addFlag("flag", False)
self.assertFalse(intent.flags["flag"])
def test_multiple_flags(self):
"""Test adding multiple different flags."""
intent = Intent()
intent.addFlag("clear_top", True)
intent.addFlag("no_history", False)
intent.addFlag("custom_flag", True)
self.assertEqual(len(intent.flags), 3)
self.assertTrue(intent.flags["clear_top"])
self.assertFalse(intent.flags["no_history"])
self.assertTrue(intent.flags["custom_flag"])
# ============================================================
# Combined Operations
# ============================================================
def test_chaining_extras_and_flags(self):
"""Test chaining both extras and flags together."""
intent = Intent(action="view")
intent.putExtra("user_id", 123)\
.putExtra("username", "alice")\
.addFlag("clear_top")\
.addFlag("no_history")
self.assertEqual(intent.action, "view")
self.assertEqual(intent.extras["user_id"], 123)
self.assertEqual(intent.extras["username"], "alice")
self.assertTrue(intent.flags["clear_top"])
self.assertTrue(intent.flags["no_history"])
def test_intent_builder_pattern(self):
"""Test using intent as a builder pattern."""
class MockActivity:
pass
intent = Intent()\
.putExtra("key1", "value1")\
.putExtra("key2", 42)\
.addFlag("clear_top")\
.addFlag("no_animation", False)
# Modify after initial creation
intent.activity_class = MockActivity
intent.action = "custom_action"
intent.data = "custom_data"
self.assertEqual(intent.activity_class, MockActivity)
self.assertEqual(intent.action, "custom_action")
self.assertEqual(intent.data, "custom_data")
self.assertEqual(intent.extras["key1"], "value1")
self.assertEqual(intent.extras["key2"], 42)
self.assertTrue(intent.flags["clear_top"])
self.assertFalse(intent.flags["no_animation"])
# ============================================================
# Common Intent Patterns
# ============================================================
def test_view_intent_pattern(self):
"""Test creating a typical 'view' intent."""
intent = Intent(action="view", data="https://micropythonos.com")
intent.putExtra("fullscreen", True)
self.assertEqual(intent.action, "view")
self.assertEqual(intent.data, "https://micropythonos.com")
self.assertTrue(intent.extras["fullscreen"])
def test_share_intent_pattern(self):
"""Test creating a typical 'share' intent."""
intent = Intent(action="share")
intent.putExtra("text", "Check out MicroPythonOS!")
intent.putExtra("subject", "Cool OS")
self.assertEqual(intent.action, "share")
self.assertEqual(intent.extras["text"], "Check out MicroPythonOS!")
self.assertEqual(intent.extras["subject"], "Cool OS")
def test_launcher_intent_pattern(self):
"""Test creating a typical launcher intent."""
intent = Intent(action="main")
intent.addFlag("clear_top")
self.assertEqual(intent.action, "main")
self.assertTrue(intent.flags["clear_top"])
def test_scan_qr_intent_pattern(self):
"""Test creating a scan QR code intent (from camera app)."""
intent = Intent(action="scan_qr_code")
intent.putExtra("result_key", "qr_data")
self.assertEqual(intent.action, "scan_qr_code")
self.assertEqual(intent.extras["result_key"], "qr_data")
# ============================================================
# Edge Cases
# ============================================================
def test_empty_strings(self):
"""Test intent with empty strings."""
intent = Intent(action="", data="")
intent.putExtra("empty", "")
self.assertEqual(intent.action, "")
self.assertEqual(intent.data, "")
self.assertEqual(intent.extras["empty"], "")
def test_special_characters_in_extras(self):
"""Test extras with special characters in keys."""
intent = Intent()
intent.putExtra("key.with.dots", "value1")
intent.putExtra("key_with_underscores", "value2")
intent.putExtra("key-with-dashes", "value3")
self.assertEqual(intent.extras["key.with.dots"], "value1")
self.assertEqual(intent.extras["key_with_underscores"], "value2")
self.assertEqual(intent.extras["key-with-dashes"], "value3")
def test_unicode_in_extras(self):
"""Test extras with Unicode strings."""
intent = Intent()
intent.putExtra("greeting", "Hello δΈ–η•Œ")
intent.putExtra("emoji", "πŸš€")
self.assertEqual(intent.extras["greeting"], "Hello δΈ–η•Œ")
self.assertEqual(intent.extras["emoji"], "πŸš€")
def test_complex_extras_data(self):
"""Test extras with complex nested data structures."""
intent = Intent()
complex_data = {
"users": ["alice", "bob"],
"config": {
"timeout": 30,
"retry": True
}
}
intent.putExtra("data", complex_data)
self.assertEqual(intent.extras["data"]["users"][0], "alice")
self.assertEqual(intent.extras["data"]["config"]["timeout"], 30)
self.assertTrue(intent.extras["data"]["config"]["retry"])