Add PublishedDefaultTests

This commit is contained in:
ribilynn 2023-03-09 18:21:37 +09:00
parent 66e083fc7d
commit a80432e90b
1 changed files with 83 additions and 0 deletions

View File

@ -0,0 +1,83 @@
import XCTest
import Combine
import Defaults
@available(macOS 11.0, iOS 15.0, tvOS 15.0, watchOS 8.0, *)
private extension Defaults.Keys {
static let opacity = Key<Double>("opacity", default: 0.5)
}
@available(macOS 11.0, iOS 15.0, tvOS 15.0, watchOS 8.0, *)
final class ViewModel: ObservableObject {
@PublishedDefault(.opacity) var opacity
}
@available(macOS 11.0, iOS 15.0, tvOS 15.0, watchOS 8.0, *)
final class DefaultsPublishedDefaultTests: XCTestCase {
var cancellables: [AnyCancellable] = []
override func setUp() {
Defaults.removeAll()
}
override func tearDown() {
cancellables = []
}
func testObjectWillChange() {
let viewModel = ViewModel()
let objectExpectation = expectation(description: "Expected ObservableObject's fire")
viewModel.objectWillChange
.sink {
objectExpectation.fulfill()
}
.store(in: &cancellables)
viewModel.opacity = 1
waitForExpectations(timeout: 1)
XCTAssertEqual(viewModel.opacity, 1)
XCTAssertEqual(Defaults[.opacity], 1)
}
func testProjectValue() {
let viewModel = ViewModel()
let valueExpectation = expectation(description: "Expected Opacity Value")
var receivedValue: Double?
viewModel.$opacity
// skip the initial value
.dropFirst()
.sink { newValue in
receivedValue = newValue
valueExpectation.fulfill()
}
.store(in: &cancellables)
// Changing value via Defaults directly also fire the projecttedValue
Defaults[.opacity] = 1
waitForExpectations(timeout: 1)
XCTAssertEqual(receivedValue, 1)
}
func testObservation() {
let viewModel = ViewModel()
// To enable Defaults observation, call observeDefaults.
viewModel.observeDefaults()
let objectExpectation = expectation(description: "Expected ObservableObject's fire")
viewModel.objectWillChange
.sink {
objectExpectation.fulfill()
}
.store(in: &cancellables)
// Change value via Defaults instead of ObservableObject itself
Defaults[.opacity] = 1
waitForExpectations(timeout: 1)
XCTAssertEqual(viewModel.opacity, 1)
}
}