TerminalTests.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. module;
  2. #include <cstdio>
  3. module Tests;
  4. import Core.Std;
  5. import Core.Clock;
  6. import Core.Logger;
  7. import Core.Terminal;
  8. import Core.TerminalConstants;
  9. import Core.Test;
  10. import Core.Vector;
  11. import Core.Types;
  12. #define KEY_CASE(key) \
  13. case key: puts(#key); break
  14. void testTerminal(bool tty) {
  15. Core::IntVector2 size = Core::getTerminalSize();
  16. if(tty) {
  17. Core::testTrue(size[0] > 0);
  18. Core::testTrue(size[1] > 0);
  19. Core::testFalse(Core::enterRawTerminal());
  20. Core::testFalse(Core::leaveRawTerminal());
  21. } else {
  22. Core::test(0, size[0]);
  23. Core::test(0, size[1]);
  24. }
  25. Core::enterAlternativeTerminal();
  26. Core::clearTerminal();
  27. Core::resetCursor();
  28. Core::logError("Not visible!");
  29. Core::leaveAlternativeTerminal();
  30. Core::logError("Not visible!");
  31. Core::moveCursorUp(2);
  32. Core::moveCursorDown(1);
  33. Core::moveCursorLeft(3);
  34. Core::moveCursorRight(3);
  35. Core::clearTerminalLine();
  36. Core::hideCursor();
  37. Core::showCursor();
  38. u64 u = Core::Terminal::KEY_F5 | Core::Terminal::KEY_SHIFT;
  39. Core::testTrue(Core::isSpecialChar(u));
  40. Core::SpecialChar s = Core::convertToSpecialChar(u);
  41. Core::test(Core::Terminal::KEY_F5, s.key);
  42. Core::testFalse(s.alt);
  43. Core::testFalse(s.control);
  44. Core::testTrue(s.shift);
  45. }
  46. void testInteractiveTerminal(void) {
  47. Core::enterAlternativeTerminal();
  48. Core::resetCursor();
  49. Core::hideCursor();
  50. puts("Hi there");
  51. Core::logWarning("This is a test");
  52. Core::IntVector2 v = Core::getTerminalSize();
  53. printf("%d %d\n", v[0], v[1]);
  54. Core::clearTerminal();
  55. Core::resetCursor();
  56. Core::showCursor();
  57. puts("the final!!!");
  58. Core::Clock::sleepMillis(500);
  59. Core::enterRawTerminal();
  60. while(true) {
  61. u64 c = Core::getRawChar();
  62. if(c == 'q') {
  63. break;
  64. } else if(c == 0) {
  65. continue;
  66. } else if(Core::isSpecialChar(c)) {
  67. Core::SpecialChar sc = Core::convertToSpecialChar(c);
  68. if(sc.shift) {
  69. printf("SHIFT + ");
  70. }
  71. if(sc.control) {
  72. printf("CTRL + ");
  73. }
  74. if(sc.alt) {
  75. printf("ALT + ");
  76. }
  77. switch(sc.key) {
  78. KEY_CASE(Core::Terminal::KEY_ARROW_LEFT);
  79. KEY_CASE(Core::Terminal::KEY_ARROW_RIGHT);
  80. KEY_CASE(Core::Terminal::KEY_ARROW_UP);
  81. KEY_CASE(Core::Terminal::KEY_ARROW_DOWN);
  82. KEY_CASE(Core::Terminal::KEY_DELETE);
  83. KEY_CASE(Core::Terminal::KEY_F1);
  84. KEY_CASE(Core::Terminal::KEY_F2);
  85. KEY_CASE(Core::Terminal::KEY_F3);
  86. KEY_CASE(Core::Terminal::KEY_F4);
  87. KEY_CASE(Core::Terminal::KEY_F5);
  88. KEY_CASE(Core::Terminal::KEY_F6);
  89. KEY_CASE(Core::Terminal::KEY_F7);
  90. KEY_CASE(Core::Terminal::KEY_F8);
  91. KEY_CASE(Core::Terminal::KEY_F9);
  92. KEY_CASE(Core::Terminal::KEY_F10);
  93. KEY_CASE(Core::Terminal::KEY_F11);
  94. KEY_CASE(Core::Terminal::KEY_F12);
  95. KEY_CASE(Core::Terminal::KEY_PAGE_UP);
  96. KEY_CASE(Core::Terminal::KEY_PAGE_DOWN);
  97. KEY_CASE(Core::Terminal::KEY_HOME);
  98. KEY_CASE(Core::Terminal::KEY_END);
  99. default: printf("%lu\n", sc.key); break;
  100. }
  101. } else {
  102. printf("%lu\n", c);
  103. }
  104. }
  105. Core::leaveRawTerminal();
  106. Core::leaveAlternativeTerminal();
  107. }