@@ -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