Skip to content

Commit

Permalink
Merge pull request #5 from rheinfabrik/feature/nimble-matchers
Browse files Browse the repository at this point in the history
Nimble expectation
  • Loading branch information
tibr committed May 21, 2015
2 parents 66579df + f4e4f65 commit 1f4e98f
Show file tree
Hide file tree
Showing 11 changed files with 75 additions and 34 deletions.
1 change: 1 addition & 0 deletions Cartfile
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
github "robrix/Box" ~> 1.2
github "Quick/Nimble" ~> 0.4
1 change: 0 additions & 1 deletion Cartfile.private
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
github "Quick/Quick" ~> 0.3
github "Quick/Nimble" ~> 0.4
64 changes: 54 additions & 10 deletions Dobby.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
/* Begin PBXBuildFile section */
DC3CFE711ADE6B8A004728C2 /* Interaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE701ADE6B8A004728C2 /* Interaction.swift */; };
DC3CFE721ADE6D31004728C2 /* Interaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE701ADE6B8A004728C2 /* Interaction.swift */; };
DC3CFE781ADE895E004728C2 /* FoundationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE771ADE895E004728C2 /* FoundationExtensions.swift */; };
DC3CFE791ADE895E004728C2 /* FoundationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE771ADE895E004728C2 /* FoundationExtensions.swift */; };
DC3CFE781ADE895E004728C2 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE771ADE895E004728C2 /* SwiftExtensions.swift */; };
DC3CFE791ADE895E004728C2 /* SwiftExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE771ADE895E004728C2 /* SwiftExtensions.swift */; };
DC3CFE7D1ADE913B004728C2 /* InteractionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE7A1ADE903E004728C2 /* InteractionSpec.swift */; };
DC3CFE7E1ADE913C004728C2 /* InteractionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3CFE7A1ADE903E004728C2 /* InteractionSpec.swift */; };
DC7F6AFE1AD8291800CCBF6D /* Dobby.h in Headers */ = {isa = PBXBuildFile; fileRef = DC7F6AFD1AD8291800CCBF6D /* Dobby.h */; settings = {ATTRIBUTES = (Public, ); }; };
Expand Down Expand Up @@ -43,6 +43,10 @@
DC8452411ADBF743006AC5D4 /* ArgumentSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7F6B211AD8308A00CCBF6D /* ArgumentSpec.swift */; };
DC8452421ADBF743006AC5D4 /* MockSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7F6B241AD830A500CCBF6D /* MockSpec.swift */; };
DC8452431ADBF743006AC5D4 /* StubSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7F6B261AD830B500CCBF6D /* StubSpec.swift */; };
DC8581761AF76C2400DAA04E /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8581721AF76C2400DAA04E /* DSL.swift */; };
DC8581771AF76C2400DAA04E /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8581721AF76C2400DAA04E /* DSL.swift */; };
DC85817C1AF76C3A00DAA04E /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC7F6B281AD8313400CCBF6D /* Nimble.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
DC85817D1AF76C3E00DAA04E /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC8452331ADBF603006AC5D4 /* Nimble.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -91,7 +95,7 @@

/* Begin PBXFileReference section */
DC3CFE701ADE6B8A004728C2 /* Interaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interaction.swift; sourceTree = "<group>"; };
DC3CFE771ADE895E004728C2 /* FoundationExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoundationExtensions.swift; sourceTree = "<group>"; };
DC3CFE771ADE895E004728C2 /* SwiftExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftExtensions.swift; sourceTree = "<group>"; };
DC3CFE7A1ADE903E004728C2 /* InteractionSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InteractionSpec.swift; sourceTree = "<group>"; };
DC7F6AF81AD8291800CCBF6D /* Dobby.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Dobby.framework; sourceTree = BUILT_PRODUCTS_DIR; };
DC7F6AFC1AD8291800CCBF6D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
Expand All @@ -112,13 +116,15 @@
DC8452321ADBF603006AC5D4 /* Box.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Box.framework; path = Carthage/Build/Mac/Box.framework; sourceTree = "<group>"; };
DC8452331ADBF603006AC5D4 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/Mac/Nimble.framework; sourceTree = "<group>"; };
DC8452341ADBF603006AC5D4 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/Mac/Quick.framework; sourceTree = "<group>"; };
DC8581721AF76C2400DAA04E /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
DC7F6AF41AD8291800CCBF6D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DC85817C1AF76C3A00DAA04E /* Nimble.framework in Frameworks */,
DC7F6B171AD82A3F00CCBF6D /* Box.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -138,6 +144,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DC85817D1AF76C3E00DAA04E /* Nimble.framework in Frameworks */,
DC8452351ADBF6D8006AC5D4 /* Box.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -159,7 +166,7 @@
DC3CFE761ADE895E004728C2 /* Extensions */ = {
isa = PBXGroup;
children = (
DC3CFE771ADE895E004728C2 /* FoundationExtensions.swift */,
DC3CFE771ADE895E004728C2 /* SwiftExtensions.swift */,
);
path = Extensions;
sourceTree = "<group>";
Expand Down Expand Up @@ -194,6 +201,7 @@
DC7F6B1F1AD82D3800CCBF6D /* Mock.swift */,
DC7F6B1D1AD82B8C00CCBF6D /* Stub.swift */,
DC3CFE761ADE895E004728C2 /* Extensions */,
DC8581711AF76C2400DAA04E /* Nimble */,
DC7F6AFB1AD8291800CCBF6D /* Supporting Files */,
);
path = Dobby;
Expand Down Expand Up @@ -256,6 +264,14 @@
name = Mac;
sourceTree = "<group>";
};
DC8581711AF76C2400DAA04E /* Nimble */ = {
isa = PBXGroup;
children = (
DC8581721AF76C2400DAA04E /* DSL.swift */,
);
path = Nimble;
sourceTree = "<group>";
};
/* End PBXGroup section */

