-
Notifications
You must be signed in to change notification settings - Fork 276
/
ClosureTest.swift
215 lines (126 loc) · 4.7 KB
/
ClosureTest.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
//
// ClosureTest.swift
// SwiftStructures
//
// Created by Wayne Bishop on 6/1/15.
// Copyright (c) 2015 Arbutus Software Inc. All rights reserved.
//
import UIKit
import XCTest
@testable import SwiftStructures
class ClosureTest: XCTestCase {
var numberList: Array<Int>!
override func setUp() {
super.setUp()
numberList = [8, 5, 2, 10, 9, 7]
}
/*
notes: This test class mimics the map & filter array
functions found in the Swift standard library. Optimized for linked lists, each test
demonstrates the nessesary syntax to implement a closure as an inline expression or standard function.
See additional closure examples with GraphTest.swift and AVLTest.swift.
*/
//MARK: filter closures
//filter based on expression
func testLinkFilterExpression() {
let linkedList: LinkedList<Int> = self.buildLinkedList()
//inline closure expression
let results: LinkedList<Int>! = linkedList.filter { (node: LLNode<Int>) -> Bool in
return node.key! > 5
}
//display filtered results
results.printAllKeys()
if results.count == linkedList.count {
XCTFail("linked list not filtered..")
}
}
//filter based on function
func testLinkFilterFunction() {
let linkedList: LinkedList<Int> = self.buildLinkedList()
//pass formula as parameter
let results: LinkedList<Int>! = linkedList.filter(filterFormula)
//print results
results.printAllKeys()
if results.count == linkedList.count {
XCTFail("linked list not filtered..")
}
}
//MARK: map closures
//map based on expression
func testLinkMapExpression() {
let linkedList: LinkedList<Int> = self.buildLinkedList()
//inline closure expression
let results: LinkedList<Int> = linkedList.map { (node: LLNode<Int>) -> Int in
var value: Int = 0
if let key = node.key {
//evaluate based on switch
switch key {
case 0..<5:
value = key * 2
case 5...10:
value = key * 3
default:
value = key
}
}
return value
} //end closure
//print results
results.printAllKeys()
//iterate and compare values
for s in 0..<numberList.count {
if linkedList.find(at: s)?.key == results.find(at: s)?.key {
XCTFail("test failed: linked list map formula not applied..")
}
}
}
//map based on function
func testLinkMapFunction() {
let linkedList: LinkedList<Int> = self.buildLinkedList()
//pass formula as parameter
let results: LinkedList<Int>! = linkedList.map(mapFormula)
//print results
results.printAllKeys()
//iterate and compare values
for s in 0..<numberList.count {
if linkedList.find(at: s)?.key == results.find(at: s)?.key {
XCTFail("linked list map formula not applied..")
}
}
}
//MARK: helper functions
//function to be passed as a parameter
func filterFormula(node: LLNode<Int>) -> Bool {
return node.key! > 5
}
//function to be passed as a parameter
func mapFormula(node: LLNode<Int>) -> Int {
var value: Int = 0
if let key = node.key {
//evaluate based on switch
switch key {
case 0..<5:
value = key * 2
case 5...10:
value = key * 3
default:
value = key
}
}
return value
}
//helper method to build list
func buildLinkedList() ->LinkedList<Int>! {
//create a new instance
let linkedList: LinkedList<Int> = LinkedList<Int>()
//append list items
for number in numberList {
linkedList.append(element: number)
}
if (linkedList.count != numberList.count) {
XCTFail("linked list count doesn't match number list..")
return nil
}
return linkedList
}
}