From 0c946f1b8aff22bf2b33df2cf1472043b305911e Mon Sep 17 00:00:00 2001 From: Felix Jendrusch Date: Tue, 21 Apr 2015 00:57:25 +0200 Subject: [PATCH] Update specs --- Pistachio.xcodeproj/project.pbxproj | 39 +++++++++-- PistachioTests/DictionaryAdapterSpec.swift | 10 +-- .../Extensions/LensExtensionsSpec.swift | 69 +++++++++++++++++++ PistachioTests/Fixtures/Counter.swift | 25 +++++++ PistachioTests/Fixtures/Node.swift | 6 +- .../AnyObjectValueTransformers.swift | 11 +++ PistachioTests/LazyAdapterSpec.swift | 26 +++++++ 7 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 PistachioTests/Extensions/LensExtensionsSpec.swift create mode 100644 PistachioTests/Fixtures/Counter.swift create mode 100644 PistachioTests/LazyAdapterSpec.swift diff --git a/Pistachio.xcodeproj/project.pbxproj b/Pistachio.xcodeproj/project.pbxproj index 3b460d5..051ce26 100644 --- a/Pistachio.xcodeproj/project.pbxproj +++ b/Pistachio.xcodeproj/project.pbxproj @@ -7,10 +7,12 @@ objects = { /* Begin PBXBuildFile section */ - DC13E2411A87D3F9006DC3CA /* DictionaryAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* DictionaryAdapterSpec.swift */; }; + DC13E2411A87D3F9006DC3CA /* LazyAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */; }; DC2077CF1A8544D7005A9CF2 /* AdapterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */; }; DC20783B1A868B00005A9CF2 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC2078391A868B00005A9CF2 /* Nimble.framework */; }; DC20783C1A868B00005A9CF2 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC20783A1A868B00005A9CF2 /* Quick.framework */; }; + DC374CDA1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */; }; + DC374CDB1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */; }; DC492A121A83BB59007B52D6 /* Pistachio.h in Headers */ = {isa = PBXBuildFile; fileRef = DC492A111A83BB59007B52D6 /* Pistachio.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC492A181A83BB59007B52D6 /* Pistachio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC492A0C1A83BB59007B52D6 /* Pistachio.framework */; }; DC516CCE1ADAEDAC006112F2 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CCD1ADAEDAC006112F2 /* Result.framework */; }; @@ -45,7 +47,7 @@ DCA767961ACEAC7D007E4C12 /* Pistachio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA7678B1ACEAC7C007E4C12 /* Pistachio.framework */; }; DCA767A81ACEAD38007E4C12 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767A61ACEAD38007E4C12 /* Nimble.framework */; }; DCA767A91ACEAD38007E4C12 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767A71ACEAD38007E4C12 /* Quick.framework */; }; - DCA767AF1ACEADA4007E4C12 /* DictionaryAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* DictionaryAdapterSpec.swift */; }; + DCA767AF1ACEADA4007E4C12 /* LazyAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */; }; DCA767B41ACEADB1007E4C12 /* AdapterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */; }; DCA767B81ACEADB4007E4C12 /* Pistachio.h in Headers */ = {isa = PBXBuildFile; fileRef = DC492A111A83BB59007B52D6 /* Pistachio.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCA767BA1ACEAF17007E4C12 /* ValueTransformer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767B91ACEAF17007E4C12 /* ValueTransformer.framework */; }; @@ -59,6 +61,10 @@ DCCF43E21AE2C82E009E0012 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E01AE2C82E009E0012 /* Node.swift */; }; DCCF43E51AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */; }; DCCF43E61AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */; }; + DCCF43E81AE461E1009E0012 /* Counter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E71AE461E1009E0012 /* Counter.swift */; }; + DCCF43E91AE461E1009E0012 /* Counter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E71AE461E1009E0012 /* Counter.swift */; }; + DCCF43EB1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */; }; + DCCF43EC1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -116,10 +122,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - DC13E2401A87D3F9006DC3CA /* DictionaryAdapterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryAdapterSpec.swift; sourceTree = ""; }; + DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyAdapterSpec.swift; sourceTree = ""; }; DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterType.swift; sourceTree = ""; }; DC2078391A868B00005A9CF2 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = ""; }; DC20783A1A868B00005A9CF2 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = ""; }; + DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LensExtensionsSpec.swift; sourceTree = ""; }; DC492A0C1A83BB59007B52D6 /* Pistachio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pistachio.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DC492A101A83BB59007B52D6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DC492A111A83BB59007B52D6 /* Pistachio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Pistachio.h; sourceTree = ""; }; @@ -147,6 +154,8 @@ DCCF43DC1AE29E43009E0012 /* DictionaryAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryAdapter.swift; sourceTree = ""; }; DCCF43E01AE2C82E009E0012 /* Node.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyObjectValueTransformers.swift; sourceTree = ""; }; + DCCF43E71AE461E1009E0012 /* Counter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Counter.swift; sourceTree = ""; }; + DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryAdapterSpec.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -199,6 +208,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + DC374CD81AE5B71E00A37122 /* Extensions */ = { + isa = PBXGroup; + children = ( + DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */, + ); + name = Extensions; + path = PistachioTests/Extensions; + sourceTree = SOURCE_ROOT; + }; DC492A021A83BB59007B52D6 = { isa = PBXGroup; children = ( @@ -245,7 +263,9 @@ DC492A1B1A83BB59007B52D6 /* PistachioTests */ = { isa = PBXGroup; children = ( - DC13E2401A87D3F9006DC3CA /* DictionaryAdapterSpec.swift */, + DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */, + DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */, + DC374CD81AE5B71E00A37122 /* Extensions */, DCCF43DF1AE2C807009E0012 /* Fixtures */, DC492A1C1A83BB59007B52D6 /* Supporting Files */, ); @@ -309,6 +329,7 @@ DCCF43DF1AE2C807009E0012 /* Fixtures */ = { isa = PBXGroup; children = ( + DCCF43E71AE461E1009E0012 /* Counter.swift */, DCCF43E01AE2C82E009E0012 /* Node.swift */, DCCF43E31AE2E770009E0012 /* Value Transformers */, ); @@ -519,8 +540,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DC13E2411A87D3F9006DC3CA /* DictionaryAdapterSpec.swift in Sources */, + DCCF43EB1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */, + DC13E2411A87D3F9006DC3CA /* LazyAdapterSpec.swift in Sources */, DCCF43E11AE2C82E009E0012 /* Node.swift in Sources */, + DCCF43E81AE461E1009E0012 /* Counter.swift in Sources */, + DC374CDA1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */, DCCF43E51AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -541,8 +565,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DCA767AF1ACEADA4007E4C12 /* DictionaryAdapterSpec.swift in Sources */, + DCCF43EC1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */, + DCA767AF1ACEADA4007E4C12 /* LazyAdapterSpec.swift in Sources */, DCCF43E21AE2C82E009E0012 /* Node.swift in Sources */, + DCCF43E91AE461E1009E0012 /* Counter.swift in Sources */, + DC374CDB1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */, DCCF43E61AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/PistachioTests/DictionaryAdapterSpec.swift b/PistachioTests/DictionaryAdapterSpec.swift index fc7c504..7e2cd1f 100644 --- a/PistachioTests/DictionaryAdapterSpec.swift +++ b/PistachioTests/DictionaryAdapterSpec.swift @@ -8,18 +8,18 @@ import Pistachio class DictionaryAdapterSpec: QuickSpec { override func spec() { describe("A DictionaryAdapter") { - let adapter = NodeAdapters.anyObject + var adapter = CounterAdapters.anyObject it("should transform a value") { - let result = adapter.transform(Node(children: [ Node(children: []) ])) + let result = adapter.transform(Counter(count: 1)) - expect(((result.value as? [String: AnyObject])?["children"] as? [AnyObject])?.count).to(equal(1)) + expect((result.value as? [String: AnyObject])?["count"] as? Int).to(equal(1)) } it("should reverse transform a value") { - let result = adapter.reverseTransform([ "children": [ [ "children": [] ] ] ]) + let result = adapter.reverseTransform([ "count": 1 ]) - expect(result.value?.children.count).to(equal(1)) + expect(result.value).to(equal(Counter(count: 1))) } } } diff --git a/PistachioTests/Extensions/LensExtensionsSpec.swift b/PistachioTests/Extensions/LensExtensionsSpec.swift new file mode 100644 index 0000000..086a8bf --- /dev/null +++ b/PistachioTests/Extensions/LensExtensionsSpec.swift @@ -0,0 +1,69 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Quick +import Nimble + +import Result +import Monocle +import Pistachio + +class LensExtensionsSpec: QuickSpec { + override func spec() { + describe("Lifted lenses") { + context("for results") { + let counter = Counter(count: 1) + let error = NSError() + + let lifted: Lens, Result> = lift(CounterLenses.count) + + it("should get values") { + let result = get(lifted, Result.success(counter)) + + expect(result.value).to(equal(1)) + } + + it("should return structure failures on get") { + let result = get(lifted, Result.failure(error)) + + expect(result.error).to(beIdenticalTo(error)) + } + + it("should set values") { + let result = set(lifted, Result.success(counter), Result.success(1)) + + expect(result.value?.count).to(equal(1)) + } + + it("should return structure failures on set") { + let result = set(lifted, Result.failure(error), Result.success(1)) + + expect(result.error).to(beIdenticalTo(error)) + } + + it("should return value failures on set") { + let result = set(lifted, Result.success(counter), Result.failure(error)) + + expect(result.error).to(beIdenticalTo(error)) + } + } + } + + describe("Mapped lenses") { + let counter = Counter(count: 0) + + let mapped = map(CounterLenses.count, AnyObjectValueTransformers.int) + + it("should get values") { + let result = get(mapped, Result.success(counter)) + + expect(result.value as? Int).to(equal(0)) + } + + it("should set values") { + let result = set(mapped, Result.success(counter), Result.success(2)) + + expect(result.value?.count).to(equal(2)) + } + } + } +} diff --git a/PistachioTests/Fixtures/Counter.swift b/PistachioTests/Fixtures/Counter.swift new file mode 100644 index 0000000..e48c29d --- /dev/null +++ b/PistachioTests/Fixtures/Counter.swift @@ -0,0 +1,25 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import ValueTransformer +import Monocle +import Pistachio + +struct Counter: Equatable { + var count: Int +} + +func == (lhs: Counter, rhs: Counter) -> Bool { + return lhs.count == rhs.count +} + +struct CounterLenses { + static let count = Lens(get: { $0.count }, set: { (inout counter: Counter, count) in + counter.count = count + }) +} + +struct CounterAdapters { + static let anyObject = DictionaryAdapter(specification: [ + "count": map(CounterLenses.count, AnyObjectValueTransformers.int) + ], dictionaryTransformer: AnyObjectValueTransformers.dictionary, value: Counter(count: 0)) +} diff --git a/PistachioTests/Fixtures/Node.swift b/PistachioTests/Fixtures/Node.swift index 24957a4..43fa8b4 100644 --- a/PistachioTests/Fixtures/Node.swift +++ b/PistachioTests/Fixtures/Node.swift @@ -4,10 +4,14 @@ import ValueTransformer import Monocle import Pistachio -struct Node { +struct Node: Equatable { var children: [Node] } +func == (lhs: Node, rhs: Node) -> Bool { + return lhs.children == rhs.children +} + struct NodeLenses { static let children = Lens(get: { $0.children }, set: { (inout node: Node, children) in node.children = children diff --git a/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift b/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift index cfbe27e..15861e5 100644 --- a/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift +++ b/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift @@ -4,6 +4,17 @@ import Result import ValueTransformer struct AnyObjectValueTransformers { + static let int = ReversibleValueTransformer(transformClosure: { value in + return Result.success(value) + }, reverseTransformClosure: { transformedValue in + switch transformedValue { + case let transformedValue as Int: + return Result.success(transformedValue) + default: + return Result.failure(NSError()) + } + }) + static let array = ReversibleValueTransformer<[AnyObject], AnyObject, NSError>(transformClosure: { value in return Result.success(value) }, reverseTransformClosure: { transformedValue in diff --git a/PistachioTests/LazyAdapterSpec.swift b/PistachioTests/LazyAdapterSpec.swift new file mode 100644 index 0000000..7d22eb5 --- /dev/null +++ b/PistachioTests/LazyAdapterSpec.swift @@ -0,0 +1,26 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Quick +import Nimble + +import Pistachio + +class LazyAdapterSpec: QuickSpec { + override func spec() { + describe("A LazyAdapter") { + let adapter = NodeAdapters.anyObject + + it("should transform a value") { + let result = adapter.transform(Node(children: [ Node(children: []) ])) + + expect(((result.value as? [String: AnyObject])?["children"] as? [AnyObject])?.count).to(equal(1)) + } + + it("should reverse transform a value") { + let result = adapter.reverseTransform([ "children": [ [ "children": [] ] ] ]) + + expect(result.value).to(equal(Node(children: [ Node(children: []) ]))) + } + } + } +}