FerrisScript Documentation

Test Matrix: Node Queries & Signals

Purpose: Systematic tracking of test scenarios for node query and signal functionality
Last Updated: October 10, 2025
Status Legend: โœ… PASS | โš ๏ธ PARTIAL | โŒ TODO | ๐Ÿšง IN PROGRESS | ๐Ÿ’ฅ FAIL


Node Query Tests

get_node(path: String) โ†’ Node

Test ID Scenario Input Expected Output Unit Test (Runtime) Unit Test (Compiler) Integration Test Headless Test Status
NQ-001 Basic child access "Player" Node object โœ… test_call_get_node_function โœ… test_get_node_valid โœ… node_query_basic.ferris โœ… Implicit โœ… PASS
NQ-002 Nested path "UI/HUD/HealthBar" Node object โš ๏ธ test_node_query_error_handling โŒ โš ๏ธ node_query_error_handling.ferris โŒ โš ๏ธ PARTIAL
NQ-003 Missing node "NonExistent" Error E603 โš ๏ธ test_node_query_error_handling โŒ โœ… node_query_error_demo.ferris โš ๏ธ Error demo โœ… PASS
NQ-004 Wrong arg count (0) get_node() Error E601 โŒ โœ… test_get_node_wrong_arg_count โŒ โŒ โš ๏ธ PARTIAL
NQ-005 Wrong arg count (2+) get_node("A", "B") Error E601 โŒ โœ… test_get_node_wrong_arg_count โŒ โŒ โš ๏ธ PARTIAL
NQ-006 Wrong arg type get_node(123) Error E602 โŒ โœ… test_get_node_wrong_arg_type โŒ โŒ โš ๏ธ PARTIAL
NQ-007 No callback set "Player" SelfObject โœ… test_node_query_without_callback โŒ โŒ โŒ โš ๏ธ PARTIAL
NQ-008 Empty string "" Error E603 โœ… test_get_node_empty_string โŒ โŒ โŒ โœ… PASS
NQ-009 Path with spaces "My Player" Node or error โŒ โŒ โŒ โŒ โŒ TODO
NQ-010 Path with special chars "Player-1" Node or error โŒ โŒ โŒ โŒ โŒ TODO
NQ-011 Relative path "../Sibling" Node or error โŒ โŒ โŒ โŒ โŒ TODO
NQ-012 Absolute path "/root/Main" Node or error โŒ โŒ โŒ โŒ โŒ TODO
NQ-013 Very long path "A" * 500 Node or error โŒ โŒ โŒ โŒ โŒ TODO
NQ-014 Unicode path "็Žฉๅฎถ" Node or error โŒ โŒ โŒ โŒ โŒ TODO
NQ-015 Trailing slash "Player/" Node or error โŒ โŒ โŒ โŒ โŒ TODO

get_parent() โ†’ Node

Test ID Scenario Input Expected Output Unit Test (Runtime) Unit Test (Compiler) Integration Test Headless Test Status
NQ-020 Basic usage get_parent() Parent node โœ… test_call_get_parent_function โœ… test_get_parent_valid โœ… node_query_basic.ferris โœ… Implicit โœ… PASS
NQ-021 With args (error) get_parent("arg") Error E605 โŒ โœ… test_get_parent_with_args โŒ โŒ โš ๏ธ PARTIAL
NQ-022 No callback set get_parent() Error E606 โœ… test_get_parent_without_callback โŒ โŒ โŒ โœ… PASS
NQ-023 At root node get_parent() Null/error? โŒ โŒ โŒ โŒ โŒ TODO

has_node(path: String) โ†’ bool

Test ID Scenario Input Expected Output Unit Test (Runtime) Unit Test (Compiler) Integration Test Headless Test Status
NQ-030 Node exists "Player" true โœ… test_call_has_node_function โœ… test_has_node_valid โœ… node_query_validation.ferris โœ… Implicit โœ… PASS
NQ-031 Node doesnโ€™t exist "Missing" false โœ… test_call_has_node_function โŒ โœ… node_query_validation.ferris โŒ โœ… PASS
NQ-032 Wrong arg count (0) has_node() Error E607 โŒ โœ… test_has_node_wrong_arg_count โŒ โŒ โš ๏ธ PARTIAL
NQ-033 Wrong arg count (2+) has_node("A", "B") Error E607 โŒ โœ… test_has_node_wrong_arg_count โŒ โŒ โš ๏ธ PARTIAL
NQ-034 Wrong arg type has_node(123) Error E608 โŒ โœ… test_has_node_wrong_arg_type โŒ โŒ โš ๏ธ PARTIAL
NQ-035 No callback set "Player" Error E609 โœ… test_has_node_without_callback โŒ โŒ โŒ โœ… PASS
NQ-036 Nested path (exists) "UI/HUD" true โŒ โŒ โš ๏ธ node_query_validation.ferris โŒ โš ๏ธ PARTIAL
NQ-037 Empty string "" Callback error โœ… test_has_node_empty_string โŒ โŒ โŒ โœ… PASS

