about summary refs log tree commit diff stats
path: root/js/scripting-lang/scratch_tests/test_table_enhancements.txt
blob: 004b32e7c00c901a75885d3ddb293bfbad38bbb8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
/* Test file for table enhancements
   Comprehensive test suite for APL-inspired broadcasting and immutable operations
   Based on design/TABLE_ENHANCEMENTS.md
   
   NOTE: This file contains tests for features that have NOT been implemented yet.
   These tests will fail until the features are implemented. */

/* ===== BASIC TABLE CREATION ===== */
numbers : {1, 2, 3, 4, 5};
person : {name: "Alice", age: 30, active: true};
mixed_table : {a: 1, b: "hello", c: true, d: 42.5};

/* ===== ENHANCED BROADCASTING COMBINATORS ===== */
/* Test enhanced map with APL-inspired broadcasting */
double : x -> x * 2;
doubled : map @double numbers;
/* Expected: {1: 2, 2: 4, 3: 6, 4: 8, 5: 10} */

square : x -> x * x;
squared : map @square numbers;
/* Expected: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25} */

/* Test map with mixed data types */
isNumber : x -> typeof x == "number";
type_check : map @isNumber mixed_table;
/* Expected: {a: true, b: false, c: false, d: true} */

/* ===== TABLE-SPECIFIC COMBINATORS (t. namespace) ===== */
/* Test t.map for table-specific operations */
t_doubled : t.map @double numbers;
/* Expected: {1: 2, 2: 4, 3: 6, 4: 8, 5: 10} */

/* Test t.filter for table filtering */
isEven : x -> x % 2 == 0;
even_numbers : t.filter @isEven numbers;
/* Expected: {2: 2, 4: 4} */

isPositive : x -> x > 0;
positive_numbers : t.filter @isPositive numbers;
/* Expected: {1: 1, 2: 2, 3: 3, 4: 4, 5: 5} */

/* Test t.reduce for table reduction */
sum : x y -> x + y;
total : t.reduce @sum 0 numbers;
/* Expected: 15 */

max : x y -> x > y ? x : y;
maximum : t.reduce @max numbers.1 numbers;
/* Expected: 5 */

/* ===== IMMUTABLE TABLE OPERATIONS (t. namespace) ===== */
/* Test t.set for immutable updates */
updated_person : t.set person "age" 31;
/* Expected: {name: "Alice", age: 31, active: true} */

added_city : t.set person "city" "New York";
/* Expected: {name: "Alice", age: 30, active: true, city: "New York"} */

/* Test t.delete for immutable deletion */
without_age : t.delete person "age";
/* Expected: {name: "Alice", active: true} */

without_nonexistent : t.delete person "email";
/* Expected: {name: "Alice", age: 30, active: true} (unchanged) */

/* Test t.merge for immutable merging */
person2 : {city: "New York", country: "USA"};
merged : t.merge person person2;
/* Expected: {name: "Alice", age: 30, active: true, city: "New York", country: "USA"} */

overwrite_merge : t.merge person {age: 25, city: "Boston"};
/* Expected: {name: "Alice", age: 25, active: true, city: "Boston"} */

/* ===== TABLE INFORMATION OPERATIONS (t. namespace) ===== */
/* Test t.pairs for getting key-value pairs */
all_pairs : t.pairs person;
/* Expected: [["name", "Alice"], ["age", 30], ["active", true]] */

/* Test t.keys for getting keys */
all_keys : t.keys person;
/* Expected: ["name", "age", "active"] */

/* Test t.values for getting values */
all_values : t.values person;
/* Expected: ["Alice", 30, true] */

/* Test t.length for getting table size */
table_size : t.length person;
/* Expected: 3 */

/* Test t.has for checking key existence */
has_name : t.has person "name";
/* Expected: true */

has_email : t.has person "email";
/* Expected: false */

/* Test t.get for safe property access */
age_or_default : t.get person "age" 0;
/* Expected: 30 */

email_or_default : t.get person "email" "unknown";
/* Expected: "unknown" */

