Skip to content

Commit 47e109a

Browse files
committed
Argument count fixed for binary custom functions
Closes stephencelis#481
1 parent 82451a2 commit 47e109a

File tree

3 files changed

+145
-12
lines changed

3 files changed

+145
-12
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
* Fix compilation problems when using Carthage ([#615][])
55
* Add "WITHOUT ROWID" table option ([#541][])
6+
* Argument count fixed for binary custom functions ([#481][])
67
* Documentation updates
78

89
0.11.2 (25-12-2016), [diff][diff-0.11.2]
@@ -32,6 +33,7 @@
3233
[diff-0.11.2]: https://github.com/stephencelis/SQLite.swift/compare/0.11.1...0.11.2
3334
[diff-0.11.3]: https://github.com/stephencelis/SQLite.swift/compare/0.11.2...0.11.3
3435

36+
[#481]: https://github.com/stephencelis/SQLit1e.swift/pull/481
3537
[#532]: https://github.com/stephencelis/SQLit1e.swift/issues/532
3638
[#541]: https://github.com/stephencelis/SQLit1e.swift/issues/541
3739
[#546]: https://github.com/stephencelis/SQLite.swift/issues/546

Sources/SQLite/Typed/CustomFunctions.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,60 +56,60 @@ public extension Connection {
5656
return { arg in fn([arg]) }
5757
}
5858

59-
public func createFunction<Z : Value, A : Value>(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z) throws -> ((Expression<A?>) -> Expression<Z>) {
59+
public func createFunction<Z : Value, A : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z) throws -> ((Expression<A?>) -> Expression<Z>) {
6060
let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) }
6161
return { arg in fn([arg]) }
6262
}
6363

64-
public func createFunction<Z : Value, A : Value>(function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z?) throws -> ((Expression<A>) -> Expression<Z?>) {
64+
public func createFunction<Z : Value, A : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z?) throws -> ((Expression<A>) -> Expression<Z?>) {
6565
let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) }
6666
return { arg in fn([arg]) }
6767
}
6868

69-
public func createFunction<Z : Value, A : Value>(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z?) throws -> ((Expression<A?>) -> Expression<Z?>) {
69+
public func createFunction<Z : Value, A : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z?) throws -> ((Expression<A?>) -> Expression<Z?>) {
7070
let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) }
7171
return { arg in fn([arg]) }
7272
}
7373

7474
// MARK: -
7575

7676
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z) throws -> (Expression<A>, Expression<B>) -> Expression<Z> {
77-
let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) }
77+
let fn = try createFunction(function, 2, deterministic) { args in block(value(args[0]), value(args[1])) }
7878
return { a, b in fn([a, b]) }
7979
}
8080

8181
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z) throws -> (Expression<A?>, Expression<B>) -> Expression<Z> {
82-
let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) }
82+
let fn = try createFunction(function, 2, deterministic) { args in block(args[0].map(value), value(args[1])) }
8383
return { a, b in fn([a, b]) }
8484
}
8585

8686
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z) throws -> (Expression<A>, Expression<B?>) -> Expression<Z> {
87-
let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) }
87+
let fn = try createFunction(function, 2, deterministic) { args in block(value(args[0]), args[1].map(value)) }
8888
return { a, b in fn([a, b]) }
8989
}
9090

9191
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z?) throws -> (Expression<A>, Expression<B>) -> Expression<Z?> {
92-
let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) }
92+
let fn = try createFunction(function, 2, deterministic) { args in block(value(args[0]), value(args[1])) }
9393
return { a, b in fn([a, b]) }
9494
}
9595

9696
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z) throws -> (Expression<A?>, Expression<B?>) -> Expression<Z> {
97-
let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) }
97+
let fn = try createFunction(function, 2, deterministic) { args in block(args[0].map(value), args[1].map(value)) }
9898
return { a, b in fn([a, b]) }
9999
}
100100

101101
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z?) throws -> (Expression<A?>, Expression<B>) -> Expression<Z?> {
102-
let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) }
102+
let fn = try createFunction(function, 2, deterministic) { args in block(args[0].map(value), value(args[1])) }
103103
return { a, b in fn([a, b]) }
104104
}
105105

106106
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z?) throws -> (Expression<A>, Expression<B?>) -> Expression<Z?> {
107-
let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) }
107+
let fn = try createFunction(function, 2, deterministic) { args in block(value(args[0]), args[1].map(value)) }
108108
return { a, b in fn([a, b]) }
109109
}
110110

111111
public func createFunction<Z : Value, A : Value, B : Value>(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z?) throws -> (Expression<A?>, Expression<B?>) -> Expression<Z?> {
112-
let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) }
112+
let fn = try createFunction(function, 2, deterministic) { args in block(args[0].map(value), args[1].map(value)) }
113113
return { a, b in fn([a, b]) }
114114
}
115115

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,137 @@
11
import XCTest
22
import SQLite
33

