module Tests; import Core.Std; import Core.Clock; import Core.Logger; import Core.Terminal; import Core.TerminalConstants; import Core.Test; import Core.Vector; import Core.Types; import Core.ToString; #define KEY_CASE(key) \ case key: puts(#key); break void testTerminal(bool tty) { Core::IntVector2 size = Core::getTerminalSize(); if(tty) { Core::testTrue(size[0] > 0); Core::testTrue(size[1] > 0); Core::testFalse(Core::enterRawTerminal()); Core::testFalse(Core::leaveRawTerminal()); } else { Core::test(0, size[0]); Core::test(0, size[1]); } Core::enterAlternativeTerminal(); Core::clearTerminal(); Core::resetCursor(); Core::logError("Not visible!"); Core::leaveAlternativeTerminal(); Core::logError("Not visible!"); Core::moveCursorUp(2); Core::moveCursorDown(1); Core::moveCursorLeft(3); Core::moveCursorRight(3); Core::clearTerminalLine(); Core::hideCursor(); Core::showCursor(); u64 u = Core::Terminal::KEY_F5 | Core::Terminal::KEY_SHIFT; Core::testTrue(Core::isSpecialChar(u)); Core::SpecialChar s = Core::convertToSpecialChar(u); Core::test(Core::Terminal::KEY_F5, s.key); Core::testFalse(s.alt); Core::testFalse(s.control); Core::testTrue(s.shift); } void testInteractiveTerminal(void) { Core::enterAlternativeTerminal(); Core::resetCursor(); Core::hideCursor(); puts("Hi there"); Core::logWarning("This is a test"); Core::IntVector2 v = Core::getTerminalSize(); Core::print("{} {}\n", v[0], v[1]); Core::clearTerminal(); Core::resetCursor(); Core::showCursor(); puts("the final!!!"); Core::Clock::sleepMillis(500); Core::enterRawTerminal(); while(true) { u64 c = Core::getRawChar(); if(c == 'q') { break; } else if(c == 0) { continue; } else if(Core::isSpecialChar(c)) { Core::SpecialChar sc = Core::convertToSpecialChar(c); if(sc.shift) { Core::print("SHIFT + "); } if(sc.control) { Core::print("CTRL + "); } if(sc.alt) { Core::print("ALT + "); } switch(sc.key) { KEY_CASE(Core::Terminal::KEY_ARROW_LEFT); KEY_CASE(Core::Terminal::KEY_ARROW_RIGHT); KEY_CASE(Core::Terminal::KEY_ARROW_UP); KEY_CASE(Core::Terminal::KEY_ARROW_DOWN); KEY_CASE(Core::Terminal::KEY_DELETE); KEY_CASE(Core::Terminal::KEY_F1); KEY_CASE(Core::Terminal::KEY_F2); KEY_CASE(Core::Terminal::KEY_F3); KEY_CASE(Core::Terminal::KEY_F4); KEY_CASE(Core::Terminal::KEY_F5); KEY_CASE(Core::Terminal::KEY_F6); KEY_CASE(Core::Terminal::KEY_F7); KEY_CASE(Core::Terminal::KEY_F8); KEY_CASE(Core::Terminal::KEY_F9); KEY_CASE(Core::Terminal::KEY_F10); KEY_CASE(Core::Terminal::KEY_F11); KEY_CASE(Core::Terminal::KEY_F12); KEY_CASE(Core::Terminal::KEY_PAGE_UP); KEY_CASE(Core::Terminal::KEY_PAGE_DOWN); KEY_CASE(Core::Terminal::KEY_HOME); KEY_CASE(Core::Terminal::KEY_END); default: Core::print("{}\n", sc.key); break; } } else { Core::print("{}\n", c); } } Core::leaveRawTerminal(); Core::leaveAlternativeTerminal(); }