/* ===== APL-INSPIRED ELEMENT-WISE OPERATIONS ===== */
/* Test each combinator for multi-argument element-wise operations */
/* No tables - apply normally */
normal_add : each @add 5 3;
/* Expected: 8 */

/* Single table - element-wise */
add_ten : x -> x + 10;
each_result : each @add_ten numbers;
/* Expected: {1: 11, 2: 12, 3: 13, 4: 14, 5: 15} */

/* Mixed table and scalar */
mixed_operation : each @add numbers 10;
/* Expected: {1: 11, 2: 12, 3: 13, 4: 14, 5: 15} */

/* Multiple tables */
table1 : {a: 1, b: 2, c: 3};
table2 : {a: 10, b: 20, c: 30};
multi_table_sum : each @add table1 table2;
/* Expected: {a: 11, b: 22, c: 33} */

/* Three tables */
table3 : {a: 100, b: 200, c: 300};
triple_sum : each @add table1 table2 table3;
/* Expected: {a: 111, b: 222, c: 333} */

/* Mixed types (table + scalar) */
mixed_types : each @add table1 5;
/* Expected: {a: 6, b: 7, c: 8} */

mixed_types2 : each @add 5 table1;
/* Expected: {a: 6, b: 7, c: 8} */

/* ===== NESTED TABLE HANDLING ===== */
/* Test nested table operations */
nested : {
    data: {a: 1, b: 2, c: 3},
    meta: {type: "numbers", count: 3},
    flags: {active: true, visible: false}
};

/* Top-level only (nested tables unchanged) */
top_level_only : each @double nested;
/* Expected: {data: {a: 1, b: 2, c: 3}, meta: {type: "numbers", count: 3}, flags: {active: true, visible: false}} */

/* Nested operations with explicit composition */
nested_doubled : each (each @double) nested;
/* Expected: {data: {a: 2, b: 4, c: 6}, meta: {type: "numbers", count: 3}, flags: {active: true, visible: false}} */

/* Nested operations with t.map */
nested_with_t_map : t.map (t.map @double) nested;
/* Expected: {data: {a: 2, b: 4, c: 6}, meta: {type: "numbers", count: 3}, flags: {active: true, visible: false}} */

/* Deep nested structure */
deep_nested : {
    level1: {
        level2: {
            level3: {x: 1, y: 2, z: 3}
        }
    }
};

/* Deep nested operations */
deep_doubled : each (each (each @double)) deep_nested;
/* Expected: {level1: {level2: {level3: {x: 2, y: 4, z: 6}}}} */

deep_with_t_map : t.map (t.map (t.map @double)) deep_nested;
/* Expected: {level1: {level2: {level3: {x: 2, y: 4, z: 6}}}} */

/* ===== EMBEDDED COMPLEX STRUCTURES ===== */
/* Test functions and when expressions in tables */
calculator : {
    add: x y -> x + y,
    multiply: x y -> x * y,
    classify: x -> when x is
        0 then "zero"
        1 then "one"
        _ then "other"
};

/* Usage of embedded functions */
calc_result : calculator.add 5 3;
/* Expected: 8 */

calc_multiply : calculator.multiply 4 7;
/* Expected: 28 */

calc_classify_zero : calculator.classify 0;
/* Expected: "zero" */

calc_classify_one : calculator.classify 1;
/* Expected: "one" */

calc_classify_other : calculator.classify 42;
/* Expected: "other" */

/* ===== EDGE CASES AND ERROR HANDLING ===== */
/* Test empty table operations */
empty_table : {};

empty_pairs : t.pairs empty_table;
/* Expected: [] */

empty_keys : t.keys empty_table;
/* Expected: [] */

empty_values : t.values empty_table;
/* Expected: [] */

empty_length : t.length empty_table;
/* Expected: 0 */

/* Test safe operations (should not error) */
safe_get : t.get person "nonexistent" "default";
/* Expected: "default" */

safe_pairs : t.pairs empty_table;
/* Expected: [] */

