test-door.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #include "door.h"
  2. #include "gtest/gtest.h"
  3. namespace {
  4. class DoorTest : public ::testing::Test {
  5. protected:
  6. void SetUp() override {
  7. int argc = 5;
  8. char argv0[] = "./test";
  9. char argv1[] = "-l";
  10. char argv2[] = "-u";
  11. char argv3[] = "test";
  12. char argv4[] = "--debuggering";
  13. char *argv[] = {argv0, argv1, argv2, argv3, argv4};
  14. door::debug_capture = true;
  15. d = new door::Door("test", argc, argv);
  16. d->debug_buffer.clear();
  17. }
  18. void TearDown() override {
  19. delete d;
  20. d = nullptr;
  21. }
  22. public:
  23. door::Door *d;
  24. };
  25. TEST_F(DoorTest, BasicColorOut1) {
  26. door::ANSIColor BonY(door::COLOR::BLUE, door::COLOR::YELLOW);
  27. char BLUE_ON_YELLOW[] = "\x1b[34;43m";
  28. *d << BonY;
  29. EXPECT_STREQ(d->debug_buffer.c_str(), BLUE_ON_YELLOW);
  30. *d << door::reset;
  31. d->debug_buffer.clear();
  32. door::ANSIColor BlueOnYellow("BLUE ON YELLOW");
  33. *d << BlueOnYellow;
  34. EXPECT_STREQ(d->debug_buffer.c_str(), BLUE_ON_YELLOW);
  35. *d << door::reset;
  36. d->debug_buffer.clear();
  37. EXPECT_EQ(BlueOnYellow.fg, BonY.fg);
  38. EXPECT_EQ(BlueOnYellow.bg, BonY.bg);
  39. door::ANSIColor YonB(door::COLOR::YELLOW, door::COLOR::BLUE,
  40. door::ATTR::BOLD);
  41. char Y_ON_B[] = "\x1b[1;33;44m";
  42. *d << YonB;
  43. EXPECT_STREQ(d->debug_buffer.c_str(), Y_ON_B);
  44. *d << door::reset;
  45. d->debug_buffer.clear();
  46. door::ANSIColor YellowOnBlue("YELLOW ON BLUE");
  47. *d << YellowOnBlue;
  48. EXPECT_STREQ(d->debug_buffer.c_str(), Y_ON_B);
  49. *d << door::reset;
  50. d->debug_buffer.clear();
  51. EXPECT_EQ(YellowOnBlue.fg, YonB.fg);
  52. EXPECT_EQ(YellowOnBlue.bg, YonB.bg);
  53. *d << door::reset;
  54. d->debug_buffer.clear();
  55. // Without the reset, an extra 0; gets added to the output.
  56. door::ANSIColor GonR(door::COLOR::GREEN, door::COLOR::RED, door::ATTR::BLINK);
  57. char G_ON_R[] = "\x1b[5;32;41m";
  58. *d << GonR;
  59. EXPECT_STREQ(d->debug_buffer.c_str(), G_ON_R);
  60. d->debug_buffer.clear();
  61. }
  62. TEST_F(DoorTest, ResetOutput) {
  63. *d << door::reset;
  64. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[0m");
  65. d->debug_buffer.clear();
  66. *d << door::nl;
  67. EXPECT_STREQ(d->debug_buffer.c_str(), "\r\n");
  68. d->debug_buffer.clear();
  69. *d << door::cls;
  70. // CLS + GOTO
  71. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[2J\x1b[H");
  72. d->debug_buffer.clear();
  73. }
  74. TEST_F(DoorTest, ColorOptimizeOut1) {
  75. door::ANSIColor RonB(door::COLOR::RED, door::COLOR::BLUE);
  76. char R_ON_B[] = "\x1b[31;44m";
  77. *d << RonB;
  78. EXPECT_STREQ(d->debug_buffer.c_str(), R_ON_B);
  79. d->debug_buffer.clear();
  80. door::ANSIColor GonB(door::COLOR::GREEN, door::COLOR::BLUE);
  81. char G_ON_B[] = "\x1b[32m";
  82. *d << GonB;
  83. EXPECT_STREQ(d->debug_buffer.c_str(), G_ON_B);
  84. d->debug_buffer.clear();
  85. }
  86. TEST_F(DoorTest, ColorReset1) {
  87. door::ANSIColor YonB(door::COLOR::YELLOW, door::COLOR::BLUE,
  88. door::ATTR::BOLD);
  89. char Y_ON_B[] = "\x1b[1;33;44m";
  90. *d << YonB;
  91. EXPECT_STREQ(d->debug_buffer.c_str(), Y_ON_B);
  92. d->debug_buffer.clear();
  93. *d << door::reset;
  94. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[0m");
  95. d->debug_buffer.clear();
  96. door::ANSIColor WonB(door::COLOR::WHITE, door::COLOR::BLUE, door::ATTR::BOLD);
  97. char W_ON_B[] = "\x1b[1;44m";
  98. *d << WonB;
  99. EXPECT_STREQ(d->debug_buffer.c_str(), W_ON_B);
  100. d->debug_buffer.clear();
  101. }
  102. TEST_F(DoorTest, GotoOutput) {
  103. door::Goto pos(1, 1);
  104. *d << pos;
  105. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[H");
  106. d->debug_buffer.clear();
  107. pos.set(5, 10);
  108. *d << pos;
  109. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[10;5H");
  110. d->debug_buffer.clear();
  111. pos.set(5, 1);
  112. *d << pos;
  113. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[;5H");
  114. d->debug_buffer.clear();
  115. pos.set(1, 10);
  116. *d << pos;
  117. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[10H");
  118. d->debug_buffer.clear();
  119. }
  120. TEST_F(DoorTest, GetKeyEnterNull) {
  121. EXPECT_TRUE(door::pushback.empty());
  122. door::pushback.push_back('?');
  123. EXPECT_FALSE(door::pushback.empty());
  124. int c = d->getkey();
  125. EXPECT_EQ('?', c);
  126. EXPECT_TRUE(door::pushback.empty());
  127. door::pushback.push_back(0x0d);
  128. door::pushback.push_back(0);
  129. door::pushback.push_back('!');
  130. d->inactivity = 1;
  131. EXPECT_EQ(0x0d, d->getkey());
  132. EXPECT_EQ('!', d->getkey());
  133. EXPECT_TRUE(door::pushback.empty());
  134. EXPECT_EQ(TIMEOUT, d->getkey());
  135. }
  136. TEST_F(DoorTest, LineOutput) {
  137. door::Line line("Meow");
  138. *d << line;
  139. EXPECT_STREQ(d->debug_buffer.c_str(), "Meow");
  140. d->debug_buffer.clear();
  141. door::Line color("Cat", 4,
  142. door::ANSIColor(door::COLOR::BLACK, door::COLOR::WHITE));
  143. *d << color;
  144. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[30;47mCat");
  145. // EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[30;47mCat ");
  146. *d << door::reset;
  147. d->debug_buffer.clear();
  148. door::Line pad("Test", 4, door::ANSIColor(door::COLOR::RED));
  149. pad.setPadding("**", door::ANSIColor(door::COLOR::GREEN));
  150. *d << pad;
  151. EXPECT_STREQ(d->debug_buffer.c_str(), "\x1b[32m**\x1b[31mTest\x1b[32m**");
  152. d->debug_buffer.clear();
  153. }
  154. } // namespace