-
Notifications
You must be signed in to change notification settings - Fork 51
Expand file tree
/
Copy pathtest_intent.py
More file actions
304 lines (247 loc) · 11.2 KB
/
test_intent.py
File metadata and controls
304 lines (247 loc) · 11.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
import unittest
from mpos.content.intent import Intent
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"])