/* Test boolean keys (existing feature) */
boolean_table : {true: "enabled", false: "disabled"};
boolean_keys : t.keys boolean_table;
/* Expected: [true, false] */

boolean_values : t.values boolean_table;
/* Expected: ["enabled", "disabled"] */

/* Test numeric keys */
numeric_table : {1: "one", 2: "two", 3: "three"};
numeric_keys : t.keys numeric_table;
/* Expected: [1, 2, 3] */

/* ===== FUNCTION COMPOSITION WITH TABLES ===== */
/* Test table operations with function composition */
transform : compose @t.map @double @t.filter @isPositive;
transformed : transform numbers;
/* Expected: {1: 2, 2: 4, 3: 6, 4: 8, 5: 10} */

pipe_transform : pipe @t.filter @isPositive @t.map @double;
pipe_result : pipe_transform numbers;
/* Expected: {1: 2, 2: 4, 3: 6, 4: 8, 5: 10} */

/* Test each with function composition */
triple : x -> x * 3;
each_with_functions : each @double table1;
/* Expected: {a: 2, b: 4, c: 6} */

each_with_composition : each (compose @double @triple) table1;
/* Expected: {a: 6, b: 12, c: 18} */

/* ===== COMPLEX DATA STRUCTURES ===== */
/* Test with complex nested data */
data : {
    users: {1: {name: "Alice", age: 30}, 2: {name: "Bob", age: 25}},
    scores: {1: 85, 2: 92},
    active: {1: true, 2: false}
};

/* Element-wise operations over nested structure */
get_name : user -> user.name;
user_names : t.map @get_name data.users;
/* Expected: {1: "Alice", 2: "Bob"} */

/* Test table operations on complex data */
user_count : t.length data.users;
/* Expected: 2 */

active_users : t.filter @identity data.active;
/* Expected: {1: true} */

/* ===== BACKWARD COMPATIBILITY TESTS ===== */
/* Test that existing table operations still work */
existing_table : {x: 1, y: 2, z: 3};
existing_access : existing_table.x;
/* Expected: 1 */

existing_chained : {outer: {inner: {value: 42}}};
chained_access : existing_chained.outer.inner.value;
/* Expected: 42 */

/* Test that existing map works with non-table values */
existing_map_result : map @double 5;
/* Expected: 10 */

/* Test that existing reduce works with non-table values */
existing_reduce_result : reduce @add 0 5;
/* Expected: 5 */

/* ===== PERFORMANCE AND STRESS TESTS ===== */
/* Test with larger tables (for performance validation) */
large_table : {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10};
large_doubled : t.map @double large_table;
/* Expected: {1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18, 10: 20} */

large_filtered : t.filter @isEven large_table;
/* Expected: {2: 2, 4: 4, 6: 6, 8: 8, 10: 10} */

large_reduced : t.reduce @sum 0 large_table;
/* Expected: 55 */

/* Test nested operations on large structures */
large_nested : {
    data1: large_table,
    data2: large_table,
    data3: large_table
};

large_nested_doubled : t.map (t.map @double) large_nested;
/* Expected: {data1: {1: 2, 2: 4, ...}, data2: {1: 2, 2: 4, ...}, data3: {1: 2, 2: 4, ...}} */

/* ===== ASSERTION VALIDATION TESTS ===== */
/* Validate enhanced broadcasting results */
..assert doubled.1 == 2;
..assert doubled.2 == 4;
..assert doubled.3 == 6;
..assert doubled.4 == 8;
..assert doubled.5 == 10;

..assert squared.1 == 1;
..assert squared.2 == 4;
..assert squared.3 == 9;
..assert squared.4 == 16;
..assert squared.5 == 25;

..assert type_check.a == true;
..assert type_check.b == false;
..assert type_check.c == false;
..assert type_check.d == true;

/* Validate table-specific operations */
..assert t_doubled.1 == 2;
..assert t_doubled.2 == 4;
..assert t_doubled.3 == 6;
..assert t_doubled.4 == 8;
..assert t_doubled.5 == 10;

..assert even_numbers.2 == 2;
..assert even_numbers.4 == 4;
..assert t.has even_numbers 1 == false;
..assert t.has even_numbers 3 == false;

