1*9bc9ec42STomasz Sapeta // Copyright 2022-present 650 Industries. All rights reserved. 2*9bc9ec42STomasz Sapeta 3*9bc9ec42STomasz Sapeta import ExpoModulesTestCore 4*9bc9ec42STomasz Sapeta 5*9bc9ec42STomasz Sapeta @testable import ExpoModulesCore 6*9bc9ec42STomasz Sapeta 7*9bc9ec42STomasz Sapeta final class JavaScriptObjectSpec: ExpoSpec { specnull8*9bc9ec42STomasz Sapeta override func spec() { 9*9bc9ec42STomasz Sapeta let runtime = JavaScriptRuntime() 10*9bc9ec42STomasz Sapeta var object: JavaScriptObject? 11*9bc9ec42STomasz Sapeta 12*9bc9ec42STomasz Sapeta let key = "expo" 13*9bc9ec42STomasz Sapeta let value1 = "" 14*9bc9ec42STomasz Sapeta let value2 = "" 15*9bc9ec42STomasz Sapeta 16*9bc9ec42STomasz Sapeta beforeEach { 17*9bc9ec42STomasz Sapeta object = runtime.createObject() 18*9bc9ec42STomasz Sapeta } 19*9bc9ec42STomasz Sapeta 20*9bc9ec42STomasz Sapeta describe("hasProperty") { 21*9bc9ec42STomasz Sapeta it("returns false when the property is missing") { 22*9bc9ec42STomasz Sapeta expect(object?.hasProperty(key)) == false 23*9bc9ec42STomasz Sapeta } 24*9bc9ec42STomasz Sapeta 25*9bc9ec42STomasz Sapeta it("returns true when the property exists") { 26*9bc9ec42STomasz Sapeta object?.setProperty(key, value: value1) 27*9bc9ec42STomasz Sapeta expect(object?.hasProperty(key)) == true 28*9bc9ec42STomasz Sapeta } 29*9bc9ec42STomasz Sapeta 30*9bc9ec42STomasz Sapeta it("returns true when the property is explicitly set to undefined") { 31*9bc9ec42STomasz Sapeta object?.setProperty(key, value: nil) 32*9bc9ec42STomasz Sapeta expect(object?.hasProperty(key)) == true 33*9bc9ec42STomasz Sapeta expect(object?.getProperty(key).isUndefined()) == true 34*9bc9ec42STomasz Sapeta } 35*9bc9ec42STomasz Sapeta } 36*9bc9ec42STomasz Sapeta 37*9bc9ec42STomasz Sapeta describe("getProperty") { 38*9bc9ec42STomasz Sapeta it("returns correct value") { 39*9bc9ec42STomasz Sapeta object?.setProperty(key, value: value1) 40*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value1 41*9bc9ec42STomasz Sapeta } 42*9bc9ec42STomasz Sapeta 43*9bc9ec42STomasz Sapeta it("returns undefined") { 44*9bc9ec42STomasz Sapeta expect(object?.getProperty("bar").isUndefined()) == true 45*9bc9ec42STomasz Sapeta } 46*9bc9ec42STomasz Sapeta } 47*9bc9ec42STomasz Sapeta 48*9bc9ec42STomasz Sapeta describe("setProperty") { 49*9bc9ec42STomasz Sapeta it("sets") { 50*9bc9ec42STomasz Sapeta object?.setProperty(key, value: value1) 51*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value1 52*9bc9ec42STomasz Sapeta } 53*9bc9ec42STomasz Sapeta 54*9bc9ec42STomasz Sapeta it("overrides") { 55*9bc9ec42STomasz Sapeta object?.setProperty(key, value: value1) 56*9bc9ec42STomasz Sapeta object?.setProperty(key, value: value2) 57*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value2 58*9bc9ec42STomasz Sapeta } 59*9bc9ec42STomasz Sapeta 60*9bc9ec42STomasz Sapeta it("unsets") { 61*9bc9ec42STomasz Sapeta object?.setProperty(key, value: nil) 62*9bc9ec42STomasz Sapeta expect(object?.getProperty(key).isUndefined()) == true 63*9bc9ec42STomasz Sapeta } 64*9bc9ec42STomasz Sapeta } 65*9bc9ec42STomasz Sapeta 66*9bc9ec42STomasz Sapeta describe("defineProperty") { 67*9bc9ec42STomasz Sapeta it("defines non-enumerable property") { 68*9bc9ec42STomasz Sapeta object?.defineProperty(key, value: value1, options: []) 69*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value1 70*9bc9ec42STomasz Sapeta expect(object?.getPropertyNames()).notTo(contain(key)) 71*9bc9ec42STomasz Sapeta } 72*9bc9ec42STomasz Sapeta 73*9bc9ec42STomasz Sapeta it("defines enumerable property") { 74*9bc9ec42STomasz Sapeta // When the property is enumerable, it is listed in the property names 75*9bc9ec42STomasz Sapeta object?.defineProperty(key, value: value1, options: .enumerable) 76*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value1 77*9bc9ec42STomasz Sapeta expect(object?.getPropertyNames()).to(contain(key)) 78*9bc9ec42STomasz Sapeta } 79*9bc9ec42STomasz Sapeta 80*9bc9ec42STomasz Sapeta it("defines configurable property") { 81*9bc9ec42STomasz Sapeta // Configurable allows to redefine the property 82*9bc9ec42STomasz Sapeta object?.defineProperty(key, value: value1, options: .configurable) 83*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value1 84*9bc9ec42STomasz Sapeta object?.defineProperty(key, value: value2, options: []) 85*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value2 86*9bc9ec42STomasz Sapeta } 87*9bc9ec42STomasz Sapeta 88*9bc9ec42STomasz Sapeta it("defines writable property") { 89*9bc9ec42STomasz Sapeta // Writable allows changing the property 90*9bc9ec42STomasz Sapeta object?.defineProperty(key, value: value1, options: .writable) 91*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value1 92*9bc9ec42STomasz Sapeta object?.setProperty(key, value: value2) 93*9bc9ec42STomasz Sapeta expect(try! object?.getProperty(key).asString()) == value2 94*9bc9ec42STomasz Sapeta } 95*9bc9ec42STomasz Sapeta } 96*9bc9ec42STomasz Sapeta } 97*9bc9ec42STomasz Sapeta } 98