/* Unit Test: New Table Operations (t.shape, t.append, t.prepend) */ ..out "=== Testing New Table Operations ==="; /* ===== t.shape TESTS ===== */ /* Test t.shape on array-like table */ arr : {1, 2, 3, 4, 5}; arr_shape : t.shape arr; ..assert arr_shape.size = 5; ..assert arr_shape.type = "array"; /* Test t.shape on object-like table */ obj : {name: "Alice", age: 30, city: "NYC"}; obj_shape : t.shape obj; ..assert obj_shape.size = 3; ..assert obj_shape.type = "object"; /* Test t.shape on mixed table (non-sequential keys) */ mixed : {1: "one", 3: "three", name: "test"}; mixed_shape : t.shape mixed; ..assert mixed_shape.size = 3; ..assert mixed_shape.type = "object"; /* Test t.shape on empty table */ empty : {}; empty_shape : t.shape empty; ..assert empty_shape.size = 0; ..assert empty_shape.type = "array"; /* ===== t.append TESTS ===== */ /* Test t.append on array-like table */ numbers : {1, 2, 3}; appended : t.append numbers 4; ..assert appended[1] = 1; ..assert appended[2] = 2; ..assert appended[3] = 3; ..assert appended[4] = 4; /* Verify original unchanged (immutability) */ ..assert numbers[1] = 1; ..assert numbers[2] = 2; ..assert numbers[3] = 3; /* Test t.append on empty table */ empty_arr : {}; first_item : t.append empty_arr "hello"; ..assert first_item[1] = "hello"; /* Test t.append with different data types */ multi_type : {1, "two"}; with_bool : t.append multi_type true; ..assert with_bool[1] = 1; ..assert with_bool[2] = "two"; ..assert with_bool[3] = true; /* ===== t.prepend TESTS ===== */ /* Test t.prepend on array-like table */ original : {10, 20, 30}; prepended : t.prepend original 5; ..assert prepended[1] = 5; ..assert prepended[2] = 10; ..assert prepended[3] = 20; ..assert prepended[4] = 30; /* Verify original unchanged (immutability) */ ..assert original[1] = 10; ..assert original[2] = 20; ..assert original[3] = 30; /* Test t.prepend on empty table */ empty_prep : {}; first_prep : t.prepend empty_prep "start"; ..assert first_prep[1] = "start"; /* Test t.prepend with object keys preserved */ obj_with_nums : {1: "one", 2: "two", name: "test"}; obj_prepended : t.prepend obj_with_nums "zero"; ..assert obj_prepended[1] = "zero"; ..assert obj_prepended[2] = "one"; ..assert obj_prepended[3] = "two"; ..assert obj_prepended.name = "test"; /* ===== COMBINED OPERATIONS TESTS ===== */ /* Test chaining operations */ base : {10, 20}; step1 : t.append base 30; step2 : t.prepend step1 5; final_shape : t.shape step2; ..assert step2[1] = 5; ..assert step2[2] = 10; ..assert step2[3] = 20; ..assert step2[4] = 30; ..assert final_shape.size = 4; ..assert final_shape.type = "array"; /* Test with functional combinators */ data : {1, 2, 3}; doubled : map x -> x * 2 data; extended : t.append doubled 8; final_doubled : t.prepend extended 0; ..assert final_doubled[1] = 0; ..assert final_doubled[2] = 2; ..assert final_doubled[3] = 4; ..assert final_doubled[4] = 6; ..assert final_doubled[5] = 8; /* ===== ERROR HANDLING TESTS ===== */ /* These should handle gracefully or show appropriate errors */ /* Note: Specific error behavior depends on implementation */ ..out "=== New Table Operations Tests Complete ===";