..assert positive_numbers.1 == 1;
..assert positive_numbers.2 == 2;
..assert positive_numbers.3 == 3;
..assert positive_numbers.4 == 4;
..assert positive_numbers.5 == 5;

..assert total == 15;
..assert maximum == 5;

/* Validate immutable operations */
..assert updated_person.age == 31;
..assert updated_person.name == "Alice";
..assert updated_person.active == true;

..assert added_city.city == "New York";
..assert added_city.name == "Alice";
..assert added_city.age == 30;

..assert t.has without_age "age" == false;
..assert without_age.name == "Alice";
..assert without_age.active == true;

..assert without_nonexistent.name == "Alice";
..assert without_nonexistent.age == 30;
..assert without_nonexistent.active == true;

..assert merged.name == "Alice";
..assert merged.age == 30;
..assert merged.active == true;
..assert merged.city == "New York";
..assert merged.country == "USA";

..assert overwrite_merge.name == "Alice";
..assert overwrite_merge.age == 25;
..assert overwrite_merge.active == true;
..assert overwrite_merge.city == "Boston";

/* Validate table information operations */
..assert t.length all_pairs == 3;
..assert all_pairs[0][0] == "name";
..assert all_pairs[0][1] == "Alice";
..assert all_pairs[1][0] == "age";
..assert all_pairs[1][1] == 30;
..assert all_pairs[2][0] == "active";
..assert all_pairs[2][1] == true;

..assert t.length all_keys == 3;
..assert all_keys[0] == "name";
..assert all_keys[1] == "age";
..assert all_keys[2] == "active";

..assert t.length all_values == 3;
..assert all_values[0] == "Alice";
..assert all_values[1] == 30;
..assert all_values[2] == true;

..assert table_size == 3;

..assert has_name == true;
..assert has_email == false;

..assert age_or_default == 30;
..assert email_or_default == "unknown";

/* Validate element-wise operations */
..assert normal_add == 8;

..assert each_result.1 == 11;
..assert each_result.2 == 12;
..assert each_result.3 == 13;
..assert each_result.4 == 14;
..assert each_result.5 == 15;

..assert mixed_operation.1 == 11;
..assert mixed_operation.2 == 12;
..assert mixed_operation.3 == 13;
..assert mixed_operation.4 == 14;
..assert mixed_operation.5 == 15;

..assert multi_table_sum.a == 11;
..assert multi_table_sum.b == 22;
..assert multi_table_sum.c == 33;

..assert triple_sum.a == 111;
..assert triple_sum.b == 222;
..assert triple_sum.c == 333;

..assert mixed_types.a == 6;
..assert mixed_types.b == 7;
..assert mixed_types.c == 8;

..assert mixed_types2.a == 6;
..assert mixed_types2.b == 7;
..assert mixed_types2.c == 8;

/* Validate nested table operations */
..assert top_level_only.data.a == 1;
..assert top_level_only.data.b == 2;
..assert top_level_only.data.c == 3;
..assert top_level_only.meta.type == "numbers";
..assert top_level_only.meta.count == 3;
..assert top_level_only.flags.active == true;
..assert top_level_only.flags.visible == false;

..assert nested_doubled.data.a == 2;
..assert nested_doubled.data.b == 4;
..assert nested_doubled.data.c == 6;
..assert nested_doubled.meta.type == "numbers";
..assert nested_doubled.meta.count == 3;
..assert nested_doubled.flags.active == true;
..assert nested_doubled.flags.visible == false;

..assert nested_with_t_map.data.a == 2;
..assert nested_with_t_map.data.b == 4;
..assert nested_with_t_map.data.c == 6;
..assert nested_with_t_map.meta.type == "numbers";
..assert nested_with_t_map.meta.count == 3;
..assert nested_with_t_map.flags.active == true;
..assert nested_with_t_map.flags.visible == false;

..assert deep_doubled.level1.level2.level3.x == 2;
..assert deep_doubled.level1.level2.level3.y == 4;
..assert deep_doubled.level1.level2.level3.z == 6;

