Skip to content

Instantly share code, notes, and snippets.

@to4iki
Created March 11, 2018 10:03
Show Gist options
  • Save to4iki/b3576082f679c2b2f028c4b290c517b7 to your computer and use it in GitHub Desktop.
Save to4iki/b3576082f679c2b2f028c4b290c517b7 to your computer and use it in GitHub Desktop.
Minimal Cake Pattern
import Foundation
// See also: https://qiita.com/pab_tech/items/1c0bdbc8a61949891f1f
protocol Clock {
var now: Date { get }
}
struct SystemClock: Clock {
let now: Date = Date()
}
/// Uses
protocol UsesClock {
var clock: Clock { get }
}
/// MixIn
protocol MixInClock: UsesClock {}
extension MixInClock {
var clock: Clock { return SystemClock() }
}
/// Service
protocol ClockService: UsesClock {}
/// Production
struct SystemClockService: ClockService, MixInClock {
static let shared = SystemClockService()
private init () {}
}
/// Test
protocol MockMixInClock: UsesClock {}
extension MockMixInClock {
var clock: Clock { return MockClock() }
}
struct MockClock: Clock {
var now: Date { return Date(timeIntervalSince1970: 0) }
}
struct MockClockService: ClockService, MockMixInClock {
static let shared = MockClockService()
private init () {}
}
/// Run
func printDate(service: ClockService) {
print(service.clock.now)
}
printDate(service: SystemClockService.shared)
printDate(service: MockClockService.shared)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment