Skip to content

Commit ceffd41

Browse files
committed
Add comprehensive external change equality tests
1 parent 7f254ea commit ceffd41

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

Tests/ObservableDefaultsTests/ExternalChangeEqualityTests.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,45 @@ struct ExternalChangeEqualityTests {
2323
tracking(model, \.age, .userDefaults, false)
2424
userDefaults.set("NewName", forKey: "name")
2525
}
26+
27+
@Test("Same value write does not notify for backed property")
28+
func sameValueWriteNotNotified() {
29+
let userDefaults = UserDefaults.getTestInstance(suiteName: #function)
30+
let model = MockModel(userDefaults: userDefaults)
31+
32+
// Track name - expect NO mutation when writing the same value
33+
tracking(model, \.name, .userDefaults, false)
34+
userDefaults.set("Test", forKey: "name")
35+
}
36+
37+
@MainActor
38+
@Test("MainActor unrelated property not notified when another property changes externally")
39+
func mainActorUnrelatedPropertyNotNotified() async {
40+
let userDefaults = UserDefaults.getTestInstance(suiteName: #function)
41+
let model = MockModelMainActor(userDefaults: userDefaults)
42+
43+
// Track count - expect NO mutation when only name changes
44+
tracking(model, \.count, .userDefaults, false)
45+
userDefaults.set("ExternalMainActorName", forKey: "name")
46+
47+
// MainActor observer path uses .main queue
48+
try? await Task.sleep(nanoseconds: 100_000_000)
49+
#expect(model.name == "ExternalMainActorName")
50+
#expect(model.count == 0)
51+
}
52+
53+
@MainActor
54+
@Test("MainActor same value write does not notify for backed property")
55+
func mainActorSameValueWriteNotNotified() async {
56+
let userDefaults = UserDefaults.getTestInstance(suiteName: #function)
57+
let model = MockModelMainActor(userDefaults: userDefaults)
58+
59+
// Track name - expect NO mutation when writing the same value
60+
tracking(model, \.name, .userDefaults, false)
61+
userDefaults.set("Test", forKey: "name")
62+
63+
// MainActor observer path uses .main queue
64+
try? await Task.sleep(nanoseconds: 100_000_000)
65+
#expect(model.name == "Test")
66+
}
2667
}

0 commit comments

Comments
 (0)