..assert deep_with_t_map.level1.level2.level3.x == 2;
..assert deep_with_t_map.level1.level2.level3.y == 4;
..assert deep_with_t_map.level1.level2.level3.z == 6;

/* Validate embedded functions */
..assert calc_result == 8;
..assert calc_multiply == 28;
..assert calc_classify_zero == "zero";
..assert calc_classify_one == "one";
..assert calc_classify_other == "other";

/* Validate edge cases */
..assert t.length empty_pairs == 0;
..assert t.length empty_keys == 0;
..assert t.length empty_values == 0;
..assert empty_length == 0;

..assert safe_get == "default";
..assert t.length safe_pairs == 0;

..assert t.length boolean_keys == 2;
..assert boolean_keys[0] == true;
..assert boolean_keys[1] == false;

..assert t.length boolean_values == 2;
..assert boolean_values[0] == "enabled";
..assert boolean_values[1] == "disabled";

..assert t.length numeric_keys == 3;
..assert numeric_keys[0] == 1;
..assert numeric_keys[1] == 2;
..assert numeric_keys[2] == 3;

/* Validate function composition */
..assert transformed.1 == 2;
..assert transformed.2 == 4;
..assert transformed.3 == 6;
..assert transformed.4 == 8;
..assert transformed.5 == 10;

..assert pipe_result.1 == 2;
..assert pipe_result.2 == 4;
..assert pipe_result.3 == 6;
..assert pipe_result.4 == 8;
..assert pipe_result.5 == 10;

..assert each_with_functions.a == 2;
..assert each_with_functions.b == 4;
..assert each_with_functions.c == 6;

..assert each_with_composition.a == 6;
..assert each_with_composition.b == 12;
..assert each_with_composition.c == 18;

/* Validate complex data structures */
..assert user_names.1 == "Alice";
..assert user_names.2 == "Bob";

..assert user_count == 2;

..assert active_users.1 == true;
..assert t.has active_users 2 == false;

/* Validate backward compatibility */
..assert existing_access == 1;
..assert chained_access == 42;
..assert existing_map_result == 10;
..assert existing_reduce_result == 5;

/* Validate performance tests */
..assert large_doubled.1 == 2;
..assert large_doubled.10 == 20;
..assert t.length large_doubled == 10;

..assert large_filtered.2 == 2;
..assert large_filtered.4 == 4;
..assert large_filtered.6 == 6;
..assert large_filtered.8 == 8;
..assert large_filtered.10 == 10;
..assert t.length large_filtered == 5;

..assert large_reduced == 55;

..assert large_nested_doubled.data1.1 == 2;
..assert large_nested_doubled.data1.10 == 20;
..assert large_nested_doubled.data2.1 == 2;
..assert large_nested_doubled.data3.1 == 2;

/* ===== OUTPUT ALL RESULTS ===== */
..out "=== BASIC TABLE CREATION ===";
..out "Numbers:";
..out numbers;
..out "Person:";
..out person;
..out "Mixed table:";
..out mixed_table;

..out "=== ENHANCED BROADCASTING ===";
..out "Doubled numbers:";
..out doubled;
..out "Squared numbers:";
..out squared;
..out "Type check:";
..out type_check;

..out "=== TABLE-SPECIFIC OPERATIONS ===";
..out "t.map doubled:";
..out t_doubled;
..out "Even numbers:";
..out even_numbers;
..out "Positive numbers:";
..out positive_numbers;
..out "Sum total:";
..out total;
..out "Maximum:";
..out maximum;

..out "=== IMMUTABLE OPERATIONS ===";
..out "Updated person:";
..out updated_person;
..out "Added city:";
..out added_city;
..out "Without age:";
..out without_age;
..out "Without nonexistent:";
..out without_nonexistent;
..out "Merged:";
..out merged;
..out "Overwrite merge:";
..out overwrite_merge;

