Skip to content

Commit 311e418

Browse files
committed
Strengthen settings behavior controller tests
1 parent 6adb82e commit 311e418

1 file changed

Lines changed: 49 additions & 15 deletions

File tree

tests/test_settings_behavior_migration.py

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,65 @@
1+
import re
12
import unittest
23
from pathlib import Path
34

45
ROOT = Path(__file__).parents[1]
56
QML = ROOT / "src/settings.qml"
67

78

9+
def function_bodies(text, name):
10+
pattern = re.compile(r"function\s+" + re.escape(name) + r"\s*\([^)]*\)\s*\{")
11+
bodies = []
12+
for match in pattern.finditer(text):
13+
brace = text.find("{", match.start())
14+
depth = 0
15+
for i in range(brace, len(text)):
16+
if text[i] == "{":
17+
depth += 1
18+
elif text[i] == "}":
19+
depth -= 1
20+
if depth == 0:
21+
bodies.append(text[brace + 1:i])
22+
break
23+
return bodies
24+
25+
826
class SettingsBehaviorMigrationTests(unittest.TestCase):
9-
def test_controller_is_installed(self):
10-
text = QML.read_text(encoding="utf-8")
11-
self.assertIn("// SETTINGS_BEHAVIOR_CONTROLLER_V1", text)
12-
self.assertIn("id: settingsBehavior", text)
27+
def setUp(self):
28+
self.text = QML.read_text(encoding="utf-8")
29+
30+
def test_controller_is_installed_once(self):
31+
self.assertEqual(self.text.count("// SETTINGS_BEHAVIOR_CONTROLLER_V1"), 1)
32+
self.assertEqual(self.text.count("id: settingsBehavior"), 1)
33+
34+
def test_controller_contains_real_mutation_logic(self):
35+
bodies = function_bodies(self.text, "setSettingValue")
36+
self.assertGreaterEqual(len(bodies), 2)
37+
controller_body = bodies[0]
38+
self.assertIn("settings[entry.key]", controller_body)
39+
self.assertIn("afterGenericWrite(entry)", controller_body)
40+
self.assertNotIn("settingsBehavior.setSettingValue", controller_body)
41+
42+
def test_outer_generic_setter_delegates_only(self):
43+
bodies = function_bodies(self.text, "setSettingValue")
44+
outer_body = bodies[-1]
45+
self.assertIn("settingsBehavior.setSettingValue(entry, value)", outer_body)
46+
self.assertNotIn("window.settings_restart_to_apply", outer_body)
47+
self.assertNotIn("settings[entry.key]", outer_body)
1348

14-
def test_generic_setters_delegate_to_controller(self):
15-
text = QML.read_text(encoding="utf-8")
16-
self.assertIn("settingsBehavior.setSettingValue(entry, value)", text)
17-
self.assertIn("settingsBehavior.setVirtualSelection(entry, index)", text)
49+
def test_virtual_controller_and_wrapper_are_not_recursive(self):
50+
bodies = function_bodies(self.text, "setVirtualSelection")
51+
self.assertGreaterEqual(len(bodies), 2)
52+
self.assertIn("settings[entry.options[i].sets] = false", bodies[0])
53+
self.assertNotIn("settingsBehavior.setVirtualSelection", bodies[0])
54+
self.assertIn("settingsBehavior.setVirtualSelection(entry, index)", bodies[-1])
1855

1956
def test_restart_policy_defaults_to_legacy_behavior(self):
20-
text = QML.read_text(encoding="utf-8")
21-
self.assertIn("entry.restartRequired === undefined ? true", text)
22-
self.assertIn("window.settings_restart_to_apply = true", text)
57+
self.assertIn("entry.restartRequired === undefined ? true", self.text)
58+
self.assertIn("window.settings_restart_to_apply = true", self.text)
2359

2460
def test_legacy_controls_are_not_mass_rewritten(self):
25-
text = QML.read_text(encoding="utf-8")
26-
# Representative legacy direct writes intentionally remain in place.
27-
self.assertIn("settings.weight =", text)
28-
self.assertIn("settings.ftp =", text)
61+
self.assertIn("settings.weight =", self.text)
62+
self.assertIn("settings.ftp =", self.text)
2963

3064

3165
if __name__ == "__main__":

0 commit comments

Comments
 (0)