102e06876STomasz Sapeta import ExpoModulesTestCore
24bcb0d98STomasz Sapeta 
34bcb0d98STomasz Sapeta @testable import ExpoModulesCore
44bcb0d98STomasz Sapeta 
502e06876STomasz Sapeta class JavaScriptRuntimeSpec: ExpoSpec {
specnull64bcb0d98STomasz Sapeta   override func spec() {
74bcb0d98STomasz Sapeta     let runtime = JavaScriptRuntime()
84bcb0d98STomasz Sapeta 
94bcb0d98STomasz Sapeta     it("has global object accessible") {
104bcb0d98STomasz Sapeta       expect(runtime.global) !== nil
114bcb0d98STomasz Sapeta     }
124bcb0d98STomasz Sapeta 
13ec62a260STomasz Sapeta     describe("eval") {
14ec62a260STomasz Sapeta       it("returns undefined") {
15ec62a260STomasz Sapeta         let undefined = try! runtime.eval("undefined")
16ec62a260STomasz Sapeta         expect(undefined.isUndefined()) == true
17ec62a260STomasz Sapeta         expect(undefined.kind) == .undefined
18ec62a260STomasz Sapeta         expect(undefined.isNull()) == false
19ec62a260STomasz Sapeta         expect(undefined.getRaw()).to(beNil())
204bcb0d98STomasz Sapeta       }
214bcb0d98STomasz Sapeta 
22ec62a260STomasz Sapeta       it("returns null") {
23ec62a260STomasz Sapeta         let null = try! runtime.eval("null")
24ec62a260STomasz Sapeta         expect(null.isNull()) == true
25ec62a260STomasz Sapeta         expect(null.kind) == .null
26ec62a260STomasz Sapeta         expect(null.getRaw()).to(beNil())
274bcb0d98STomasz Sapeta       }
284bcb0d98STomasz Sapeta 
29ec62a260STomasz Sapeta       it("returns bool") {
30ec62a260STomasz Sapeta         let boolTrue = try! runtime.eval("true")
31ec62a260STomasz Sapeta         let boolFalse = try! runtime.eval("false")
32ec62a260STomasz Sapeta         expect(boolTrue.isBool()) == true
33ec62a260STomasz Sapeta         expect(boolFalse.isBool()) == true
34ec62a260STomasz Sapeta         expect(boolTrue.kind) == .bool
35ec62a260STomasz Sapeta         expect(boolFalse.kind) == .bool
36ec62a260STomasz Sapeta         expect(try! boolTrue.asBool()) == true
37ec62a260STomasz Sapeta         expect(try! boolFalse.asBool()) == false
38ec62a260STomasz Sapeta       }
39ec62a260STomasz Sapeta 
40ec62a260STomasz Sapeta       it("returns number") {
41ec62a260STomasz Sapeta         let number = try! runtime.eval("1.23")
42ec62a260STomasz Sapeta         expect(number.isNumber()) == true
43ec62a260STomasz Sapeta         expect(number.kind) == .number
44ec62a260STomasz Sapeta         expect(try! number.asInt()) == 1
45ec62a260STomasz Sapeta         expect(try! number.asDouble()) == 1.23
46ec62a260STomasz Sapeta       }
47ec62a260STomasz Sapeta 
48ec62a260STomasz Sapeta       it("returns string") {
49ec62a260STomasz Sapeta         let string = try! runtime.eval("'foobar'")
50ec62a260STomasz Sapeta         expect(string.isString()) == true
51ec62a260STomasz Sapeta         expect(string.kind) == .string
52ec62a260STomasz Sapeta         expect(try! string.asString()) == "foobar"
53ec62a260STomasz Sapeta       }
54ec62a260STomasz Sapeta 
55ec62a260STomasz Sapeta       it("returns array") {
5656c10913STomasz Sapeta         let array = try! runtime.eval("(['foo', 'bar'])")
57ec62a260STomasz Sapeta         expect(array.isObject()) == true
58ec62a260STomasz Sapeta         expect(array.kind) == .object
59ec62a260STomasz Sapeta         expect(try! array.asArray().map { try $0?.asString() }) == ["foo", "bar"]
60ec62a260STomasz Sapeta       }
61ec62a260STomasz Sapeta 
62ec62a260STomasz Sapeta       it("returns dict") {
6356c10913STomasz Sapeta         let dict1 = try! runtime.eval("({ 'foo': 123 })")
6456c10913STomasz Sapeta         let dict2 = try! runtime.eval("({ 'foo': 'bar' })")
65ec62a260STomasz Sapeta         expect(dict1.isObject()) == true
66ec62a260STomasz Sapeta         expect(dict2.isObject()) == true
67ec62a260STomasz Sapeta         expect(dict1.kind) == .object
68ec62a260STomasz Sapeta         expect(dict2.kind) == .object
69ec62a260STomasz Sapeta         expect(try! dict1.asDict() as? [String: Int]) == ["foo": 123]
70ec62a260STomasz Sapeta         expect(try! dict2.asDict() as? [String: String]) == ["foo": "bar"]
71ec62a260STomasz Sapeta       }
72ec62a260STomasz Sapeta 
73ec62a260STomasz Sapeta       it("returns function") {
7456c10913STomasz Sapeta         let function = try! runtime.eval("(function() {})")
75ec62a260STomasz Sapeta         expect(function.isObject()) == true
76ec62a260STomasz Sapeta         expect(function.isFunction()) == true
77ec62a260STomasz Sapeta         expect(function.kind) == .function
78ec62a260STomasz Sapeta       }
79ec62a260STomasz Sapeta 
80ec62a260STomasz Sapeta       it("returns symbol") {
81ec62a260STomasz Sapeta         let symbol = try! runtime.eval("Symbol('foo')")
82ec62a260STomasz Sapeta         expect(symbol.isSymbol()) == true
83ec62a260STomasz Sapeta         expect(symbol.kind) == .symbol
844bcb0d98STomasz Sapeta       }
85d84b7ae9STomasz Sapeta 
86d84b7ae9STomasz Sapeta       it("throws evaluation exception") {
87d84b7ae9STomasz Sapeta         expect({ try runtime.eval("foo") }).to(throwError { error in
88d84b7ae9STomasz Sapeta           expect(error).to(beAKindOf(JavaScriptEvalException.self))
89*b58909d1STomasz Sapeta           #if canImport(reacthermes)
90*b58909d1STomasz Sapeta           expect((error as! JavaScriptEvalException).reason).to(contain("Property 'foo' doesn't exist"))
91*b58909d1STomasz Sapeta           #else
92d84b7ae9STomasz Sapeta           expect((error as! JavaScriptEvalException).reason).to(contain("Can't find variable: foo"))
93*b58909d1STomasz Sapeta           #endif
94d84b7ae9STomasz Sapeta         })
95d84b7ae9STomasz Sapeta       }
964bcb0d98STomasz Sapeta     }
974bcb0d98STomasz Sapeta   }
984bcb0d98STomasz Sapeta }
99