find_child(name: String) โ†’ Node

Test ID Scenario Input Expected Output Unit Test (Runtime) Unit Test (Compiler) Integration Test Headless Test Status
NQ-040 Basic search "Enemy" Node object โœ… test_call_find_child_function โœ… test_find_child_valid โœ… node_query_search.ferris โœ… Implicit โœ… PASS
NQ-041 Wrong arg count (0) find_child() Error E610 โŒ โœ… test_find_child_wrong_arg_count โŒ โŒ โš ๏ธ PARTIAL
NQ-042 Wrong arg count (2+) find_child("A", "B") Error E610 โŒ โœ… test_find_child_wrong_arg_count โŒ โŒ โš ๏ธ PARTIAL
NQ-043 Wrong arg type find_child(123) Error E611 โŒ โœ… test_find_child_wrong_arg_type โŒ โŒ โš ๏ธ PARTIAL
NQ-044 No callback set "Enemy" SelfObject โŒ โŒ โŒ โŒ โŒ TODO
NQ-045 Not found "NonExistent" Null/error? โŒ โŒ โŒ โŒ โŒ TODO
NQ-046 Multiple matches "Item" (2+ exist) First match โŒ โŒ โŒ โŒ โŒ TODO
NQ-047 Deep nesting Name 10+ levels deep Node object โŒ โŒ โš ๏ธ node_query_search.ferris โŒ โš ๏ธ PARTIAL
NQ-048 Case sensitivity "enemy" vs "Enemy" Match or not? โŒ โŒ โŒ โŒ โŒ TODO
NQ-049 Empty string "" Error E611 โŒ โŒ โŒ โŒ โŒ TODO

Signal Tests

signal Declaration

Test ID Scenario Input Expected Output Unit Test (Runtime) Unit Test (Compiler) Integration Test Headless Test Status
SIG-001 No parameters signal player_died; Success โœ… test_signal_declaration_in_program โœ… test_signal_no_params โœ… signals.ferris โŒ โœ… PASS
SIG-002 With parameters signal health_changed(i32, i32); Success โœ… test_register_signal โœ… test_signal_declaration_valid โœ… signals.ferris โŒ โœ… PASS
SIG-003 Multiple types signal item(String, i32, f32); Success โŒ โŒ โœ… signals.ferris โŒ โš ๏ธ PARTIAL
SIG-004 Duplicate signal signal x; signal x; Error E401 โŒ โœ… test_signal_duplicate_name_error โŒ โŒ โš ๏ธ PARTIAL
SIG-005 Undefined type signal x(Unknown); Error E402 โŒ โœ… test_signal_undefined_type_error โŒ โŒ โš ๏ธ PARTIAL
SIG-006 Missing semicolon signal x() Parse error โŒ โœ… test_parse_signal_missing_semicolon โŒ โŒ โš ๏ธ PARTIAL
SIG-007 Missing parens signal x; (should have ()) Parse error? โŒ โœ… test_parse_signal_missing_parens โŒ โŒ โš ๏ธ PARTIAL
SIG-008 Many signals 50+ signals Success โŒ โŒ โŒ โŒ โŒ TODO
SIG-009 Very long name 100+ chars Success or error โŒ โŒ โŒ โŒ โŒ TODO
SIG-010 Unicode name signal ไฟกๅท; Success or error โŒ โŒ โŒ โŒ โŒ TODO
SIG-011 Special chars in name signal player_died!; Parse error โŒ โŒ โŒ โŒ โŒ TODO
SIG-012 Many parameters 10+ params Success or error โŒ โŒ โŒ โŒ โŒ TODO

emit_signal()

