Skip to content

Commit 8c0de41

Browse files
committed
[Tests] Split to independent executables
1 parent 95a9eff commit 8c0de41

File tree

8 files changed

+278
-315
lines changed

8 files changed

+278
-315
lines changed

Package.swift

Lines changed: 71 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,85 @@ import PackageDescription
44
let package = Package(
55
name: "JavaScriptCore",
66
products: [
7-
.library(name: "SJavaScriptCore", targets: ["SJavaScriptCore"]),
7+
.library(
8+
name: "SJavaScriptCore",
9+
targets: ["SJavaScriptCore"]),
810
],
911
dependencies: [
10-
.package(
11-
url: "https://github.com/swiftstack/javascript.git",
12-
.branch("dev")),
13-
.package(
14-
url: "https://github.com/swiftstack/test.git",
15-
.branch("dev"))
12+
.package(name: "JavaScript"),
13+
.package(name: "Test"),
1614
],
1715
targets: [
1816
.target(
1917
name: "CJavaScriptCore",
2018
dependencies: []),
2119
.target(
2220
name: "SJavaScriptCore",
23-
dependencies: ["CJavaScriptCore", "JavaScript"]),
24-
.testTarget(
25-
name: "SJavaScriptCoreTests",
26-
dependencies: ["Test", "SJavaScriptCore"]),
21+
dependencies: ["CJavaScriptCore", "JavaScript"])
2722
]
2823
)
24+
25+
// MARK: - tests
26+
27+
testTarget("SJavaScriptCore") { test in
28+
test("JavaScript")
29+
test("JSValue")
30+
}
31+
32+
func testTarget(_ target: String, task: ((String) -> Void) -> Void) {
33+
task { test in addTest(target: target, name: test) }
34+
}
35+
36+
func addTest(target: String, name: String) {
37+
package.targets.append(
38+
.executableTarget(
39+
name: "Tests/\(target)/\(name)",
40+
dependencies: ["Test", "SJavaScriptCore"],
41+
path: "Tests/\(target)/\(name)"))
42+
}
43+
44+
// MARK: - custom package source
45+
46+
#if canImport(ObjectiveC)
47+
import Darwin.C
48+
#else
49+
import Glibc
50+
#endif
51+
52+
extension Package.Dependency {
53+
enum Source: String {
54+
case local, remote, github
55+
56+
static var `default`: Self { .github }
57+
58+
var baseUrl: String {
59+
switch self {
60+
case .local: return "../"
61+
case .remote: return "https://swiftstack.io/"
62+
case .github: return "https://github.com/swiftstack/"
63+
}
64+
}
65+
66+
func url(for name: String) -> String {
67+
return self == .local
68+
? baseUrl + name.lowercased()
69+
: baseUrl + name.lowercased() + ".git"
70+
}
71+
}
72+
73+
static func package(name: String) -> Package.Dependency {
74+
guard let pointer = getenv("SWIFTSTACK") else {
75+
return .package(name: name, source: .default)
76+
}
77+
guard let source = Source(rawValue: String(cString: pointer)) else {
78+
fatalError("Invalid source. Use local, remote or github")
79+
}
80+
return .package(name: name, source: source)
81+
}
82+
83+
static func package(name: String, source: Source) -> Package.Dependency {
84+
return source == .local
85+
? .package(name: name, path: source.url(for: name))
86+
: .package(name: name, url: source.url(for: name), .branch("dev"))
87+
}
88+
}

