screen = $screenManager; $state = new TuiState(); $history = new CommandHistory(); $inputHandler = new TuiInputHandler($mockExecutor); $renderer = new TuiRenderer($output); // Setup test categories $categories = [ 'Database' => [ 'name' => 'Database', 'description' => 'Database commands', 'icon' => '๐Ÿ—„๏ธ', 'commands' => [] ], 'Cache' => [ 'name' => 'Cache', 'description' => 'Cache commands', 'icon' => 'โšก', 'commands' => [] ], 'Testing' => [ 'name' => 'Testing', 'description' => 'Testing commands', 'icon' => '๐Ÿงช', 'commands' => [] ] ]; $state->setCategories($categories); $state->setCurrentView(TuiView::CATEGORIES); $state->setRunning(true); echo "โœ… Initial Setup Complete\n"; echo "Categories loaded: " . count($categories) . "\n"; echo "Current view: " . $state->getCurrentView()->name . "\n"; echo "Selected category: " . $state->getSelectedCategory() . "\n\n"; // Test Arrow Down Navigation echo "Testing Arrow DOWN navigation:\n"; echo "Before: Category " . $state->getSelectedCategory() . " ('{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}')\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_DOWN->value, $state, $history); echo "After Arrow DOWN: Category " . $state->getSelectedCategory() . " ('{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}')\n\n"; // Test Arrow Up Navigation echo "Testing Arrow UP navigation:\n"; echo "Before: Category " . $state->getSelectedCategory() . " ('{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}')\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_UP->value, $state, $history); echo "After Arrow UP: Category " . $state->getSelectedCategory() . " ('{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}')\n\n"; // Test bounds checking - try to go below 0 echo "Testing boundary protection (going below 0):\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_UP->value, $state, $history); echo "After Arrow UP (should stay at 0): Category " . $state->getSelectedCategory() . " ('{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}')\n\n"; // Test bounds checking - try to go above max echo "Testing boundary protection (going above max):\n"; // Go to last item $state->setSelectedCategory(2); // Testing category echo "Set to last category (2): '{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}'\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_DOWN->value, $state, $history); echo "After Arrow DOWN (should stay at 2): Category " . $state->getSelectedCategory() . " ('{$categories[array_keys($categories)[$state->getSelectedCategory()]]['name']}')\n\n"; // Test rendering with actual state echo "Testing TUI Rendering:\n"; echo "=====================\n"; $state->setSelectedCategory(0); $renderer->render($state, $history); echo "\nโœ… TUI Complete Test PASSED - All functionality works!\n"; } catch (\Throwable $e) { echo "\nโŒ TUI Complete Test FAILED:\n"; echo "Error: " . $e->getMessage() . "\n"; echo "File: " . $e->getFile() . ":" . $e->getLine() . "\n"; echo "\nStack trace:\n" . $e->getTraceAsString() . "\n"; }