Test ID Scenario Input Expected Output Unit Test (Runtime) Unit Test (Compiler) Integration Test Headless Test Status
SIG-020 Basic emission emit_signal("player_died"); Callback invoked โœ… test_emit_signal_in_function โœ… test_emit_signal_valid โœ… signals.ferris โŒ โœ… PASS
SIG-021 With parameters emit_signal("health_changed", 100, 80); Callback with args โœ… test_signal_emitter_callback_invoked โŒ โœ… signals.ferris โŒ โœ… PASS
SIG-022 No parameters emit_signal("player_died"); Callback invoked โœ… test_emit_signal_with_no_params โš ๏ธ Implied โœ… signals.ferris โŒ โœ… PASS
SIG-023 All types i32, f32, bool, String, Vector2 Correct types passed โœ… test_signal_emitter_callback_all_types โŒ โš ๏ธ signals.ferris โŒ โœ… PASS
SIG-024 No callback set emit_signal("x"); Returns Nil โœ… test_signal_emitter_without_callback โŒ โŒ โŒ โœ… PASS
SIG-025 Callback error Callback panics Error handled โœ… test_signal_emitter_error_handling โŒ โŒ โŒ โœ… PASS
SIG-026 No signal name emit_signal(); Error E501 โœ… test_emit_signal_error_no_signal_name โŒ โŒ โŒ โœ… PASS
SIG-027 Invalid name type emit_signal(123); Error E502 โœ… test_emit_signal_error_invalid_signal_name_type โŒ โŒ โŒ โœ… PASS
SIG-028 Undefined signal emit_signal("unknown"); Error E403 โŒ โœ… test_emit_signal_undefined_error โŒ โŒ โš ๏ธ PARTIAL
SIG-029 Param count mismatch emit_signal("x", 1) (expects 0) Error E404 โŒ โœ… test_emit_signal_param_count_mismatch โŒ โŒ โš ๏ธ PARTIAL
SIG-030 Param type mismatch emit_signal("x", "str") (expects i32) Error E405 โŒ โœ… test_emit_signal_param_type_mismatch โŒ โŒ โš ๏ธ PARTIAL
SIG-031 Type coercion emit_signal("x", 42) (expects f32) Coerced to f32 โŒ โœ… test_emit_signal_type_coercion โŒ โŒ โš ๏ธ PARTIAL
SIG-032 In _ready emit_signal("x"); in _ready Success โŒ โŒ โš ๏ธ signals.ferris โŒ โš ๏ธ PARTIAL
SIG-033 In _process emit_signal("x"); in _process Success โŒ โŒ โš ๏ธ signals.ferris โŒ โš ๏ธ PARTIAL
SIG-034 In conditional if (x) emit_signal("y"); Success โŒ โŒ โš ๏ธ signals.ferris โŒ โš ๏ธ PARTIAL
SIG-035 In loop for (...) emit_signal("x"); Success โŒ โŒ โŒ โŒ โŒ TODO
SIG-036 Multiple emissions Sequential calls All invoked โŒ โŒ โš ๏ธ signals.ferris โŒ โš ๏ธ PARTIAL
SIG-037 Signal name variable let s = "x"; emit_signal(s); Error E205 (NOT SUPPORTED) โœ… test_emit_signal_name_as_variable โŒ โŒ โŒ โœ… PASS
SIG-038 Nested emission Signal handler emits signal Success or error โŒ โŒ โŒ โŒ โŒ TODO
SIG-039 Recursive emission Signal Aโ†’Bโ†’A Stack overflow? โŒ โŒ โŒ โŒ โŒ TODO

Summary Statistics

Node Queries:

Signals:

Overall:


Priority TODO List

โœ… Completed (October 10, 2025)

  1. NQ-008: Empty string path test - โœ… DONE (test_get_node_empty_string)
  2. NQ-022: get_parent() without callback - โœ… DONE (test_get_parent_without_callback)
  3. NQ-035: has_node() without callback - โœ… DONE (test_has_node_without_callback)
  4. NQ-037: has_node() with empty string - โœ… DONE (test_has_node_empty_string)
  5. SIG-037: Signal name as variable - โœ… DONE (documented as NOT SUPPORTED)

High Priority (Blocking Production)

  1. NQ-045: find_child() not found behavior
  2. NQ-044: find_child() without callback
  3. NQ-010: Path with special characters
  4. NQ-046: find_child() with multiple matches
  5. NQ-023: get_parent() at root node

Medium Priority (Important Edge Cases)

  1. NQ-048: find_child() case sensitivity
  2. NQ-049: find_child() empty string
  3. SIG-035: emit_signal() in loop
  4. SIG-038: Nested signal emissions
  5. NQ-009: Path with spaces

Low Priority (Nice to Have)

  1. NQ-011: Relative path support
  2. NQ-013: Very long path handling
  3. NQ-014: Unicode path support
  4. SIG-038: Nested signal emissions
  5. SIG-039: Recursive signal emissions

Notes