/ packages / utils / reflection_test.ts
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  });