[ 'name' => 'Database', 'description' => 'Database commands', 'icon' => '๐Ÿ—„๏ธ', 'commands' => [], 'priority' => 100 ], 1 => [ 'name' => 'Cache', 'description' => 'Cache commands', 'icon' => 'โšก', 'commands' => [], 'priority' => 90 ], 2 => [ 'name' => 'Testing', 'description' => 'Testing commands', 'icon' => '๐Ÿงช', 'commands' => [], 'priority' => 80 ], 3 => [ 'name' => 'MCP', 'description' => 'MCP commands', 'icon' => '๐Ÿค–', 'commands' => [], 'priority' => 70 ] ]; $state->setCategories($categories); $state->setCurrentView(TuiView::CATEGORIES); $state->setRunning(true); echo "โœ“ Initial Setup:\n"; echo " Categories: " . count($categories) . "\n"; echo " Current View: " . $state->getCurrentView()->name . "\n"; echo " Selected Category: " . $state->getSelectedCategory() . "\n"; echo " Category Name: '{$categories[$state->getSelectedCategory()]['name']}'\n\n"; // Test step-by-step navigation echo "๐Ÿ” Testing Navigation Step-by-Step:\n\n"; // Test 1: Arrow Down echo "Test 1: Arrow DOWN\n"; echo " Before: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; echo " Input Key: '" . TuiKeyCode::ARROW_DOWN->value . "' (hex: " . bin2hex(TuiKeyCode::ARROW_DOWN->value) . ")\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_DOWN->value, $state, $history); echo " After: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; echo " โœ“ Expected: Should move from Database (0) to Cache (1)\n\n"; // Test 2: Arrow Down again echo "Test 2: Arrow DOWN again\n"; echo " Before: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_DOWN->value, $state, $history); echo " After: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; echo " โœ“ Expected: Should move from Cache (1) to Testing (2)\n\n"; // Test 3: Arrow Up echo "Test 3: Arrow UP\n"; echo " Before: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_UP->value, $state, $history); echo " After: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; echo " โœ“ Expected: Should move from Testing (2) to Cache (1)\n\n"; // Test 4: Boundary testing - go to end echo "Test 4: Go to last category and test boundary\n"; $state->setSelectedCategory(3); // MCP echo " Set to: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_DOWN->value, $state, $history); echo " After Arrow DOWN: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; echo " โœ“ Expected: Should stay at MCP (3) - boundary protection\n\n"; // Test 5: Boundary testing - go to beginning echo "Test 5: Go to first category and test boundary\n"; $state->setSelectedCategory(0); // Database echo " Set to: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; $inputHandler->handleInput(TuiKeyCode::ARROW_UP->value, $state, $history); echo " After Arrow UP: Category {$state->getSelectedCategory()} ('{$categories[$state->getSelectedCategory()]['name']}')\n"; echo " โœ“ Expected: Should stay at Database (0) - boundary protection\n\n"; // Debug the TuiState navigation methods directly echo "๐Ÿ” Testing TuiState Navigation Methods Directly:\n\n"; echo "Direct TuiState Testing:\n"; $state->setSelectedCategory(1); // Cache echo " Set to: {$state->getSelectedCategory()}\n"; echo " Calling navigateDown()...\n"; $state->navigateDown(); echo " Result: {$state->getSelectedCategory()}\n"; echo " Calling navigateUp()...\n"; $state->navigateUp(); echo " Result: {$state->getSelectedCategory()}\n\n"; echo "โœ… Navigation Debug Test COMPLETED\n"; } catch (\Throwable $e) { echo "\nโŒ Navigation Debug Test FAILED:\n"; echo "Error: " . $e->getMessage() . "\n"; echo "File: " . $e->getFile() . ":" . $e->getLine() . "\n"; echo "\nStack trace:\n" . $e->getTraceAsString() . "\n"; }