Skip to content

Commit e73a2c7

Browse files
committed
add tap.swift
1 parent 03738ca commit e73a2c7

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

json.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
9E5CC2DB1C5B1F2700A19CE8 /* tap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5CC2DA1C5B1F2700A19CE8 /* tap.swift */; };
1011
9E66B57619F5E3F30016A7C1 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E66B57519F5E3F30016A7C1 /* main.swift */; };
1112
9E66B57D19F5E46F0016A7C1 /* json.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E66B57C19F5E46F0016A7C1 /* json.swift */; };
1213
/* End PBXBuildFile section */
@@ -24,6 +25,7 @@
2425
/* End PBXCopyFilesBuildPhase section */
2526

2627
/* Begin PBXFileReference section */
28+
9E5CC2DA1C5B1F2700A19CE8 /* tap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = tap.swift; sourceTree = "<group>"; };
2729
9E66B57219F5E3F30016A7C1 /* json */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = json; sourceTree = BUILT_PRODUCTS_DIR; };
2830
9E66B57519F5E3F30016A7C1 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
2931
9E66B57C19F5E46F0016A7C1 /* json.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = json.swift; sourceTree = "<group>"; };
@@ -59,6 +61,7 @@
5961
9E66B57419F5E3F30016A7C1 /* json */ = {
6062
isa = PBXGroup;
6163
children = (
64+
9E5CC2DA1C5B1F2700A19CE8 /* tap.swift */,
6265
9E66B57519F5E3F30016A7C1 /* main.swift */,
6366
9E66B57C19F5E46F0016A7C1 /* json.swift */,
6467
);
@@ -125,6 +128,7 @@
125128
files = (
126129
9E66B57619F5E3F30016A7C1 /* main.swift in Sources */,
127130
9E66B57D19F5E46F0016A7C1 /* json.swift in Sources */,
131+
9E5CC2DB1C5B1F2700A19CE8 /* tap.swift in Sources */,
128132
);
129133
runOnlyForDeploymentPostprocessing = 0;
130134
};

json/tap.swift

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
//
2+
// tap.swift
3+
// tap
4+
//
5+
// Created by Dan Kogai on 1/21/16.
6+
// Copyright © 2016 Dan Kogai. All rights reserved.
7+
//
8+
#if os(Linux)
9+
import Glibc
10+
#else
11+
import Darwin
12+
#endif
13+
14+
public class TAP {
15+
var tests = 0, runs = [Bool]()
16+
public init() {}
17+
public init(tests:Int) {
18+
self.plan(tests)
19+
}
20+
/// sets the number of tests to run. call it before the first test
21+
public func plan(tests:Int) {
22+
self.tests = tests
23+
print("1..\(tests)")
24+
}
25+
/// ok if `predicate` is true
26+
public func ok(@autoclosure predicate:()->Bool, _ message:String = "")->Bool {
27+
let ok = predicate()
28+
runs.append(ok)
29+
let ornot = ok ? "" : "not "
30+
print("\(ornot)ok \(runs.count) - \(message)")
31+
return ok
32+
}
33+
/// ok if `actual` == `expected`
34+
public func eq<T:Equatable>(actual:T?, _ expected:T?, _ message:String = "")->Bool {
35+
if ok(actual == expected, message) { return true }
36+
print("# got: \(actual)")
37+
print("# expected: \(expected)")
38+
return false
39+
}
40+
/// ok if arrays are `actual` == `expected`
41+
public func eq<T:Equatable>(actual:[T], _ expected:[T], _ message:String = "")->Bool {
42+
if ok(actual == expected, message) { return true }
43+
print("# got: \(actual)")
44+
print("# expected: \(expected)")
45+
return false
46+
}
47+
/// ok if dictionaries are `actual` == `expected`
48+
public func eq<K:Hashable,V:Equatable>(actual:[K:V], _ expected:[K:V], _ message:String = "")->Bool {
49+
if ok(actual == expected, message) { return true }
50+
print("# got: \(actual)")
51+
print("# expected: \(expected)")
52+
return false
53+
}
54+
/// ok if `actual` != `expected`
55+
public func ne<T:Equatable>(actual:T?, _ expected:T?, _ message:String = "")->Bool {
56+
if ok(actual != expected, message) { return true }
57+
print("# got: \(actual)")
58+
print("# expected: anthing but \(expected)")
59+
return false
60+
}
61+
/// ok if arrays are `actual` == `expected`
62+
public func ne<T:Equatable>(actual:[T], _ expected:[T], _ message:String = "")->Bool {
63+
if ok(actual != expected, message) { return true }
64+
print("# got: \(actual)")
65+
print("# expected: anthing but \(expected)")
66+
return false
67+
}
68+
/// ok if dictionaries are `actual` == `expected`
69+
public func ne<K:Hashable,V:Equatable>(actual:[K:V], _ expected:[K:V], _ message:String = "")->Bool {
70+
if ok(actual != expected, message) { return true }
71+
print("# got: \(actual)")
72+
print("# expected: anthing but \(expected)")
73+
return false
74+
}
75+
/// checks the test results, print stuff if neccesary,
76+
/// and `exit()` with code == number of failures
77+
public func done(dontExit nx:Bool = false)->[Bool] {
78+
if runs.count == 0 && nx != true {
79+
print("# no test run!")
80+
exit(-1)
81+
}
82+
if tests == 0 {
83+
print("1..\(runs.count)")
84+
}
85+
else if runs.count != tests {
86+
print("not ok \(runs.count + 1) - planned to run \(tests) but actually ran \(runs.count)")
87+
runs.append(false)
88+
if nx != true { exit(-1) }
89+
}
90+
if nx != true {
91+
let code = min(254, runs.filter{ $0 == false }.count)
92+
exit(Int32(code))
93+
}
94+
return runs
95+
}
96+
deinit {
97+
done(dontExit:true)
98+
}
99+
}

0 commit comments

Comments
 (0)