From 0c480ac5a04b0c702401503830a726ee0ebca40e Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sun, 16 Apr 2023 17:14:19 +0200 Subject: [PATCH] Implemented the Dependency property wrapper. --- .../Property Wrappers/Dependency.swift | 31 ++++++++ .../Property Wrappers/DependencyTests.swift | 73 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 Sources/Dependencies/Property Wrappers/Dependency.swift create mode 100644 Tests/Dependencies/Property Wrappers/DependencyTests.swift diff --git a/Sources/Dependencies/Property Wrappers/Dependency.swift b/Sources/Dependencies/Property Wrappers/Dependency.swift new file mode 100644 index 0000000..ebe96fe --- /dev/null +++ b/Sources/Dependencies/Property Wrappers/Dependency.swift @@ -0,0 +1,31 @@ +// +// Dependency.swift +// Dependencies +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +/// This property wrapper provides a direct connection to the `DependencyService` service. +@propertyWrapper +public struct Dependency { + + // MARK: Properties + + private let keyPath: WritableKeyPath + + /// This property allows direct read/write access to a defined dependency attached to a selected key path. + public var wrappedValue: D { + get { DependencyService[keyPath] } + set { DependencyService[keyPath] = newValue } + } + + // MARK: Initialisers + + /// Initialise the property wrapper by setting a key path to a defined dependency. + /// - Parameter keyPath: A key path to a defined dependency in the `DependencyService` service. + public init(_ keyPath: WritableKeyPath) { + self.keyPath = keyPath + } + +} diff --git a/Tests/Dependencies/Property Wrappers/DependencyTests.swift b/Tests/Dependencies/Property Wrappers/DependencyTests.swift new file mode 100644 index 0000000..ce0e8fb --- /dev/null +++ b/Tests/Dependencies/Property Wrappers/DependencyTests.swift @@ -0,0 +1,73 @@ +// +// DependencyTests.swift +// DependenciesTests +// +// Created by Javier Cicchelli on 11/04/2023. +// Copyright © 2023 Röck+Cöde. All rights reserved. +// + +import Dependencies +import XCTest + +final class DependencyTests: XCTestCase { + + // MARK: Properties + + private var subject: TestSubject! + + // MARK: Setup + + override func setUp() { + DependencyService[\.testService] = SomeService() + } + + // MARK: Tests + + func test_readTestService() { + // GIVEN + subject = .init() + + // WHEN + let service = subject.testService + + // THEN + XCTAssertNotNil(service) + XCTAssert(service is SomeService) + } + + func test_writeDependencyKey() async throws { + // GIVEN + subject = .init() + + subject.testService = SomeOtherService() + + // WHEN + let service = DependencyService[\.testService] + + // THEN + XCTAssertNotNil(service) + XCTAssert(service is SomeOtherService) + } + + func test_writeDependencyKeyTwice() async throws { + // GIVEN + subject = .init() + + subject.testService = SomeOtherService() + subject.testService = SomeService() + + // WHEN + let service = DependencyService[\.testService] + + // THEN + XCTAssertNotNil(service) + XCTAssert(service is SomeService) + } + +} + +// MARK: - TestSubject + +private struct TestSubject { + @Dependency(\.testService) var testService +}