Skip to content

Commit c421399

Browse files
authored
Merge pull request #67 from Maks-Jago/1.4.8
1.4.8
2 parents 20fcff3 + f38f281 commit c421399

File tree

17 files changed

+644
-132
lines changed

17 files changed

+644
-132
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ let package = Package(
77
name: "SwiftUI-UDF",
88
platforms: [
99
.iOS(.v16),
10-
.macOS(.v13),
10+
.macOS(.v12),
1111
],
1212
products: [
1313
.library(

Tests/SwiftUI-UDF-ConcurrencyTests/ContainersRedrawing/ContainerScopeTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ final class ContainerScopeTests: XCTestCase {
5252
func test_componentRenderingAfterStateMutation() async {
5353
let store = EnvironmentStore(initial: AppState(), logger: TestStoreLogger())
5454

55-
let itemsContainer = ItemsListContainer()
55+
let itemsContainer = await ItemsListContainer()
5656
let window = await PlatformWindow.render(container: itemsContainer)
5757

5858
store.dispatch(Actions.UpdateFormField(keyPath: \PlainForm.title, value: "title 1"))
5959
await fulfill(description: "waiting for rendering", sleep: 1)
60-
print(window) // To force a window redraw
60+
await window.redraw()
6161
await fulfill(description: "waiting for rendering", sleep: 1)
6262

6363
XCTAssertEqual(itemsContainer.renderingNumber, 2)
@@ -66,7 +66,7 @@ final class ContainerScopeTests: XCTestCase {
6666
func test_rootComponentRendering() async {
6767
let store = EnvironmentStore(initial: AppState(), logger: TestStoreLogger())
6868

69-
let rootContainer = RootContainer()
69+
let rootContainer = await RootContainer()
7070
let window = await PlatformWindow.render(container: rootContainer)
7171

7272
store.dispatch(Actions.UpdateFormField(keyPath: \PlainForm.title, value: "title 1"))
@@ -76,21 +76,21 @@ final class ContainerScopeTests: XCTestCase {
7676
store.dispatch(Actions.UpdateFormField(keyPath: \UserData.isUserLoggedIn, value: true))
7777
await fulfill(description: "waiting for rendering", sleep: 1)
7878

79-
print(window) // To force a window redraw
79+
await window.redraw()
8080
await fulfill(description: "waiting for rendering", sleep: 1)
8181
XCTAssertEqual(rootContainer.renderingNumber, 2)
8282

8383
store.dispatch(Actions.UpdateFormField(keyPath: \UserData.isUserLoggedIn, value: false))
8484
await fulfill(description: "waiting for rendering", sleep: 1)
8585

86-
print(window) // To force a window redraw
86+
await window.redraw()
8787
await fulfill(description: "waiting for rendering", sleep: 1)
8888
XCTAssertEqual(rootContainer.renderingNumber, 3)
8989

9090
store.dispatch(Actions.UpdateFormField(keyPath: \PlainForm.title, value: "title 2"))
9191
await fulfill(description: "waiting for rendering", sleep: 1)
9292

93-
print(window) // To force a window redraw
93+
await window.redraw()
9494
await fulfill(description: "waiting for rendering", sleep: 1)
9595
XCTAssertEqual(rootContainer.renderingNumber, 3)
9696
}

Tests/SwiftUI-UDF-ConcurrencyTests/ContainersRedrawing/ContainerWithAppStateAsScopeTests.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ final class ContainerWithAppStateAsScopeTests: XCTestCase {
4545
#if os(iOS)
4646
func test_rootComponentRendering() async {
4747
let store = EnvironmentStore(initial: AppState(), logger: TestStoreLogger())
48-
let rootContainer = RootContainer()
48+
let rootContainer = await RootContainer()
4949
let window = await PlatformWindow.render(container: rootContainer)
5050

5151
XCTAssertEqual(rootContainer.renderingNumber, 0)
@@ -55,35 +55,35 @@ final class ContainerWithAppStateAsScopeTests: XCTestCase {
5555
store.dispatch(Actions.UpdateFormField(keyPath: \PlainForm.title, value: "title 1"))
5656
await fulfill(description: "waiting for rendering", sleep: 1)
5757

58-
print(window) // To force a window redraw
58+
await window.redraw()
5959
await fulfill(description: "waiting for rendering", sleep: 1)
6060
XCTAssertEqual(rootContainer.renderingNumber, 2)
6161

6262
store.dispatch(Actions.UpdateFormField(keyPath: \UserData.isUserLoggedIn, value: true))
6363
await fulfill(description: "waiting for rendering", sleep: 1)
6464

65-
print(window) // To force a window redraw
65+
await window.redraw()
6666
await fulfill(description: "waiting for rendering", sleep: 1)
6767
XCTAssertEqual(rootContainer.renderingNumber, 3)
6868

6969
store.dispatch(Actions.UpdateFormField(keyPath: \UserData.isUserLoggedIn, value: false))
7070
await fulfill(description: "waiting for rendering", sleep: 1)
7171

72-
print(window) // To force a window redraw
72+
await window.redraw()
7373
await fulfill(description: "waiting for rendering", sleep: 1)
7474
XCTAssertEqual(rootContainer.renderingNumber, 4)
7575

7676
store.dispatch(Actions.UpdateFormField(keyPath: \PlainForm.title, value: "title 2"))
7777
await fulfill(description: "waiting for rendering", sleep: 1)
7878

79-
print(window) // To force a window redraw
79+
await window.redraw()
8080
await fulfill(description: "waiting for rendering", sleep: 1)
8181
XCTAssertEqual(rootContainer.renderingNumber, 5)
8282
}
8383

8484
func test_noneScope() async {
8585
let store = EnvironmentStore(initial: AppState(), logger: TestStoreLogger())
86-
let noneScopeContainer = NoneScopeContainer()
86+
let noneScopeContainer = await NoneScopeContainer()
8787
let window = await PlatformWindow.render(container: noneScopeContainer)
8888

8989
XCTAssertEqual(noneScopeContainer.renderingNumber, 0)
@@ -93,7 +93,7 @@ final class ContainerWithAppStateAsScopeTests: XCTestCase {
9393
store.dispatch(Actions.UpdateFormField(keyPath: \PlainForm.title, value: "title 1"))
9494
await fulfill(description: "waiting for rendering", sleep: 1)
9595

96-
print(window) // To force a window redraw
96+
await window.redraw()
9797
XCTAssertEqual(noneScopeContainer.renderingNumber, 1)
9898
}
9999
#endif

Tests/SwiftUI-UDF-Tests/BindableReducers/BindableReducersMiddlewareTests.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ final class BindableReducersMiddlewareTests: XCTestCase {
3636
}
3737
}
3838

39+
struct ItemReducible: UDF.Reducible {
40+
var didLoadItemReduced: Int = 0
41+
42+
mutating func reduce(_ action: some Action) {
43+
switch action {
44+
case is Actions.DidLoadItem<Item>:
45+
didLoadItemReduced += 1
46+
47+
default:
48+
break
49+
}
50+
}
51+
}
52+
3953
enum ItemsFlow: IdentifiableFlow {
4054
case none, loading
4155

@@ -60,6 +74,8 @@ final class BindableReducersMiddlewareTests: XCTestCase {
6074

6175
@BindableReducer(ItemsFlow.self, bindedTo: ItemsContainer.self)
6276
fileprivate var itemsFlow
77+
78+
var itemReducible = ItemReducible()
6379
}
6480

6581
func test_WhenLoadingDataForBindableReducers_OnleConcreteInstanceOfBindableFormShouldBeUpdated() async throws {
@@ -104,6 +120,33 @@ final class BindableReducersMiddlewareTests: XCTestCase {
104120
let itemsForm4: ItemsForm = try await XCTUnwrapAsync(await store.state.itemsForm[Item.ID(value: 4)])
105121
XCTAssertNotNil(itemsForm4.item)
106122
}
123+
124+
func test_WhenDispatchingBindedAction_DuplicationShouldBePrevented() async throws {
125+
let store = await XCTestStore(initial: AppState())
126+
await store.subscribe(ItemsMiddleware.self)
127+
128+
await store.dispatch(Actions._OnContainerDidLoad(containerType: ItemsContainer.self, id: .init(value: 1)))
129+
130+
let bindedReducersFormCount = try await XCTUnwrapAsync(await store.state.itemsForm).reducers.count
131+
XCTAssertEqual(bindedReducersFormCount, 1)
132+
133+
let bindedReducersFlowCount = try await XCTUnwrapAsync(await store.state.itemsFlow).reducers.count
134+
XCTAssertEqual(bindedReducersFlowCount, 1)
135+
136+
await store.dispatch(
137+
ActionGroup {
138+
Actions.LoadItem(id: .init(value: 1))
139+
}.binded(to: ItemsContainer.self, by: Item.ID(value: 1))
140+
)
141+
142+
await store.wait()
143+
144+
let itemsForm1: ItemsForm = try await XCTUnwrapAsync(await store.state.itemsForm[Item.ID(value: 1)])
145+
let itemsReducer = try await XCTUnwrapAsync(await store.state.itemReducible)
146+
147+
XCTAssertNotNil(itemsForm1.item)
148+
XCTAssertEqual(itemsReducer.didLoadItemReduced, 1)
149+
}
107150
}
108151

109152
// MARK: Actions

0 commit comments

Comments
 (0)