/* Begin PBXHeadersBuildPhase section */
Expand Down Expand Up @@ -432,8 +448,9 @@
buildActionMask = 2147483647;
files = (
DC3CFE711ADE6B8A004728C2 /* Interaction.swift in Sources */,
DC3CFE781ADE895E004728C2 /* FoundationExtensions.swift in Sources */,
DC3CFE781ADE895E004728C2 /* SwiftExtensions.swift in Sources */,
DC7F6B151AD8293B00CCBF6D /* Argument.swift in Sources */,
DC8581761AF76C2400DAA04E /* DSL.swift in Sources */,
DC7F6B1E1AD82B8C00CCBF6D /* Stub.swift in Sources */,
DC7F6B201AD82D3800CCBF6D /* Mock.swift in Sources */,
);
Expand All @@ -455,8 +472,9 @@
buildActionMask = 2147483647;
files = (
DC3CFE721ADE6D31004728C2 /* Interaction.swift in Sources */,
DC3CFE791ADE895E004728C2 /* FoundationExtensions.swift in Sources */,
DC3CFE791ADE895E004728C2 /* SwiftExtensions.swift in Sources */,
DC84523D1ADBF73C006AC5D4 /* Argument.swift in Sources */,
DC8581771AF76C2400DAA04E /* DSL.swift in Sources */,
DC8452401ADBF73C006AC5D4 /* Stub.swift in Sources */,
DC84523F1ADBF73C006AC5D4 /* Mock.swift in Sources */,
);
Expand Down Expand Up @@ -590,7 +608,12 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS";
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
INFOPLIST_FILE = Dobby/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
Expand All @@ -608,7 +631,12 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS";
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks",
"$(PROJECT_DIR)/Carthage/Build/iOS",
);
INFOPLIST_FILE = Dobby/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
Expand Down Expand Up @@ -658,7 +686,11 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/Mac";
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
"$(PROJECT_DIR)/Carthage/Build/Mac",
);
FRAMEWORK_VERSION = A;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
Expand All @@ -667,6 +699,10 @@
INFOPLIST_FILE = Dobby/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
OTHER_LDFLAGS = (
"-framework",
XCTest,
);
PRODUCT_NAME = "$(inherited)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
Expand All @@ -681,11 +717,19 @@
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/Mac";
FRAMEWORK_SEARCH_PATHS = (
"$(DEVELOPER_FRAMEWORKS_DIR)",
"$(PLATFORM_DIR)/Developer/Library/Frameworks",
"$(PROJECT_DIR)/Carthage/Build/Mac",
);
FRAMEWORK_VERSION = A;
INFOPLIST_FILE = Dobby/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
OTHER_LDFLAGS = (
"-framework",
XCTest,
);
PRODUCT_NAME = "$(inherited)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
Expand Down
2 changes: 1 addition & 1 deletion Dobby/Dobby.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#import <Foundation/Foundation.h>
@import Foundation;

