From f0c0cbcca064acd1c0d4154f2790e644a5877413 Mon Sep 17 00:00:00 2001 From: Kyle Date: Wed, 1 Oct 2025 18:27:51 +0800 Subject: [PATCH 1/2] Update folder structure --- .../OpenSwiftUICore/Data/{State => Combine}/ObservedObject.swift | 0 Sources/OpenSwiftUICore/Data/{State => Combine}/StateObject.swift | 0 .../OpenSwiftUICore/Data/{ => DynamicProperty}/Namespace.swift | 0 .../Data/{Binding => Location}/Binding+ObjectLocation.swift | 0 .../Data/{State => Location}/ConstantLocation.swift | 0 .../Data/{State => Location}/FunctionalLocation.swift | 0 Sources/OpenSwiftUICore/Data/{ => Location}/Location.swift | 0 Sources/OpenSwiftUICore/Data/{ => Location}/Projection.swift | 0 .../OpenSwiftUICore/{Util/Data => Data/Util}/AnyHashable2.swift | 0 Sources/OpenSwiftUICore/{Util/Data => Data/Util}/BitVector.swift | 0 .../OpenSwiftUICore/{Util/Data => Data/Util}/BitVector64.swift | 0 .../OpenSwiftUICore/{Util/Data => Data/Util}/BloomFilter.swift | 0 Sources/OpenSwiftUICore/{Util/Data => Data/Util}/Box.swift | 0 .../{Util/Data => Data/Util}/ConcatenatedCollection.swift | 0 .../OpenSwiftUICore/{Util/Data => Data/Util}/InlineArray.swift | 0 .../OpenSwiftUICore/{Util/Data => Data/Util}/ObjectCache.swift | 0 Sources/OpenSwiftUICore/Data/{ => Util}/PropertyList.swift | 0 .../{Util/Data => Data/Util}/ScrapeableContent.swift | 0 Sources/OpenSwiftUICore/{Util/Data => Data/Util}/Stack.swift | 0 Sources/OpenSwiftUICore/Data/{ => Util}/StrongHash.swift | 0 Sources/OpenSwiftUICore/Data/{ => Util}/Time.swift | 0 Sources/OpenSwiftUICore/{Util/Data => Data/Util}/UniqueID.swift | 0 .../{Util/Data => Data/Util}/UniqueSeedGenerator.swift | 0 .../OpenSwiftUICore/{Util/Data => Data/Util}/VersionSeed.swift | 0 .../{Util/Data => Data/Util}/AnyHashable2Tests.swift | 0 .../{Util/Data => Data/Util}/BitVector64Tests.swift | 0 .../{Util/Data => Data/Util}/BitVectorTests.swift | 0 .../{Util/Data => Data/Util}/BloomFilterTests.swift | 0 .../OpenSwiftUICoreTests/{Util/Data => Data/Util}/BoxTests.swift | 0 .../{Util/Data => Data/Util}/Cache3Tests.swift | 0 .../{Util/Data => Data/Util}/ConcatenatedCollectionTests.swift | 0 .../{Util/Data => Data/Util}/InlineArrayTests.swift | 0 .../{Util/Data => Data/Util}/ObjectCacheTests.swift | 0 .../OpenSwiftUICoreTests/Data/{ => Util}/PropertyListTests.swift | 0 .../{Util/Data => Data/Util}/StackTests.swift | 0 Tests/OpenSwiftUICoreTests/Data/{ => Util}/StrongHashTests.swift | 0 Tests/OpenSwiftUICoreTests/Data/{ => Util}/TimeTests.swift | 0 .../{Util/Data => Data/Util}/UniqueIDTests.swift | 0 .../{Util/Data => Data/Util}/VersionSeedTests.swift | 0 39 files changed, 0 insertions(+), 0 deletions(-) rename Sources/OpenSwiftUICore/Data/{State => Combine}/ObservedObject.swift (100%) rename Sources/OpenSwiftUICore/Data/{State => Combine}/StateObject.swift (100%) rename Sources/OpenSwiftUICore/Data/{ => DynamicProperty}/Namespace.swift (100%) rename Sources/OpenSwiftUICore/Data/{Binding => Location}/Binding+ObjectLocation.swift (100%) rename Sources/OpenSwiftUICore/Data/{State => Location}/ConstantLocation.swift (100%) rename Sources/OpenSwiftUICore/Data/{State => Location}/FunctionalLocation.swift (100%) rename Sources/OpenSwiftUICore/Data/{ => Location}/Location.swift (100%) rename Sources/OpenSwiftUICore/Data/{ => Location}/Projection.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/AnyHashable2.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/BitVector.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/BitVector64.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/BloomFilter.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/Box.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/ConcatenatedCollection.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/InlineArray.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/ObjectCache.swift (100%) rename Sources/OpenSwiftUICore/Data/{ => Util}/PropertyList.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/ScrapeableContent.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/Stack.swift (100%) rename Sources/OpenSwiftUICore/Data/{ => Util}/StrongHash.swift (100%) rename Sources/OpenSwiftUICore/Data/{ => Util}/Time.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/UniqueID.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/UniqueSeedGenerator.swift (100%) rename Sources/OpenSwiftUICore/{Util/Data => Data/Util}/VersionSeed.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/AnyHashable2Tests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/BitVector64Tests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/BitVectorTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/BloomFilterTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/BoxTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/Cache3Tests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/ConcatenatedCollectionTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/InlineArrayTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/ObjectCacheTests.swift (100%) rename Tests/OpenSwiftUICoreTests/Data/{ => Util}/PropertyListTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/StackTests.swift (100%) rename Tests/OpenSwiftUICoreTests/Data/{ => Util}/StrongHashTests.swift (100%) rename Tests/OpenSwiftUICoreTests/Data/{ => Util}/TimeTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/UniqueIDTests.swift (100%) rename Tests/OpenSwiftUICoreTests/{Util/Data => Data/Util}/VersionSeedTests.swift (100%) diff --git a/Sources/OpenSwiftUICore/Data/State/ObservedObject.swift b/Sources/OpenSwiftUICore/Data/Combine/ObservedObject.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/State/ObservedObject.swift rename to Sources/OpenSwiftUICore/Data/Combine/ObservedObject.swift diff --git a/Sources/OpenSwiftUICore/Data/State/StateObject.swift b/Sources/OpenSwiftUICore/Data/Combine/StateObject.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/State/StateObject.swift rename to Sources/OpenSwiftUICore/Data/Combine/StateObject.swift diff --git a/Sources/OpenSwiftUICore/Data/Namespace.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/Namespace.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/Namespace.swift rename to Sources/OpenSwiftUICore/Data/DynamicProperty/Namespace.swift diff --git a/Sources/OpenSwiftUICore/Data/Binding/Binding+ObjectLocation.swift b/Sources/OpenSwiftUICore/Data/Location/Binding+ObjectLocation.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/Binding/Binding+ObjectLocation.swift rename to Sources/OpenSwiftUICore/Data/Location/Binding+ObjectLocation.swift diff --git a/Sources/OpenSwiftUICore/Data/State/ConstantLocation.swift b/Sources/OpenSwiftUICore/Data/Location/ConstantLocation.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/State/ConstantLocation.swift rename to Sources/OpenSwiftUICore/Data/Location/ConstantLocation.swift diff --git a/Sources/OpenSwiftUICore/Data/State/FunctionalLocation.swift b/Sources/OpenSwiftUICore/Data/Location/FunctionalLocation.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/State/FunctionalLocation.swift rename to Sources/OpenSwiftUICore/Data/Location/FunctionalLocation.swift diff --git a/Sources/OpenSwiftUICore/Data/Location.swift b/Sources/OpenSwiftUICore/Data/Location/Location.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/Location.swift rename to Sources/OpenSwiftUICore/Data/Location/Location.swift diff --git a/Sources/OpenSwiftUICore/Data/Projection.swift b/Sources/OpenSwiftUICore/Data/Location/Projection.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/Projection.swift rename to Sources/OpenSwiftUICore/Data/Location/Projection.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/AnyHashable2.swift b/Sources/OpenSwiftUICore/Data/Util/AnyHashable2.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/AnyHashable2.swift rename to Sources/OpenSwiftUICore/Data/Util/AnyHashable2.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/BitVector.swift b/Sources/OpenSwiftUICore/Data/Util/BitVector.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/BitVector.swift rename to Sources/OpenSwiftUICore/Data/Util/BitVector.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/BitVector64.swift b/Sources/OpenSwiftUICore/Data/Util/BitVector64.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/BitVector64.swift rename to Sources/OpenSwiftUICore/Data/Util/BitVector64.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/BloomFilter.swift b/Sources/OpenSwiftUICore/Data/Util/BloomFilter.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/BloomFilter.swift rename to Sources/OpenSwiftUICore/Data/Util/BloomFilter.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/Box.swift b/Sources/OpenSwiftUICore/Data/Util/Box.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/Box.swift rename to Sources/OpenSwiftUICore/Data/Util/Box.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/ConcatenatedCollection.swift b/Sources/OpenSwiftUICore/Data/Util/ConcatenatedCollection.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/ConcatenatedCollection.swift rename to Sources/OpenSwiftUICore/Data/Util/ConcatenatedCollection.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/InlineArray.swift b/Sources/OpenSwiftUICore/Data/Util/InlineArray.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/InlineArray.swift rename to Sources/OpenSwiftUICore/Data/Util/InlineArray.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/ObjectCache.swift b/Sources/OpenSwiftUICore/Data/Util/ObjectCache.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/ObjectCache.swift rename to Sources/OpenSwiftUICore/Data/Util/ObjectCache.swift diff --git a/Sources/OpenSwiftUICore/Data/PropertyList.swift b/Sources/OpenSwiftUICore/Data/Util/PropertyList.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/PropertyList.swift rename to Sources/OpenSwiftUICore/Data/Util/PropertyList.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/ScrapeableContent.swift b/Sources/OpenSwiftUICore/Data/Util/ScrapeableContent.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/ScrapeableContent.swift rename to Sources/OpenSwiftUICore/Data/Util/ScrapeableContent.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/Stack.swift b/Sources/OpenSwiftUICore/Data/Util/Stack.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/Stack.swift rename to Sources/OpenSwiftUICore/Data/Util/Stack.swift diff --git a/Sources/OpenSwiftUICore/Data/StrongHash.swift b/Sources/OpenSwiftUICore/Data/Util/StrongHash.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/StrongHash.swift rename to Sources/OpenSwiftUICore/Data/Util/StrongHash.swift diff --git a/Sources/OpenSwiftUICore/Data/Time.swift b/Sources/OpenSwiftUICore/Data/Util/Time.swift similarity index 100% rename from Sources/OpenSwiftUICore/Data/Time.swift rename to Sources/OpenSwiftUICore/Data/Util/Time.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/UniqueID.swift b/Sources/OpenSwiftUICore/Data/Util/UniqueID.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/UniqueID.swift rename to Sources/OpenSwiftUICore/Data/Util/UniqueID.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/UniqueSeedGenerator.swift b/Sources/OpenSwiftUICore/Data/Util/UniqueSeedGenerator.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/UniqueSeedGenerator.swift rename to Sources/OpenSwiftUICore/Data/Util/UniqueSeedGenerator.swift diff --git a/Sources/OpenSwiftUICore/Util/Data/VersionSeed.swift b/Sources/OpenSwiftUICore/Data/Util/VersionSeed.swift similarity index 100% rename from Sources/OpenSwiftUICore/Util/Data/VersionSeed.swift rename to Sources/OpenSwiftUICore/Data/Util/VersionSeed.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/AnyHashable2Tests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/AnyHashable2Tests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/AnyHashable2Tests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/AnyHashable2Tests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/BitVector64Tests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/BitVector64Tests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/BitVector64Tests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/BitVector64Tests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/BitVectorTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/BitVectorTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/BitVectorTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/BitVectorTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/BloomFilterTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/BloomFilterTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/BloomFilterTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/BloomFilterTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/BoxTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/BoxTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/BoxTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/BoxTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/Cache3Tests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/Cache3Tests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/Cache3Tests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/Cache3Tests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/ConcatenatedCollectionTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/ConcatenatedCollectionTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/ConcatenatedCollectionTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/ConcatenatedCollectionTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/InlineArrayTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/InlineArrayTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/InlineArrayTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/InlineArrayTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/ObjectCacheTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/ObjectCacheTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/ObjectCacheTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/ObjectCacheTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Data/PropertyListTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/PropertyListTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Data/PropertyListTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/PropertyListTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/StackTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/StackTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/StackTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/StackTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Data/StrongHashTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/StrongHashTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Data/StrongHashTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/StrongHashTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Data/TimeTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/TimeTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Data/TimeTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/TimeTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/UniqueIDTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/UniqueIDTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/UniqueIDTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/UniqueIDTests.swift diff --git a/Tests/OpenSwiftUICoreTests/Util/Data/VersionSeedTests.swift b/Tests/OpenSwiftUICoreTests/Data/Util/VersionSeedTests.swift similarity index 100% rename from Tests/OpenSwiftUICoreTests/Util/Data/VersionSeedTests.swift rename to Tests/OpenSwiftUICoreTests/Data/Util/VersionSeedTests.swift From da087977219fb91ff428f5524385e1e8220f3ebe Mon Sep 17 00:00:00 2001 From: Kyle Date: Wed, 1 Oct 2025 18:38:41 +0800 Subject: [PATCH 2/2] Add ObservedObjectCompatibilityTests --- .../ObservedObjectCompatibilityTests.swift | 158 ++++++++++++++++++ .../Data/State/StateCompatibilityTests.swift | 8 +- 2 files changed, 162 insertions(+), 4 deletions(-) create mode 100644 Tests/OpenSwiftUICompatibilityTests/Data/Combine/ObservedObjectCompatibilityTests.swift diff --git a/Tests/OpenSwiftUICompatibilityTests/Data/Combine/ObservedObjectCompatibilityTests.swift b/Tests/OpenSwiftUICompatibilityTests/Data/Combine/ObservedObjectCompatibilityTests.swift new file mode 100644 index 000000000..be2bb8c3e --- /dev/null +++ b/Tests/OpenSwiftUICompatibilityTests/Data/Combine/ObservedObjectCompatibilityTests.swift @@ -0,0 +1,158 @@ +// +// ObservedObjectCompatibilityTests.swift +// OpenSwiftUICompatibilityTests + +import Testing +import OpenSwiftUITestsSupport +#if OPENSWIFTUI_OPENCOMBINE +import OpenCombine +#else +import Combine +#endif + +@MainActor +struct ObservedObjectCompatibilityTests { + @MainActor + enum Count { + static var contentBody: Int = 0 + static var subviewBody: Int = 0 + } + + class Model: ObservableObject { + @Published var t1 = false + var t2 = false + } + + @Observable + class Model2 { + var t1 = false + @ObservationIgnored var t2 = false + } + + struct Subview: View { + var condition: Bool + + var body: some View { + let _ = { + Count.subviewBody += 1 + }() + Color(condition ? .red : .blue) + } + } + + @Test + func observedObjectChangePublishValue() async throws { + defer { + Count.contentBody = 0 + Count.subviewBody = 0 + } + struct ContentView: View { + @ObservedObject private var model = Model() + var body: some View { + let _ = { + Count.contentBody += 1 + }() + VStack { + Subview(condition: model.t1) + Subview(condition: model.t2) + }.onAppear { + model.t1.toggle() + } + } + } + try await triggerLayoutWithWindow(expectedCount: 0) { _ in + PlatformHostingController( + rootView: ContentView() + ) + } + #expect(Count.contentBody == 2) + #expect(Count.subviewBody == 3) + } + + @Test + func observedObjectChangeNonPublishValue() async throws { + defer { + Count.contentBody = 0 + Count.subviewBody = 0 + } + struct ContentView: View { + @ObservedObject private var model = Model() + var body: some View { + let _ = { + Count.contentBody += 1 + }() + VStack { + Subview(condition: model.t1) + Subview(condition: model.t2) + }.onAppear { + model.t2.toggle() + } + } + } + try await triggerLayoutWithWindow(expectedCount: 0) { _ in + PlatformHostingController( + rootView: ContentView() + ) + } + #expect(Count.contentBody == 1) + #expect(Count.subviewBody == 2) + } + + @Test + func observableMacroTrackedValue() async throws { + defer { + Count.contentBody = 0 + Count.subviewBody = 0 + } + struct ContentView: View { + private let model = Model2() + var body: some View { + let _ = { + Count.contentBody += 1 + }() + VStack { + Subview(condition: model.t1) + Subview(condition: model.t2) + }.onAppear { + model.t1.toggle() + } + } + } + try await triggerLayoutWithWindow(expectedCount: 0) { _ in + PlatformHostingController( + rootView: ContentView() + ) + } + #expect(Count.contentBody == 2) + #expect(Count.subviewBody == 3) + } + + @Test + func observableMacroIgnoredValue() async throws { + defer { + Count.contentBody = 0 + Count.subviewBody = 0 + } + struct ContentView: View { + private let model = Model2() + var body: some View { + let _ = { + Count.contentBody += 1 + }() + VStack { + Subview(condition: model.t1) + Subview(condition: model.t2) + }.onAppear { + model.t2.toggle() + } + } + } + try await triggerLayoutWithWindow(expectedCount: 0) { _ in + PlatformHostingController( + rootView: ContentView() + ) + } + #expect(Count.contentBody == 1) + #expect(Count.subviewBody == 2) + } +} diff --git a/Tests/OpenSwiftUICompatibilityTests/Data/State/StateCompatibilityTests.swift b/Tests/OpenSwiftUICompatibilityTests/Data/State/StateCompatibilityTests.swift index 1c09fcd53..6f5d1bc1f 100644 --- a/Tests/OpenSwiftUICompatibilityTests/Data/State/StateCompatibilityTests.swift +++ b/Tests/OpenSwiftUICompatibilityTests/Data/State/StateCompatibilityTests.swift @@ -9,7 +9,7 @@ struct StateCompatibilityTests { @Test func appear() async throws { struct ContentView: View { - var confirmation: Confirmation + var continuation: UnsafeContinuation @State private var toggle = false @@ -18,16 +18,16 @@ struct StateCompatibilityTests { .onAppear { toggle.toggle() if toggle { - confirmation() + continuation.resume() } } } } - try await triggerLayoutWithWindow { confirmation in + try await triggerLayoutWithWindow { continuation in PlatformHostingController( rootView: ContentView( - confirmation: confirmation + continuation: continuation ) ) }