MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1// Test dynamic object property assignment
2
3console.log("=== Dynamic Object Assignment Tests ===\n");
4
5// Test 1: Basic dynamic property assignment using bracket notation
6console.log("Test 1: Basic bracket notation assignment");
7let obj1 = {};
8obj1["name"] = "Alice";
9obj1["age"] = 30;
10obj1["active"] = true;
11console.log(" obj1.name:", obj1["name"]);
12console.log(" obj1.age:", obj1["age"]);
13console.log(" obj1.active:", obj1["active"]);
14
15// Test 2: Dynamic property assignment with variable keys
16console.log("\nTest 2: Variable keys");
17let obj2 = {};
18let key1 = "firstName";
19let key2 = "lastName";
20let key3 = "email";
21obj2[key1] = "Bob";
22obj2[key2] = "Smith";
23obj2[key3] = "bob@example.com";
24console.log(" obj2[key1]:", obj2[key1]);
25console.log(" obj2[key2]:", obj2[key2]);
26console.log(" obj2[key3]:", obj2[key3]);
27
28// Test 3: Numeric keys (array-like object)
29console.log("\nTest 3: Numeric keys");
30let obj3 = {};
31obj3[0] = "first";
32obj3[1] = "second";
33obj3[2] = "third";
34console.log(" obj3[0]:", obj3[0]);
35console.log(" obj3[1]:", obj3[1]);
36console.log(" obj3[2]:", obj3[2]);
37
38// Test 4: Dynamic property assignment in loop
39console.log("\nTest 4: Loop assignment");
40let obj4 = {};
41for (let i = 0; i < 5; i++) {
42 obj4[i] = i * 10;
43}
44console.log(" obj4[0]:", obj4[0]);
45console.log(" obj4[2]:", obj4[2]);
46console.log(" obj4[4]:", obj4[4]);
47
48// Test 5: Mix of dot notation and bracket notation
49console.log("\nTest 5: Mixed notation");
50let obj5 = {};
51obj5.static = "dot notation";
52obj5["dynamic"] = "bracket notation";
53let propName = "computed";
54obj5[propName] = "variable key";
55console.log(" obj5.static:", obj5.static);
56console.log(" obj5['dynamic']:", obj5["dynamic"]);
57console.log(" obj5[propName]:", obj5[propName]);
58
59// Test 6: Overwriting existing properties
60console.log("\nTest 6: Overwrite properties");
61let obj6 = { name: "Original" };
62console.log(" Before:", obj6.name);
63obj6["name"] = "Updated";
64console.log(" After:", obj6["name"]);
65
66// Test 7: Dynamic keys with string concatenation
67console.log("\nTest 7: Concatenated keys");
68let obj7 = {};
69let prefix = "prop";
70obj7[prefix + "1"] = "value1";
71obj7[prefix + "2"] = "value2";
72obj7[prefix + "3"] = "value3";
73console.log(" obj7['prop1']:", obj7["prop1"]);
74console.log(" obj7['prop2']:", obj7["prop2"]);
75console.log(" obj7['prop3']:", obj7["prop3"]);
76
77// Test 8: Building object dynamically from arrays
78console.log("\nTest 8: Build from arrays");
79let keys = ["x", "y", "z"];
80let values = [100, 200, 300];
81let obj8 = {};
82for (let i = 0; i < keys.length; i++) {
83 obj8[keys[i]] = values[i];
84}
85console.log(" obj8.x:", obj8["x"]);
86console.log(" obj8.y:", obj8["y"]);
87console.log(" obj8.z:", obj8["z"]);
88
89// Test 9: Nested dynamic assignment
90console.log("\nTest 9: Nested objects");
91let obj9 = {};
92obj9["user"] = {};
93obj9["user"]["name"] = "Charlie";
94obj9["user"]["age"] = 25;
95console.log(" obj9.user.name:", obj9["user"]["name"]);
96console.log(" obj9.user.age:", obj9["user"]["age"]);
97
98// Test 10: Reading undefined dynamic properties
99console.log("\nTest 10: Undefined properties");
100let obj10 = { a: 1 };
101console.log(" obj10['a']:", obj10["a"]);
102console.log(" obj10['b'] (undefined):", obj10["b"]);
103
104// Test 10a: Dynamic access with literal strings
105console.log("\nTest 10a: Literal string keys");
106let cat = { meow: "purr", sound: "meow meow", age: 3 };
107console.log(" cat['meow']:", cat["meow"]);
108console.log(" cat['sound']:", cat["sound"]);
109console.log(" cat['age']:", cat["age"]);
110let key = "meow";
111console.log(" cat[key] where key='meow':", cat[key]);
112
113// Test 11: Dynamic property assignment with expressions
114console.log("\nTest 11: Expression keys");
115let obj11 = {};
116obj11[1 + 1] = "two";
117obj11[2 + 2] = "four";
118console.log(" obj11[2]:", obj11[2]);
119console.log(" obj11[4]:", obj11[4]);
120
121// Test 12: Creating a map-like structure
122console.log("\nTest 12: Map-like usage");
123let map = {};
124map["key1"] = { value: 10, type: "number" };
125map["key2"] = { value: "hello", type: "string" };
126map["key3"] = { value: true, type: "boolean" };
127console.log(" map['key1'].value:", map["key1"]["value"]);
128console.log(" map['key2'].value:", map["key2"]["value"]);
129console.log(" map['key3'].value:", map["key3"]["value"]);
130
131console.log("\n=== All tests completed ===");