//! Project version number for Dobby.
FOUNDATION_EXPORT double DobbyVersionNumber;
Expand Down
File renamed without changes.
2 changes: 0 additions & 2 deletions Dobby/Interaction.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import Foundation

public struct Interaction0: Equatable {

}
Expand Down
19 changes: 7 additions & 12 deletions Dobby/Mock.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import Foundation

public class Mock<Interaction: Equatable> {
public var interactions: [Interaction] = []

Expand All @@ -14,15 +12,12 @@ public func record<Interaction: Equatable>(mock: Mock<Interaction>, interaction:

// MARK: - Verification

public func verify<Interaction: Equatable, S: SequenceType where S.Generator.Element == Interaction>(mock: Mock<Interaction>, interactions: S) -> Bool {
var generator = interactions.generate()
var element = generator.next()

for interaction in mock.interactions {
if interaction == element {
element = generator.next()
public func contains<Interaction: Equatable>(mock: Mock<Interaction>, interactions: [Interaction]) -> Bool {
return isEmpty(reduce(mock.interactions, ArraySlice(interactions)) { interactions, interaction in
if interactions.first == interaction {
return interactions[1..<count(interactions)]
} else {
return interactions
}
}

return element == nil
})
}
5 changes: 5 additions & 0 deletions Dobby/Nimble/DSL.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import Nimble

public func verify<Interaction: Equatable>(mock: Mock<Interaction>, file: String = __FILE__, line: UInt = __LINE__) -> Expectation<[Interaction]> {
return expect(mock.interactions, file: file, line: line)
}
2 changes: 0 additions & 2 deletions Dobby/Stub.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import Foundation

public class Stub<Interaction: Equatable, ReturnValue> {
public var behavior: [(interaction: Interaction, returnValue: ReturnValue)] = []

Expand Down
6 changes: 3 additions & 3 deletions DobbyTests/MockSpec.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ class MockSpec: QuickSpec {

describe("Verifying interactions") {
it("should check in-order") {
expect(verify(mock, [])).to(beTrue())
expect(verify(mock, [ 1, 3 ])).to(beTrue())
expect(verify(mock, [ 3, 1 ])).to(beFalse())
expect(contains(mock, [])).to(beTrue())
expect(contains(mock, [ 1, 3 ])).to(beTrue())
expect(contains(mock, [ 3, 1 ])).to(beFalse())
}
}
}
Expand Down
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@ Interactions can be verified:
```swift
let myMock = MyMock()
myMock.myMethod("lowercase")
myMock.myMethod("another lowercase")

expect(verify(myMock.mock, [ "lowercase" ])).to(beTrue())
verify(myMock.mock).to(contain("another lowercase"))
```

## Stub
Expand Down Expand Up @@ -163,10 +164,10 @@ behave(stringToolsMock.concatStub, .Concat(any(), any()), "")
expect(stringToolsMock.uppercase("input")).to(equal("INPUT"))
expect(stringToolsMock.concat("first", "second")).to(equal(""))

expect(verify(stringToolsMock.mock, [
verify(stringToolsMock.mock).to(equal([
.Uppercase(value("input")),
.Concat(value("first"), value("second"))
])).to(beTrue())
]))
```

## About
Expand Down

0 comments on commit 1f4e98f

Please sign in to comment.