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