4-
class CustomFunctionsTests : XCTestCase {
4+
class CustomFunctionNoArgsTests : SQLiteTestCase {
5+
typealias FunctionNoOptional = () -> Expression<String>
6+
typealias FunctionResultOptional = () -> Expression<String?>
57

8+
func testFunctionNoOptional() {
9+
let _: FunctionNoOptional = try! db.createFunction("test", deterministic: true) {
10+
return "a"
11+
}
12+
let result = try! db.prepare("SELECT test()").scalar() as! String
13+
XCTAssertEqual("a", result)
14+
}
15+
16+
func testFunctionResultOptional() {
17+
let _: FunctionResultOptional = try! db.createFunction("test", deterministic: true) {
18+
return "a"
19+
}
20+
let result = try! db.prepare("SELECT test()").scalar() as! String?
21+
XCTAssertEqual("a", result)
22+
}
23+
}
24+
25+
class CustomFunctionWithOneArgTests : SQLiteTestCase {
26+
typealias FunctionNoOptional = (Expression<String>) -> Expression<String>
27+
typealias FunctionLeftOptional = (Expression<String?>) -> Expression<String>
28+
typealias FunctionResultOptional = (Expression<String>) -> Expression<String?>
29+
typealias FunctionLeftResultOptional = (Expression<String?>) -> Expression<String?>
30+
31+
func testFunctionNoOptional() {
32+
let _: FunctionNoOptional = try! db.createFunction("test", deterministic: true) { a in
33+
return "b"+a
34+
}
35+
let result = try! db.prepare("SELECT test(?)").scalar("a") as! String
36+
XCTAssertEqual("ba", result)
37+
}
38+
39+
func testFunctionLeftOptional() {
40+
let _: FunctionLeftOptional = try! db.createFunction("test", deterministic: true) { a in
41+
return "b"+a!
42+
}
43+
let result = try! db.prepare("SELECT test(?)").scalar("a") as! String
44+
XCTAssertEqual("ba", result)
45+
}
46+
47+
func testFunctionResultOptional() {
48+
let _: FunctionResultOptional = try! db.createFunction("test", deterministic: true) { a in
49+
return "b"+a
50+
}
51+
let result = try! db.prepare("SELECT test(?)").scalar("a") as! String
52+
XCTAssertEqual("ba", result)
53+
}
54+
55+
func testFunctionLeftResultOptional() {
56+
let _: FunctionLeftResultOptional = try! db.createFunction("test", deterministic: true) { (a:String?) -> String? in
57+
return "b"+a!
58+
}
59+
let result = try! db.prepare("SELECT test(?)").scalar("a") as! String
60+
XCTAssertEqual("ba", result)
61+
}
62+
}
63+
64+
class CustomFunctionWithTwoArgsTests : SQLiteTestCase {
65+
typealias FunctionNoOptional = (Expression<String>, Expression<String>) -> Expression<String>
66+
typealias FunctionLeftOptional = (Expression<String?>, Expression<String>) -> Expression<String>
67+
typealias FunctionRightOptional = (Expression<String>, Expression<String?>) -> Expression<String>
68+
typealias FunctionResultOptional = (Expression<String>, Expression<String>) -> Expression<String?>
69+
typealias FunctionLeftRightOptional = (Expression<String?>, Expression<String?>) -> Expression<String>
70+
typealias FunctionLeftResultOptional = (Expression<String?>, Expression<String>) -> Expression<String?>
71+
typealias FunctionRightResultOptional = (Expression<String>, Expression<String?>) -> Expression<String?>
72+
typealias FunctionLeftRightResultOptional = (Expression<String?>, Expression<String?>) -> Expression<String?>
73+
74+
func testNoOptional() {
75+
let _: FunctionNoOptional = try! db.createFunction("test", deterministic: true) { a, b in
76+
return a+b
77+
}
78+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String
79+
XCTAssertEqual("ab", result)
80+
}
81+
82+
func testLeftOptional() {
83+
let _: FunctionLeftOptional = try! db.createFunction("test", deterministic: true) { a, b in
84+
return a!+b
85+
}
86+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String
87+
XCTAssertEqual("ab", result)
88+
}
89+
90+
func testRightOptional() {
91+
let _: FunctionRightOptional = try! db.createFunction("test", deterministic: true) { a, b in
92+
return a+b!
93+
}
94+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String
95+
XCTAssertEqual("ab", result)
96+
}
97+
98+
func testResultOptional() {
99+
let _: FunctionResultOptional = try! db.createFunction("test", deterministic: true) { a, b in
100+
return a+b
101+
}
102+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String?
103+
XCTAssertEqual("ab", result)
104+
}
105+
106+
func testFunctionLeftRightOptional() {
107+
let _: FunctionLeftRightOptional = try! db.createFunction("test", deterministic: true) { a, b in
108+
return a!+b!
109+
}
110+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String
111+
XCTAssertEqual("ab", result)
112+
}
113+
114+
func testFunctionLeftResultOptional() {
115+
let _: FunctionLeftResultOptional = try! db.createFunction("test", deterministic: true) { a, b in
116+
return a!+b
117+
}
118+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String?
119+
XCTAssertEqual("ab", result)
120+
}
121+
122+
func testFunctionRightResultOptional() {
123+
let _: FunctionRightResultOptional = try! db.createFunction("test", deterministic: true) { a, b in
124+
return a+b!
125+
}
126+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String?
127+
XCTAssertEqual("ab", result)
128+
}
129+
130+
func testFunctionLeftRightResultOptional() {
131+
let _: FunctionLeftRightResultOptional = try! db.createFunction("test", deterministic: true) { a, b in
132+
return a!+b!
133+
}
134+
let result = try! db.prepare("SELECT test(?, ?)").scalar("a", "b") as! String?
135+
XCTAssertEqual("ab", result)
136+
}
6137
}

0 commit comments

Comments
 (0)