..out "=== TABLE INFORMATION ===";
..out "All pairs:";
..out all_pairs;
..out "All keys:";
..out all_keys;
..out "All values:";
..out all_values;
..out "Table size:";
..out table_size;
..out "Has name:";
..out has_name;
..out "Has email:";
..out has_email;
..out "Age or default:";
..out age_or_default;
..out "Email or default:";
..out email_or_default;

..out "=== ELEMENT-WISE OPERATIONS ===";
..out "Normal add:";
..out normal_add;
..out "Each result:";
..out each_result;
..out "Mixed operation:";
..out mixed_operation;
..out "Multi-table sum:";
..out multi_table_sum;
..out "Triple sum:";
..out triple_sum;
..out "Mixed types:";
..out mixed_types;
..out "Mixed types2:";
..out mixed_types2;

..out "=== NESTED TABLE OPERATIONS ===";
..out "Top-level only:";
..out top_level_only;
..out "Nested doubled:";
..out nested_doubled;
..out "Nested with t.map:";
..out nested_with_t_map;
..out "Deep doubled:";
..out deep_doubled;
..out "Deep with t.map:";
..out deep_with_t_map;

..out "=== EMBEDDED FUNCTIONS ===";
..out "Calculator add:";
..out calc_result;
..out "Calculator multiply:";
..out calc_multiply;
..out "Classify zero:";
..out calc_classify_zero;
..out "Classify one:";
..out calc_classify_one;
..out "Classify other:";
..out calc_classify_other;

..out "=== EDGE CASES ===";
..out "Empty pairs:";
..out empty_pairs;
..out "Empty keys:";
..out empty_keys;
..out "Empty values:";
..out empty_values;
..out "Empty length:";
..out empty_length;
..out "Safe get:";
..out safe_get;
..out "Safe pairs:";
..out safe_pairs;

..out "=== BOOLEAN AND NUMERIC KEYS ===";
..out "Boolean keys:";
..out boolean_keys;
..out "Boolean values:";
..out boolean_values;
..out "Numeric keys:";
..out numeric_keys;

..out "=== FUNCTION COMPOSITION ===";
..out "Transformed:";
..out transformed;
..out "Pipe result:";
..out pipe_result;
..out "Each with functions:";
..out each_with_functions;
..out "Each with composition:";
..out each_with_composition;

..out "=== COMPLEX DATA STRUCTURES ===";
..out "User names:";
..out user_names;
..out "User count:";
..out user_count;
..out "Active users:";
..out active_users;

..out "=== BACKWARD COMPATIBILITY ===";
..out "Existing access:";
..out existing_access;
..out "Chained access:";
..out chained_access;
..out "Existing map result:";
..out existing_map_result;
..out "Existing reduce result:";
..out existing_reduce_result;

..out "=== PERFORMANCE TESTS ===";
..out "Large doubled:";
..out large_doubled;
..out "Large filtered:";
..out large_filtered;
..out "Large reduced:";
..out large_reduced;
..out "Large nested doubled:";
..out large_nested_doubled;

/* ===== ERROR HANDLING TESTS ===== */
/* These tests demonstrate expected error behavior */
/* Uncomment individual lines to test specific error cases */

/* Type validation errors */
/* tableSet_error : t.set "not_a_table" "key" "value"; */
/* tableGet_error : t.get "not_a_table" "key"; */
/* tableHas_error : t.has "not_a_table" "key"; */
/* tableMerge_error : t.merge "not_a_table" person; */

/* Missing argument errors */
/* tableSet_missing : t.set person "key"; */
/* tableGet_missing : t.get person; */
/* tableHas_missing : t.has person; */

/* Function validation errors */
/* each_no_function : each "not_a_function" table1; */
/* each_mixed_errors : each @add "string" table1; */

/* Null/undefined handling */
/* null_table : t.set null "key" "value"; */
/* undefined_key : t.get person undefined; */

/* ===== FINAL VALIDATION ===== */
..assert "All table enhancement tests completed successfully!" == "All table enhancement tests completed successfully!";

..out "=== TEST COMPLETION ===";
..out "All table enhancement tests completed successfully!";
..out "All assertions passed!";