Tests/LinuxMain.swift

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import Test
2+
@testable import SJavaScriptCore
3+
4+
test.case("isUndefined") {
5+
let context = JSContext()
6+
7+
let result = try context.evaluate("undefined")
8+
expect(result.isUndefined)
9+
expect(!result.isNull)
10+
expect(!result.isBool)
11+
expect(!result.isNumber)
12+
expect(!result.isString)
13+
expect(try result.toString() == "undefined")
14+
}
15+
16+
test.case("isNull") {
17+
let context = JSContext()
18+
let result = try context.evaluate("null")
19+
expect(!result.isUndefined)
20+
expect(result.isNull)
21+
expect(!result.isBool)
22+
expect(!result.isNumber)
23+
expect(!result.isString)
24+
expect(try result.toString() == "null")
25+
}
26+
27+
test.case("isBool") {
28+
let context = JSContext()
29+
let result = try context.evaluate("true")
30+
expect(!result.isUndefined)
31+
expect(!result.isNull)
32+
expect(result.isBool)
33+
expect(!result.isNumber)
34+
expect(!result.isString)
35+
expect(try result.toString() == "true")
36+
expect(result.toBool() == true)
37+
}
38+
39+
test.case("isNumber") {
40+
let context = JSContext()
41+
let result = try context.evaluate("3.14")
42+
expect(!result.isUndefined)
43+
expect(!result.isNull)
44+
expect(!result.isBool)
45+
expect(result.isNumber)
46+
expect(!result.isString)
47+
expect(try result.toString() == "3.14")
48+
expect(try result.toDouble() == 3.14)
49+
}
50+
51+
test.case("isString") {
52+
let context = JSContext()
53+
let result = try context.evaluate("'success'")
54+
expect(!result.isUndefined)
55+
expect(!result.isNull)
56+
expect(!result.isBool)
57+
expect(!result.isNumber)
58+
expect(result.isString)
59+
expect(try result.toString() == "success")
60+
}
61+
62+
test.case("toInt()") {
63+
let context = JSContext()
64+
let result = try context.evaluate("40 + 2")
65+
expect(try result.toInt() == 42)
66+
}
67+
68+
test.case("toString()") {
69+
let context = JSContext()
70+
let result = try context.evaluate("40 + 2")
71+
expect(try result.toString() == "42")
72+
}
73+
74+
test.case("property") {
75+
let context = JSContext()
76+
let result = try context.evaluate("""
77+
(function(){
78+
return { property: 'test' }
79+
})()
80+
""")
81+
82+
expect(try result["property"]?.toString() == "test")
83+
}
84+
85+
test.run()
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import Test
2+
@testable import SJavaScriptCore
3+
4+
test.case("evaluate") {
5+
let context = JSContext()
6+
_ = try context.evaluate("40 + 2")
7+
}
8+
9+
test.case("exception") {
10+
let context = JSContext()
11+
expect(throws: JSError("Can't find variable: x")) {
12+
try context.evaluate("x()")
13+
}
14+
15+
expect(throws: JSError("Unexpected end of script")) {
16+
try context.evaluate("{")
17+
}
18+
}
19+
20+
test.case("function") {
21+
let context = JSContext()
22+
try context.createFunction(name: "test") { (_) -> Value in
23+
return .string("success")
24+
}
25+
let result = try context.evaluate("test()")
26+
expect(try result.toString() == "success")
27+
}
28+
29+
test.case("closure") {
30+
let context = JSContext()
31+
32+
try context.createFunction(name: "testUndefined") {
33+
return .undefined
34+
}
35+
let undefinedResult = try context.evaluate("testUndefined()")
36+
expect(undefinedResult.isUndefined)
37+
38+
try context.createFunction(name: "testNull") {
39+
return .null
40+
}
41+
let nullResult = try context.evaluate("testNull()")
42+
expect(nullResult.isNull)
43+
44+
try context.createFunction(name: "testBool") {
45+
return .bool(true)
46+
}
47+
let boolResult = try context.evaluate("testBool()")
48+
expect(boolResult.isBool)
49+
50+
try context.createFunction(name: "testNumber") {
51+
return .number(3.14)
52+
}
53+
let numberResult = try context.evaluate("testNumber()")
54+
expect(numberResult.isNumber)
55+
56+
try context.createFunction(name: "testString") {
57+
return .string("success")
58+
}
59+
let stringResult = try context.evaluate("testString()")
60+
expect(stringResult.isString)
61+
}
62+
63+
test.case("capture") {
64+
let context = JSContext()
65+
66+
var captured = false
67+
try context.createFunction(name: "test") { (_) -> Value in
68+
captured = true
69+
return .string("captured")
70+
}
71+
let result = try context.evaluate("test()")
72+
expect(captured)
73+
expect("\(result)" == "captured")
74+
}
75+
76+
test.case("arguments") {
77+
let context = JSContext()
78+
try context.createFunction(name: "test") { (arguments) -> Void in
79+
expect(arguments.count == 2)
80+
expect(try arguments.first?.toString() == "one")
81+
expect(try arguments.last?.toInt() == 42)
82+
}
83+
try context.evaluate("test('one', 42)")
84+
}
85+
86+
test.case("persistent context") {
87+
let context = JSContext()
88+
try context.evaluate("result = 'success'")
89+
expect(try context.evaluate("result").toString() == "success")
90+
91+
try context.createFunction(name: "test") { (arguments) -> Value in
92+
return .string("test ok")
93+
}
94+
95+
expect(try context.evaluate("result").toString() == "success")
96+
}
97+
98+
test.case("sandbox") {
99+
try {
100+
let context = JSContext()
101+
try context.evaluate("test = 'hello'")
102+
let result = try context.evaluate("test")
103+
expect(try result.toString() == "hello")
104+
}()
105+
106+
let context = JSContext()
107+
expect(throws: JSError("Can\'t find variable: test")) {
108+
try context.evaluate("test")
109+
}
110+
}
111+
112+
test.run()

0 commit comments

Comments
 (0)