@@ -12,9 +12,12 @@ private let colorKey = "colorKey"
1212private let defaultColor = " blue "
1313private let newColor = " purple "
1414
15+ private let testSetKey = " testSetKey "
16+
1517extension Defaults . Keys {
1618 static let animal = Defaults . Key ( animalKey, default: defaultAnimal)
1719 static let color = Defaults . Key ( colorKey, default: defaultColor)
20+ static let testSet = Defaults . Key ( testSetKey, default: Set < Int > ( ) )
1821}
1922
2023func getKey( ) -> Defaults . Key < String > {
@@ -67,12 +70,21 @@ private final class TestModelWithMultipleValues {
6770 var color : String
6871}
6972
73+ @available ( macOS 14 , iOS 17 , tvOS 17 , watchOS 10 , visionOS 1 , * )
74+ @Observable
75+ private final class TestModelWithSet {
76+ @ObservableDefault ( . testSet)
77+ @ObservationIgnored
78+ var testSet : Set < Int >
79+ }
80+
7081@Suite ( . serialized)
7182final class ObservableDefaultTests {
7283 init ( ) {
7384 Defaults . removeAll ( )
7485 Defaults [ . animal] = defaultAnimal
7586 Defaults [ . color] = defaultColor
87+ Defaults [ . testSet] = [ ]
7688 }
7789
7890 deinit {
@@ -194,4 +206,41 @@ final class ObservableDefaultTests {
194206 #expect( model. animal == newAnimal)
195207 #expect( model. color == newColor)
196208 }
209+
210+ @available ( macOS 14 , iOS 17 , tvOS 17 , watchOS 10 , visionOS 1 , * )
211+ @Test
212+ func testMacroWithSetNoInfiniteRecursion( ) async {
213+ let model = TestModelWithSet ( )
214+ #expect( model. testSet. isEmpty)
215+
216+ // This should not cause infinite recursion
217+ model. testSet. formUnion ( 1 ... 10 )
218+
219+ #expect( model. testSet == Set ( 1 ... 10 ) )
220+ #expect( Defaults [ . testSet] == Set ( 1 ... 10 ) )
221+ }
222+
223+ @available ( macOS 14 , iOS 17 , tvOS 17 , watchOS 10 , visionOS 1 , * )
224+ @Test
225+ func testMacroObserversPropagateAcrossModels( ) async {
226+ let model1 = TestModelWithSet ( )
227+ let model2 = TestModelWithSet ( )
228+
229+ #expect( model1. testSet. isEmpty)
230+ #expect( model2. testSet. isEmpty)
231+
232+ await confirmation { confirmation in
233+ _ = withObservationTracking {
234+ model2. testSet
235+ } onChange: {
236+ confirmation ( )
237+ }
238+
239+ // Write through model1
240+ model1. testSet = [ 1 , 2 , 3 ]
241+ }
242+
243+ // model2 should have observed the change
244+ #expect( model2. testSet == [ 1 , 2 , 3 ] )
245+ }
197246}
0 commit comments