Skip to content

Instantly share code, notes, and snippets.

View ncreated's full-sized avatar
💭
⚡️

Maciek Grzybowski ncreated

💭
⚡️
View GitHub Profile
@ncreated
ncreated / SecureStorageTests.swift
Created September 3, 2017 23:00
Medium blogpost snippet
func test_givenUnlockedSecureStorage_whenSavingValue_itCanBeLaterRead() {
let storage = SecureStorage<String>()
let unlockExpectation = self.expectation(description: "secure storage is unlocked")
let saveExpectation = self.expectation(description: "value is saved")
let readExpectation = self.expectation(description: "value is read")
storage.unlock { (unlocked) in
XCTAssertTrue(unlocked)
unlockExpectation.fulfill()
}
@ncreated
ncreated / LevelSelectionViewModelTests.swift
Created August 20, 2017 21:27
Medium blogpost snippet
class LevelSelectionViewModelTests: XCTestCase {
private var viewModel: LevelSelectionViewModel!
private var mockDelegate: MockLevelSelectionViewModelDelegate!
override func setUp() {
super.setUp()
let levels = [
Level(status: .unlocked, identifier: "abc"),
Level(status: .locked, identifier: "def")
@ncreated
ncreated / TaskTests.swift
Last active September 5, 2017 20:46
Medium blogpost snippet
private final class MockTaskStatusDelegate: TaskStatusDelegate {
var didCall_taskDidChangeStatus: ((Task, Task.Status) -> Void)?
func taskDidChangeStatus(task: Task, status: Task.Status) {
didCall_taskDidChangeStatus?(task, status)
}
}
class TaskTests: XCTestCase {
@ncreated
ncreated / ToggleValue.swift
Created August 11, 2017 22:17
Medium blogpost snippet
enum ToggleValue {
case initial(Bool)
case updated(Bool)
case fallback(Bool)
case unknown(Error)
}
@ncreated
ncreated / ToggleTests.swift
Created August 11, 2017 21:24
Medium blogpost snippet
func test_givenStorageThatSucceedsOnSave_whenChangingToggleValue_itEmitsUpdatedValue() {
let mockStorage = MockToggleStorage(readValue: true, saveShouldFail: false)
let simulatedValueSubject = PublishSubject<Bool>() // simulated user input
let toggle = Toggle(storage: mockStorage)
let initialValueExpectation = self.expectation(description: "will emit initial value")
let updatedValueExpectation = self.expectation(description: "will emit 2 updated values")
updatedValueExpectation.expectedFulfillmentCount = 2
let (value, _) = toggle.manage(change: simulatedValueSubject.asObservable())
var recordedValues: [ToggleValue] = []
@ncreated
ncreated / UISwitch.swift
Created August 11, 2017 17:07
Medium blogpost snippet
extension UISwitch {
func shake() {
transform = CGAffineTransform(translationX: 15, y: 0)
UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.2, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
self.transform = CGAffineTransform.identity
}, completion: nil)
}
}
@ncreated
ncreated / SettingsViewController.swift
Last active August 11, 2017 17:03
Medium blogpost snippet
private func setUp(settingSwitch: UISwitch, with toggle: Toggle) {
let (value, isBusy) = toggle.manage(change: settingSwitch.rx.isOn.changed.asObservable())
// ...
let fallbackValue = value
.filter { $0.isFallback }
.map { $0.value }
.flatMap { $0.map(Driver.just) ?? Driver.empty() } // .unwrap() if using `RxSwiftExt`
@ncreated
ncreated / SettingsViewController.swift
Created August 11, 2017 16:56
Medium blogpost snippet
private func setUp(settingSwitch: UISwitch, with toggle: Toggle) {
let (value, isBusy) = toggle.manage(change: settingSwitch.rx.isOn.changed.asObservable())
// ...
let isSwitchDisabled = isBusy
.map { !$0 }
isSwitchDisabled
.drive(settingSwitch.rx.isEnabled)
@ncreated
ncreated / ToggleValue.swift
Last active August 11, 2017 16:48
Medium blogpost snippet
extension ToggleValue {
var value: Bool? {
switch self {
case .initial(let value), .updated(let value), .fallback(let value):
return value
case .unknown:
return nil
}
}
@ncreated
ncreated / SettingsViewController.swift
Created August 11, 2017 16:43
Medium blogpost snippet
private func setUp(settingSwitch: UISwitch, with toggle: Toggle) {
let (value, isBusy) = toggle.manage(change: settingSwitch.rx.isOn.changed.asObservable())
let initialValue = value
.filter { $0.isInitial }
.map { $0.value }
.flatMap { $0.map(Driver.just) ?? Driver.empty() } // .unwrap() if using `RxSwiftExt`
let fallbackValue = value
.filter { $0.isFallback }