ir_Whynter_test.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. // Copyright 2017 David Conran
  2. #include "IRsend.h"
  3. #include "IRsend_test.h"
  4. #include "gtest/gtest.h"
  5. // Tests for sendWhynter().
  6. // Test sending typical data only.
  7. TEST(TestSendWhynter, SendDataOnly) {
  8. IRsendTest irsend(4);
  9. irsend.begin();
  10. irsend.reset();
  11. irsend.sendWhynter(0x0);
  12. EXPECT_EQ(
  13. "m750s750m2850s2850"
  14. "m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
  15. "m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
  16. "m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
  17. "m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
  18. "m750s52050",
  19. irsend.outputStr());
  20. irsend.reset();
  21. irsend.sendWhynter(0xFFFFFFFF);
  22. EXPECT_EQ(
  23. "m750s750m2850s2850"
  24. "m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
  25. "m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
  26. "m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
  27. "m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150m750s2150"
  28. "m750s12200",
  29. irsend.outputStr());
  30. irsend.reset();
  31. irsend.sendWhynter(0x87654321);
  32. EXPECT_EQ(
  33. "m750s750m2850s2850"
  34. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  35. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  36. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  37. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  38. "m750s33850",
  39. irsend.outputStr());
  40. }
  41. // Test sending with different repeats.
  42. TEST(TestSendWhynter, SendWithRepeats) {
  43. IRsendTest irsend(4);
  44. irsend.begin();
  45. irsend.reset();
  46. irsend.sendWhynter(0x87654321, kWhynterBits, 0); // 0 repeats.
  47. EXPECT_EQ(
  48. "m750s750m2850s2850"
  49. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  50. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  51. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  52. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  53. "m750s33850",
  54. irsend.outputStr());
  55. irsend.reset();
  56. irsend.sendWhynter(0x87654321, kWhynterBits, 1); // 1 repeat.
  57. EXPECT_EQ(
  58. "m750s750m2850s2850"
  59. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  60. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  61. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  62. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  63. "m750s33850"
  64. "m750s750m2850s2850"
  65. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  66. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  67. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  68. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  69. "m750s33850",
  70. irsend.outputStr());
  71. irsend.reset();
  72. irsend.sendWhynter(0x87654321, kWhynterBits, 2); // 2 repeats.
  73. EXPECT_EQ(
  74. "m750s750m2850s2850"
  75. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  76. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  77. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  78. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  79. "m750s33850"
  80. "m750s750m2850s2850"
  81. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  82. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  83. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  84. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  85. "m750s33850"
  86. "m750s750m2850s2850"
  87. "m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150m750s2150"
  88. "m750s750m750s2150m750s2150m750s750m750s750m750s2150m750s750m750s2150"
  89. "m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150m750s2150"
  90. "m750s750m750s750m750s2150m750s750m750s750m750s750m750s750m750s2150"
  91. "m750s33850",
  92. irsend.outputStr());
  93. }
  94. // Test sending an atypical data size.
  95. TEST(TestSendWhynter, SendUnusualSize) {
  96. IRsendTest irsend(4);
  97. irsend.begin();
  98. irsend.reset();
  99. irsend.sendWhynter(0x0, 8);
  100. EXPECT_EQ(
  101. "m750s750m2850s2850"
  102. "m750s750m750s750m750s750m750s750m750s750m750s750m750s750m750s750"
  103. "m750s88050",
  104. irsend.outputStr());
  105. irsend.reset();
  106. irsend.sendWhynter(0x1234567890ABCDEF, 64);
  107. EXPECT_EQ(
  108. "m750s750m2850s2850"
  109. "m750s750m750s750m750s750m750s2150m750s750m750s750m750s2150m750s750"
  110. "m750s750m750s750m750s2150m750s2150m750s750m750s2150m750s750m750s750"
  111. "m750s750m750s2150m750s750m750s2150m750s750m750s2150m750s2150m750s750"
  112. "m750s750m750s2150m750s2150m750s2150m750s2150m750s750m750s750m750s750"
  113. "m750s2150m750s750m750s750m750s2150m750s750m750s750m750s750m750s750"
  114. "m750s2150m750s750m750s2150m750s750m750s2150m750s750m750s2150m750s2150"
  115. "m750s2150m750s2150m750s750m750s750m750s2150m750s2150m750s750m750s2150"
  116. "m750s2150m750s2150m750s2150m750s750m750s2150m750s2150m750s2150m750s2150"
  117. "m750s12200",
  118. irsend.outputStr());
  119. }
  120. // Tests for decodeWhynter().
  121. // Decode normal Whynter messages.
  122. TEST(TestDecodeWhynter, NormalDecodeWithStrict) {
  123. IRsendTest irsend(4);
  124. IRrecv irrecv(4);
  125. irsend.begin();
  126. // Normal Whynter 32-bit message.
  127. irsend.reset();
  128. irsend.sendWhynter(0x87654321);
  129. irsend.makeDecodeResult();
  130. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
  131. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  132. EXPECT_EQ(kWhynterBits, irsend.capture.bits);
  133. EXPECT_EQ(0x87654321, irsend.capture.value);
  134. EXPECT_EQ(0x0, irsend.capture.address);
  135. EXPECT_EQ(0x0, irsend.capture.command);
  136. EXPECT_FALSE(irsend.capture.repeat);
  137. }
  138. // Decode normal repeated Whynter messages.
  139. TEST(TestDecodeWhynter, NormalDecodeWithRepeatAndStrict) {
  140. IRsendTest irsend(4);
  141. IRrecv irrecv(4);
  142. irsend.begin();
  143. // Normal Whynter 32-bit message with 2 repeats.
  144. irsend.reset();
  145. irsend.sendWhynter(0x87654321, kWhynterBits, 2);
  146. irsend.makeDecodeResult();
  147. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
  148. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  149. EXPECT_EQ(kWhynterBits, irsend.capture.bits);
  150. EXPECT_EQ(0x87654321, irsend.capture.value);
  151. EXPECT_FALSE(irsend.capture.repeat);
  152. irsend.makeDecodeResult(2 * kWhynterBits + 6);
  153. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
  154. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  155. EXPECT_EQ(kWhynterBits, irsend.capture.bits);
  156. EXPECT_EQ(0x87654321, irsend.capture.value);
  157. irsend.makeDecodeResult(2 * (2 * kWhynterBits + 6));
  158. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
  159. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  160. EXPECT_EQ(kWhynterBits, irsend.capture.bits);
  161. EXPECT_EQ(0x87654321, irsend.capture.value);
  162. }
  163. // Decode unsupported Whynter messages.
  164. TEST(TestDecodeWhynter, DecodeWithNonStrictSizes) {
  165. IRsendTest irsend(4);
  166. IRrecv irrecv(4);
  167. irsend.begin();
  168. irsend.reset();
  169. irsend.sendWhynter(0x12, 8); // Illegal sized Whynter 8-bit message.
  170. irsend.makeDecodeResult();
  171. // Should fail with strict on.
  172. ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
  173. ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, 8, true));
  174. // Should pass if strict off.
  175. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 8, false));
  176. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  177. EXPECT_EQ(8, irsend.capture.bits);
  178. EXPECT_EQ(0x12, irsend.capture.value);
  179. EXPECT_EQ(0x0, irsend.capture.address);
  180. EXPECT_EQ(0x0, irsend.capture.command);
  181. irsend.reset();
  182. irsend.sendWhynter(0x1234567890, 40); // Illegal size Whynter 40-bit message.
  183. irsend.makeDecodeResult();
  184. // Shouldn't pass with strict when we ask for less bits than we got.
  185. ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, true));
  186. irsend.makeDecodeResult();
  187. // Should fail with strict when we ask for the wrong bit size.
  188. ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, 40, true));
  189. // Should pass if strict off.
  190. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 40, false));
  191. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  192. EXPECT_EQ(40, irsend.capture.bits);
  193. EXPECT_EQ(0x1234567890, irsend.capture.value);
  194. EXPECT_EQ(0x0, irsend.capture.address);
  195. EXPECT_EQ(0x0, irsend.capture.command);
  196. }
  197. // Decode (non-standard) 64-bit messages.
  198. TEST(TestDecodeWhynter, Decode64BitMessages) {
  199. IRsendTest irsend(4);
  200. IRrecv irrecv(4);
  201. irsend.begin();
  202. irsend.reset();
  203. // Illegal size Whynter 64-bit message.
  204. irsend.sendWhynter(0xFFFFFFFFFFFFFFFF, 64);
  205. irsend.makeDecodeResult();
  206. // Should work with a 'normal' match (not strict)
  207. ASSERT_TRUE(irrecv.decodeWhynter(&irsend.capture, 64, false));
  208. EXPECT_EQ(WHYNTER, irsend.capture.decode_type);
  209. EXPECT_EQ(64, irsend.capture.bits);
  210. EXPECT_EQ(0xFFFFFFFFFFFFFFFF, irsend.capture.value);
  211. EXPECT_EQ(0x0, irsend.capture.address);
  212. EXPECT_EQ(0x0, irsend.capture.command);
  213. }
  214. // Fail to decode a non-Whynter example via GlobalCache
  215. TEST(TestDecodeWhynter, FailToDecodeNonWhynterExample) {
  216. IRsendTest irsend(4);
  217. IRrecv irrecv(4);
  218. irsend.begin();
  219. irsend.reset();
  220. // Modified a few entries to unexpected values, based on previous test case.
  221. uint16_t gc_test[39] = {38000, 1, 1, 322, 162, 20, 61, 20, 61, 20,
  222. 20, 20, 20, 20, 20, 20, 127, 20, 61, 9,
  223. 20, 20, 61, 20, 20, 20, 61, 20, 61, 20,
  224. 61, 20, 20, 20, 20, 20, 20, 20, 884};
  225. irsend.sendGC(gc_test, 39);
  226. irsend.makeDecodeResult();
  227. ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture));
  228. ASSERT_FALSE(irrecv.decodeWhynter(&irsend.capture, kWhynterBits, false));
  229. }