reflection_test.ts
1 import { assertEquals, assertThrows } from "@std/assert"; 2 import { get, remove, set } from "./reflection.ts"; 3 4 Deno.test("get - basic object access", () => { 5 const obj = { name: "test", age: 25 }; 6 assertEquals(get(obj, "name"), "test"); 7 assertEquals(get(obj, "age"), 25); 8 assertEquals(get(obj, "nonexistent"), undefined); 9 }); 10 11 Deno.test("get - array access", () => { 12 const arr = ["a", "b", "c"]; 13 assertEquals(get(arr, 0), "a"); 14 assertEquals(get(arr, 1), "b"); 15 assertEquals(get(arr, 3), undefined); 16 }); 17 18 Deno.test("get - Map access", () => { 19 const map = new Map<unknown, unknown>([ 20 ["key1", "value1"], 21 [{ complex: "key" }, "value2"], 22 [42, "value3"], 23 ]); 24 25 assertEquals(get(map, "key1"), "value1"); 26 // assertEquals(get(map, { complex: "key" }), "value2"); 27 assertEquals(get(map, 42), "value3"); 28 assertEquals(get(map, "nonexistent"), undefined); 29 }); 30 31 Deno.test("get - primitive values", () => { 32 assertEquals(get(42, "anything"), undefined); 33 assertEquals(get(null, "anything"), undefined); 34 assertEquals(get(undefined, "anything"), undefined); 35 }); 36 37 Deno.test("set - basic object modification", () => { 38 const obj: Record<string, unknown> = { name: "test" }; 39 set(obj, "name", "modified"); 40 set(obj, "age", 30); 41 42 assertEquals(obj.name, "modified"); 43 assertEquals(obj.age, 30); 44 }); 45 46 Deno.test("set - Map modification", () => { 47 const map = new Map(); 48 set(map, "key1", "value1"); 49 // set(map, { complex: "key" }, "value2"); 50 51 assertEquals(map.get("key1"), "value1"); 52 // assertEquals(get(map, { complex: "key" }), "value2"); 53 }); 54 55 Deno.test("set - invalid operations", () => { 56 assertThrows( 57 () => set(42, "prop", "value"), 58 Error, 59 "Cannot set key prop on 42", 60 ); 61 62 assertThrows( 63 () => set(null, "prop", "value"), 64 Error, 65 "Cannot set key prop on null", 66 ); 67 }); 68 69 Deno.test("remove - Map elements", () => { 70 const b = [1, 2, 3]; 71 const map = new Map<unknown, string>([ 72 ["key1", "value1"], 73 [new Uint8Array(b), "value2"], 74 ]); 75 76 remove(map, "key1"); 77 assertEquals(map.has("key1"), false); 78 79 remove(map, new Uint8Array(b)); 80 assertEquals(map.size, 0); 81 }); 82 83 Deno.test("remove - Array elements", () => { 84 const arr = ["a", "b", "c"]; 85 remove(arr, 1); 86 assertEquals(arr, ["a", "c"]); 87 }); 88 89 Deno.test("remove - invalid operations", () => { 90 assertThrows( 91 () => remove({ prop: "value" }, "prop"), 92 Error, 93 "Cannot remove key prop from [object Object]", 94 ); 95 96 assertThrows( 97 () => remove(42, "anything"), 98 Error, 99 "Cannot remove key anything from 42", 100 ); 101 }); 102 103 Deno.test("set - Map with existing complex key", () => { 104 const map = new Map(); 105 const complexKey = new Uint8Array([1, 2, 3]); 106 set(map, complexKey, "initial"); 107 set(map, new Uint8Array([1, 2, 3]), "updated"); 108 109 assertEquals(get(map, new Uint8Array([1, 2, 3])), "updated"); 110 assertEquals(map.size, 1); // Should not create duplicate entries 111 });