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