Tasmota/lib/IRremoteESP8266-2.7.8/test/ir_Haier_test.cpp

1135 lines
40 KiB
C++

// Copyright 2018 David Conran
#include "ir_Haier.h"
#include "IRac.h"
#include "IRrecv.h"
#include "IRrecv_test.h"
#include "IRsend.h"
#include "IRsend_test.h"
#include "gtest/gtest.h"
// Tests for sendHaierAC()
// Test sending typical data only.
TEST(TestSendHaierAC, SendDataOnly) {
IRsendTest irsend(0);
irsend.begin();
uint8_t haier_zero[kHaierACStateLength] = {0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00};
irsend.reset();
irsend.sendHaierAC(haier_zero);
EXPECT_EQ(
"f38000d50"
"m3000s3000m3000s4300"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s150000",
irsend.outputStr());
uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
0xC0, 0x20, 0x00, 0xA7};
irsend.reset();
irsend.sendHaierAC(haier_test);
EXPECT_EQ(
"f38000d50"
"m3000s3000m3000s4300"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
"m520s150000",
irsend.outputStr());
}
// Test sending typical data with repeats.
TEST(TestSendHaierAC, SendWithRepeats) {
IRsendTest irsend(0);
irsend.begin();
irsend.reset();
uint8_t haier_test[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
0xC0, 0x20, 0x00, 0xA7};
irsend.reset();
irsend.sendHaierAC(haier_test, kHaierACStateLength, 2); // two repeats.
EXPECT_EQ(
"f38000d50"
"m3000s3000m3000s4300"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
"m520s150000"
"m3000s3000m3000s4300"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
"m520s150000"
"m3000s3000m3000s4300"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s1650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s1650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s1650m520s650m520s650m520s650m520s650m520s650"
"m520s650m520s650m520s650m520s650m520s650m520s650m520s650m520s650"
"m520s1650m520s650m520s1650m520s650m520s650m520s1650m520s1650m520s1650"
"m520s150000",
irsend.outputStr());
}
// Tests for IRHaierAC class.
TEST(TestHaierACClass, Command) {
IRHaierAC haier(0);
haier.begin();
haier.setCommand(kHaierAcCmdOff);
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
haier.setCommand(kHaierAcCmdOn);
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
haier.setCommand(kHaierAcCmdMode);
EXPECT_EQ(kHaierAcCmdMode, haier.getCommand());
haier.setCommand(kHaierAcCmdFan);
EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
haier.setCommand(kHaierAcCmdTempUp);
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
haier.setCommand(kHaierAcCmdTempDown);
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
haier.setCommand(kHaierAcCmdSleep);
EXPECT_EQ(kHaierAcCmdSleep, haier.getCommand());
haier.setCommand(kHaierAcCmdTimerSet);
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
haier.setCommand(kHaierAcCmdTimerCancel);
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
haier.setCommand(kHaierAcCmdHealth);
EXPECT_EQ(kHaierAcCmdHealth, haier.getCommand());
haier.setCommand(kHaierAcCmdSwing);
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
haier.setCommand(kHaierAcCmdOn);
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
haier.setCommand(kHaierAcCmdOff);
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
// Test unexpected values.
haier.setCommand(0b00001110);
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
haier.setCommand(0b00001111);
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
haier.setCommand(0b00000100);
EXPECT_EQ(kHaierAcCmdOff, haier.getCommand());
}
TEST(TestHaierACClass, OperatingMode) {
IRHaierAC haier(0);
haier.begin();
haier.setMode(kHaierAcAuto);
EXPECT_EQ(kHaierAcAuto, haier.getMode());
haier.setMode(kHaierAcCool);
EXPECT_EQ(kHaierAcCool, haier.getMode());
haier.setMode(kHaierAcHeat);
EXPECT_EQ(kHaierAcHeat, haier.getMode());
haier.setMode(kHaierAcFan);
EXPECT_EQ(kHaierAcFan, haier.getMode());
haier.setMode(kHaierAcDry);
EXPECT_EQ(kHaierAcDry, haier.getMode());
haier.setMode(kHaierAcAuto - 1);
EXPECT_EQ(kHaierAcAuto, haier.getMode());
haier.setMode(kHaierAcCool);
EXPECT_EQ(kHaierAcCool, haier.getMode());
haier.setMode(kHaierAcFan + 1);
EXPECT_EQ(kHaierAcAuto, haier.getMode());
haier.setMode(255);
EXPECT_EQ(kHaierAcAuto, haier.getMode());
}
TEST(TestHaierACClass, Temperature) {
IRHaierAC haier(0);
haier.begin();
haier.setTemp(kHaierAcMinTemp);
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
haier.setCommand(kHaierAcCmdOn);
haier.setTemp(kHaierAcMinTemp + 1);
EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
haier.setTemp(kHaierAcMaxTemp);
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
haier.setTemp(kHaierAcMinTemp - 1);
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
haier.setTemp(kHaierAcMaxTemp + 1);
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
haier.setTemp(23);
EXPECT_EQ(23, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
haier.setCommand(kHaierAcCmdOn);
haier.setTemp(23);
EXPECT_EQ(23, haier.getTemp());
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
haier.setTemp(0);
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempDown, haier.getCommand());
haier.setTemp(255);
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
EXPECT_EQ(kHaierAcCmdTempUp, haier.getCommand());
}
TEST(TestHaierACClass, FanSpeed) {
IRHaierAC haier(0);
haier.begin();
haier.setFan(kHaierAcFanLow);
haier.setCommand(kHaierAcCmdOn);
haier.setFan(kHaierAcFanAuto);
EXPECT_EQ(kHaierAcFanAuto, haier.getFan());
EXPECT_EQ(kHaierAcCmdFan, haier.getCommand());
haier.setFan(kHaierAcFanLow);
EXPECT_EQ(kHaierAcFanLow, haier.getFan());
haier.setFan(kHaierAcFanMed);
EXPECT_EQ(kHaierAcFanMed, haier.getFan());
haier.setFan(kHaierAcFanHigh);
EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
haier.setCommand(kHaierAcCmdOn);
haier.setFan(kHaierAcFanHigh);
EXPECT_EQ(kHaierAcFanHigh, haier.getFan());
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
}
TEST(TestHaierACClass, Swing) {
IRHaierAC haier(0);
haier.begin();
haier.setFan(kHaierAcFanLow);
haier.setCommand(kHaierAcCmdOn);
haier.setSwing(kHaierAcSwingOff);
EXPECT_EQ(kHaierAcSwingOff, haier.getSwing());
haier.setSwing(kHaierAcSwingUp);
EXPECT_EQ(kHaierAcSwingUp, haier.getSwing());
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
haier.setSwing(kHaierAcSwingDown);
EXPECT_EQ(kHaierAcSwingDown, haier.getSwing());
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
haier.setSwing(kHaierAcSwingChg);
EXPECT_EQ(kHaierAcSwingChg, haier.getSwing());
EXPECT_EQ(kHaierAcCmdSwing, haier.getCommand());
}
TEST(TestHaierACClass, CurrentTime) {
IRHaierAC haier(0);
haier.begin();
EXPECT_EQ(0, haier.getCurrTime());
haier.setCurrTime(1);
EXPECT_EQ(1, haier.getCurrTime());
haier.setCurrTime(60);
EXPECT_EQ(60, haier.getCurrTime());
haier.setCurrTime(61);
EXPECT_EQ(61, haier.getCurrTime());
haier.setCurrTime(18 * 60 + 34); // 18:34
EXPECT_EQ(1114, haier.getCurrTime());
haier.setCurrTime(23 * 60 + 59); // 23:59
EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
haier.setCurrTime(23 * 60 + 59 + 1); // 24:00
EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
haier.setCurrTime(UINT16_MAX);
EXPECT_EQ(kHaierAcMaxTime, haier.getCurrTime()); // 23:59
}
TEST(TestHaierACClass, Timers) {
IRHaierAC haier(0);
haier.begin();
haier.setCommand(kHaierAcCmdOn);
// Off by default.
EXPECT_GT(0, haier.getOnTimer());
EXPECT_GT(0, haier.getOffTimer());
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
// On Timer.
haier.setOnTimer(6 * 60); // 6am
EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
EXPECT_GT(0, haier.getOffTimer());
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
haier.setCommand(kHaierAcCmdOn);
EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
EXPECT_GT(0, haier.getOffTimer());
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
haier.cancelTimers();
EXPECT_GT(0, haier.getOnTimer());
EXPECT_GT(0, haier.getOffTimer());
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
// Off Timer.
haier.setOffTimer(18 * 60 + 30); // 6:30pm
EXPECT_GT(0, haier.getOnTimer());
EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
haier.setCommand(kHaierAcCmdOn);
EXPECT_GT(0, haier.getOnTimer());
EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
EXPECT_EQ(kHaierAcCmdOn, haier.getCommand());
haier.cancelTimers();
EXPECT_GT(0, haier.getOnTimer());
EXPECT_GT(0, haier.getOffTimer());
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
// Both Timers.
haier.setOnTimer(6 * 60); // 6am
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
haier.setOffTimer(18 * 60 + 30); // 6:30pm
EXPECT_EQ(kHaierAcCmdTimerSet, haier.getCommand());
EXPECT_EQ(6 * 60, haier.getOnTimer()); // 6am
EXPECT_EQ(18 * 60 + 30, haier.getOffTimer()); // 6:30pm
haier.cancelTimers();
EXPECT_GT(0, haier.getOnTimer());
EXPECT_GT(0, haier.getOffTimer());
EXPECT_EQ(kHaierAcCmdTimerCancel, haier.getCommand());
}
TEST(TestHaierACClass, MessageConstuction) {
IRHaierAC haier(0);
EXPECT_EQ(
"Command: 1 (On), Mode: 0 (Auto), Temp: 25C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: Off, "
"Clock: 00:00, On Timer: Off, Off Timer: Off",
haier.toString());
haier.setMode(kHaierAcCool);
haier.setTemp(21);
haier.setFan(kHaierAcFanHigh);
EXPECT_EQ(
"Command: 3 (Fan), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), "
"Swing: 0 (Off), Sleep: Off, Health: Off, "
"Clock: 00:00, On Timer: Off, Off Timer: Off",
haier.toString());
haier.setSwing(kHaierAcSwingChg);
haier.setHealth(true);
haier.setSleep(true);
haier.setCurrTime(615); // 10:15am
EXPECT_EQ(
"Command: 8 (Sleep), Mode: 1 (Cool), Temp: 21C, Fan: 3 (High), "
"Swing: 3 (Change), Sleep: On, Health: On, "
"Clock: 10:15, On Timer: Off, Off Timer: Off",
haier.toString());
haier.setOnTimer(800); // 1:20pm
haier.setOffTimer(1125); // 6:45pm
haier.setCommand(kHaierAcCmdOn);
EXPECT_EQ(
"Command: 1 (On), Mode: 1 (Cool), Temp: 21C, Fan: 2 (Medium), "
"Swing: 3 (Change), Sleep: On, Health: On, "
"Clock: 10:15, On Timer: 13:20, Off Timer: 18:45",
haier.toString());
// Now change a few already set things.
haier.setMode(kHaierAcHeat);
EXPECT_EQ(
"Command: 2 (Mode), Mode: 3 (Heat), Temp: 21C, Fan: 2 (Medium), "
"Swing: 3 (Change), Sleep: On, Health: On, "
"Clock: 10:15, On Timer: 13:20, Off Timer: 18:45",
haier.toString());
haier.setTemp(25);
EXPECT_EQ(
"Command: 6 (Temp Up), Mode: 3 (Heat), Temp: 25C, Fan: 2 (Medium), "
"Swing: 3 (Change), Sleep: On, Health: On, "
"Clock: 10:15, On Timer: 13:20, Off Timer: 18:45",
haier.toString());
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x96, 0xEA, 0xCF, 0x32,
0xED, 0x6D, 0x54, 0xD4};
EXPECT_STATE_EQ(expectedState, haier.getRaw(), kHaierACBits);
// Check that the checksum is valid.
EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
// Now load up some random data.
uint8_t randomState[kHaierACStateLength] = {0x52, 0x49, 0x50, 0x20, 0x54,
0x61, 0x6C, 0x69, 0x61};
EXPECT_FALSE(IRHaierAC::validChecksum(randomState));
haier.setRaw(randomState);
EXPECT_EQ(
"Command: 9 (Timer Set), Mode: 3 (Heat), Temp: 20C, Fan: 2 (Medium), "
"Swing: 1 (Up), Sleep: On, Health: Off, "
"Clock: 16:32, On Timer: Off, Off Timer: Off",
haier.toString());
// getRaw() should correct the checksum.
EXPECT_TRUE(IRHaierAC::validChecksum(haier.getRaw()));
}
// Tests for the IRHaierACYRW02 class.
TEST(TestHaierACYRW02Class, Button) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setButton(kHaierAcYrw02ButtonPower);
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonMode);
EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonSleep);
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonFan);
// Test unexpected values.
haier.setButton(0xFF);
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
haier.setButton(0x10);
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
}
TEST(TestHaierACYRW02Class, OperatingMode) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setButton(kHaierAcYrw02ButtonPower);
haier.setMode(kHaierAcYrw02Auto);
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
EXPECT_EQ(kHaierAcYrw02ButtonMode, haier.getButton());
haier.setMode(kHaierAcYrw02Cool);
EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
haier.setMode(kHaierAcYrw02Heat);
EXPECT_EQ(kHaierAcYrw02Heat, haier.getMode());
haier.setMode(kHaierAcYrw02Fan);
EXPECT_EQ(kHaierAcYrw02Fan, haier.getMode());
haier.setMode(kHaierAcYrw02Dry);
EXPECT_EQ(kHaierAcYrw02Dry, haier.getMode());
haier.setMode(kHaierAcYrw02Auto - 1);
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
haier.setMode(kHaierAcYrw02Cool);
EXPECT_EQ(kHaierAcYrw02Cool, haier.getMode());
haier.setMode(kHaierAcYrw02Fan + 1);
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
haier.setMode(255);
EXPECT_EQ(kHaierAcYrw02Auto, haier.getMode());
}
TEST(TestHaierACYRW02Class, Temperature) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setTemp(kHaierAcMinTemp);
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
haier.setButton(kHaierAcYrw02ButtonPower);
haier.setTemp(kHaierAcMinTemp + 1);
EXPECT_EQ(kHaierAcMinTemp + 1, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
haier.setTemp(kHaierAcMaxTemp);
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
haier.setTemp(kHaierAcMinTemp - 1);
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
haier.setTemp(kHaierAcMaxTemp + 1);
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
haier.setTemp(23);
EXPECT_EQ(23, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonPower);
haier.setTemp(23);
EXPECT_EQ(23, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
haier.setTemp(0);
EXPECT_EQ(kHaierAcMinTemp, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempDown, haier.getButton());
haier.setTemp(255);
EXPECT_EQ(kHaierAcMaxTemp, haier.getTemp());
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
}
TEST(TestHaierACYRW02Class, HealthMode) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setHealth(true);
EXPECT_TRUE(haier.getHealth());
EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setHealth(false);
EXPECT_FALSE(haier.getHealth());
EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
haier.setHealth(true);
EXPECT_TRUE(haier.getHealth());
EXPECT_EQ(kHaierAcYrw02ButtonHealth, haier.getButton());
}
TEST(TestHaierACYRW02Class, Power) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setPower(true);
EXPECT_TRUE(haier.getPower());
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setPower(false);
EXPECT_FALSE(haier.getPower());
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
haier.setPower(true);
EXPECT_TRUE(haier.getPower());
EXPECT_EQ(kHaierAcYrw02ButtonPower, haier.getButton());
haier.off();
EXPECT_FALSE(haier.getPower());
haier.on();
EXPECT_TRUE(haier.getPower());
}
TEST(TestHaierACYRW02Class, SleepMode) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setSleep(true);
EXPECT_TRUE(haier.getSleep());
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setSleep(false);
EXPECT_FALSE(haier.getSleep());
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
haier.setSleep(true);
EXPECT_TRUE(haier.getSleep());
EXPECT_EQ(kHaierAcYrw02ButtonSleep, haier.getButton());
}
TEST(TestHaierACYRW02Class, TurboMode) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setTurbo(kHaierAcYrw02TurboOff);
EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setTurbo(kHaierAcYrw02TurboLow);
EXPECT_EQ(kHaierAcYrw02TurboLow, haier.getTurbo());
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
haier.setTurbo(kHaierAcYrw02TurboHigh);
EXPECT_EQ(kHaierAcYrw02TurboHigh, haier.getTurbo());
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
haier.setTurbo(kHaierAcYrw02TurboOff);
EXPECT_EQ(kHaierAcYrw02TurboOff, haier.getTurbo());
EXPECT_EQ(kHaierAcYrw02ButtonTurbo, haier.getButton());
}
TEST(TestHaierACYRW02Class, Fan) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setFan(kHaierAcYrw02FanAuto);
EXPECT_EQ(kHaierAcYrw02FanAuto, haier.getFan());
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setFan(kHaierAcYrw02FanLow);
EXPECT_EQ(kHaierAcYrw02FanLow, haier.getFan());
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
haier.setFan(kHaierAcYrw02FanHigh);
EXPECT_EQ(kHaierAcYrw02FanHigh, haier.getFan());
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
haier.setFan(kHaierAcYrw02FanMed);
EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
EXPECT_EQ(kHaierAcYrw02ButtonFan, haier.getButton());
// Test unexpected values.
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setFan(0x00);
EXPECT_EQ(kHaierAcYrw02FanMed, haier.getFan());
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
}
TEST(TestHaierACYRW02Class, Swing) {
IRHaierACYRW02 haier(0);
haier.begin();
haier.setSwing(kHaierAcYrw02SwingOff);
EXPECT_EQ(kHaierAcYrw02SwingOff, haier.getSwing());
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setSwing(kHaierAcYrw02SwingAuto);
EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
haier.setSwing(kHaierAcYrw02SwingTop);
EXPECT_EQ(kHaierAcYrw02SwingTop, haier.getSwing());
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
haier.setSwing(kHaierAcYrw02SwingDown);
EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
// Test unexpected values.
haier.setButton(kHaierAcYrw02ButtonTempUp);
haier.setSwing(0xFF);
EXPECT_EQ(kHaierAcYrw02SwingDown, haier.getSwing());
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, haier.getButton());
// Test the mode-dependant positions.
haier.setMode(kHaierAcYrw02Auto);
haier.setSwing(kHaierAcYrw02SwingMiddle);
EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
EXPECT_EQ(kHaierAcYrw02ButtonSwing, haier.getButton());
haier.setMode(kHaierAcYrw02Heat);
haier.setSwing(kHaierAcYrw02SwingMiddle);
EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
haier.setSwing(kHaierAcYrw02SwingAuto);
EXPECT_EQ(kHaierAcYrw02SwingAuto, haier.getSwing());
haier.setSwing(kHaierAcYrw02SwingBottom);
EXPECT_EQ(kHaierAcYrw02SwingBottom, haier.getSwing());
haier.setMode(kHaierAcYrw02Cool);
haier.setSwing(kHaierAcYrw02SwingBottom);
EXPECT_EQ(kHaierAcYrw02SwingMiddle, haier.getSwing());
}
TEST(TestHaierACYRW02Class, MessageConstuction) {
IRHaierACYRW02 haier(0);
EXPECT_EQ(
"Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C,"
" Fan: 5 (Auto), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
" Health: On",
haier.toString());
haier.setMode(kHaierAcYrw02Cool);
haier.setTemp(21);
haier.setFan(kHaierAcYrw02FanHigh);
EXPECT_EQ(
"Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 21C,"
" Fan: 1 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
" Health: On",
haier.toString());
haier.setSwing(kHaierAcYrw02SwingMiddle);
haier.setHealth(false);
haier.setSleep(true);
haier.setTurbo(kHaierAcYrw02TurboHigh);
EXPECT_EQ(
"Power: On, Button: 8 (Turbo), Mode: 1 (Cool), Temp: 21C,"
" Fan: 1 (High), Turbo: 1 (High), Swing: 2 (Middle),"
" Sleep: On, Health: Off",
haier.toString());
}
// Decode "real" state messages.
TEST(TestHaierACYRW02Class, RealStates) {
uint8_t expectedState1[kHaierACYRW02StateLength] = {
0xA6, 0xE1, 0x00, 0x00, 0x40, 0x20, 0x00,
0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6E};
IRHaierACYRW02 haier(0);
haier.setRaw(expectedState1);
EXPECT_EQ(
"Power: On, Button: 7 (Health), Mode: 4 (Heat), Temp: 30C,"
" Fan: 1 (High), Turbo: 0 (Off), Swing: 1 (Highest), Sleep: Off,"
" Health: Off",
haier.toString());
uint8_t expectedState2[kHaierACYRW02StateLength] = {
0xA6, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x00,
0x80, 0x00, 0x00, 0x00, 0x00, 0x05, 0x75};
haier.setRaw(expectedState2);
EXPECT_EQ(
"Power: Off, Button: 5 (Power), Mode: 4 (Heat), Temp: 30C,"
" Fan: 1 (High), Turbo: 0 (Off), Swing: 0 (Off), Sleep: Off,"
" Health: Off",
haier.toString());
uint8_t expectedState3[kHaierACYRW02StateLength] = {
0xA6, 0x02, 0x00, 0x02, 0x40, 0x20, 0x00,
0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2B};
haier.setRaw(expectedState3);
EXPECT_EQ(
"Power: On, Button: 1 (Temp Down), Mode: 1 (Cool), Temp: 16C,"
" Fan: 1 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
" Health: On",
haier.toString());
// cool 25, health, fan auto, swing auto, sleep on
uint8_t expectedState4[kHaierACYRW02StateLength] = {
0xA6, 0x9C, 0x00, 0x02, 0x40, 0xA8, 0x00,
0x20, 0x80, 0x00, 0x00, 0x00, 0x0B, 0xD7};
haier.setRaw(expectedState4);
EXPECT_EQ(
"Power: On, Button: 11 (Sleep), Mode: 1 (Cool), Temp: 25C,"
" Fan: 5 (Auto), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
" Health: On",
haier.toString());
// cool 25, health, fan 3, swing auto, sleep on
uint8_t expectedState5[kHaierACYRW02StateLength] = {
0xA6, 0x9C, 0x00, 0x02, 0x40, 0x27, 0x36,
0x20, 0x80, 0x00, 0x00, 0x00, 0x04, 0x85};
haier.setRaw(expectedState5);
EXPECT_EQ(
"Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 25C,"
" Fan: 1 (High), Turbo: 0 (Off), Swing: 12 (Auto), Sleep: On,"
" Health: On",
haier.toString());
}
// Tests for decodeHaierAC().
// Decode normal "synthetic" messages.
TEST(TestDecodeHaierAC, NormalDecodeWithStrict) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
0xC0, 0x20, 0x00, 0xA7};
// With the specific decoder.
irsend.reset();
irsend.sendHaierAC(expectedState);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decodeHaierAC(&irsend.capture, kStartOffset, kHaierACBits,
true));
EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
// With the all the decoders.
irsend.reset();
irsend.sendHaierAC(expectedState);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(HAIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
}
// Decode a "real" example message.
TEST(TestDecodeHaierAC, RealExample1) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
irsend.reset();
// Data from Issue #404 captured by kuzin2006
uint16_t rawData[149] = {
3030, 3044, 3030, 4304, 576, 1694, 550, 582, 552, 1704, 552, 714, 550,
582, 550, 1706, 552, 582, 550, 1836, 552, 582, 578, 568, 550, 582,
550, 714, 550, 582, 550, 582, 552, 582, 550, 1836, 552, 582, 552,
580, 580, 1692, 550, 712, 552, 582, 550, 582, 552, 580, 550, 714,
552, 582, 550, 582, 552, 582, 578, 698, 552, 580, 552, 582, 552,
582, 552, 1836, 552, 580, 552, 582, 552, 582, 550, 714, 578, 568,
550, 582, 550, 582, 552, 714, 550, 1706, 550, 1706, 550, 582, 550,
714, 552, 582, 580, 566, 552, 582, 550, 714, 552, 580, 552, 580,
552, 1706, 550, 714, 550, 582, 552, 582, 578, 568, 552, 712, 552,
582, 550, 582, 550, 582, 550, 712, 552, 582, 550, 582, 552, 582,
578, 722, 552, 1704, 550, 582, 550, 1706, 550, 736, 550, 582, 550,
1706, 550, 1704, 552, 1704, 578};
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x01, 0x20, 0x01, 0x00,
0xC0, 0x20, 0x00, 0xA7};
irsend.sendRaw(rawData, 149, 38000);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
EXPECT_EQ(
"Command: 1 (On), Mode: 1 (Cool), Temp: 16C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: Off, "
"Clock: 00:01, On Timer: Off, Off Timer: Off",
IRAcUtils::resultAcToString(&irsend.capture));
stdAc::state_t r, p;
ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p));
}
// Decode a "real" example message.
TEST(TestDecodeHaierAC, RealExample2) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
irsend.reset();
// Data from Issue #404 captured by kuzin2006
uint16_t rawData[149] = {
3028, 3046, 3028, 4304, 576, 1694, 552, 582, 550, 1704, 552, 714,
550, 582, 552, 1704, 550, 582, 550, 1836, 552, 582, 578, 1690,
552, 1704, 552, 712, 550, 582, 550, 1706, 550, 1706, 552, 712,
550, 582, 552, 582, 578, 1690, 552, 714, 552, 580, 552, 582,
552, 582, 550, 712, 552, 582, 550, 582, 550, 582, 578, 698,
552, 582, 550, 584, 550, 582, 552, 1836, 550, 582, 550, 582,
550, 582, 550, 712, 578, 568, 550, 582, 550, 582, 550, 714,
552, 1706, 550, 1706, 552, 580, 550, 714, 550, 582, 580, 568,
550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 552, 712,
550, 582, 550, 582, 580, 568, 552, 712, 550, 584, 550, 582,
550, 584, 550, 712, 550, 582, 550, 582, 550, 582, 578, 722,
550, 582, 552, 580, 552, 582, 550, 738, 550, 1706, 550, 1704,
552, 582, 550, 582, 578};
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0x66, 0x20, 0x01, 0x00,
0xC0, 0x20, 0x00, 0x0C};
irsend.sendRaw(rawData, 149, 38000);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
IRHaierAC haier(0);
haier.setRaw(irsend.capture.state);
EXPECT_EQ(
"Command: 6 (Temp Up), Mode: 1 (Cool), Temp: 22C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: Off, "
"Clock: 00:01, On Timer: Off, Off Timer: Off",
haier.toString());
}
// Decode a "real" example message.
TEST(TestDecodeHaierAC, RealExample3) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
irsend.reset();
// Data from Issue #404 captured by kuzin2006
uint16_t rawData[149] = {
3030, 3044, 3030, 4302, 578, 1692, 550, 582, 550, 1706, 550, 714,
550, 582, 552, 1706, 550, 582, 550, 1836, 552, 1706, 578, 1690,
552, 1704, 552, 714, 550, 1706, 552, 1706, 550, 582, 550, 714,
552, 582, 550, 582, 578, 1690, 550, 714, 552, 582, 552, 582,
550, 582, 550, 714, 550, 584, 550, 582, 550, 582, 578, 700,
552, 1706, 550, 582, 550, 582, 552, 1836, 550, 582, 550, 582,
552, 1706, 550, 714, 578, 568, 552, 582, 552, 582, 550, 714,
550, 1706, 550, 1706, 550, 582, 552, 712, 552, 582, 580, 568,
550, 582, 550, 714, 550, 582, 550, 582, 550, 1706, 550, 714,
550, 582, 550, 582, 578, 568, 552, 712, 552, 582, 550, 582,
550, 582, 550, 712, 550, 584, 550, 582, 552, 582, 578, 722,
552, 1704, 550, 582, 550, 1706, 550, 1862, 550, 1706, 550, 582,
550, 1704, 552, 582, 578};
uint8_t expectedState[kHaierACStateLength] = {0xA5, 0xEC, 0x20, 0x09, 0x20,
0xC0, 0x20, 0x00, 0xBA};
irsend.sendRaw(rawData, 149, 38000);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(HAIER_AC, irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
IRHaierAC haier(0);
haier.setRaw(irsend.capture.state);
EXPECT_EQ(
"Command: 12 (Health), Mode: 1 (Cool), Temp: 30C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: On, "
"Clock: 00:09, On Timer: Off, Off Timer: Off",
haier.toString());
}
// Decode normal "synthetic" messages.
TEST(TestDecodeHaierAC_YRW02, NormalDecode) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
uint8_t expectedState[kHaierACYRW02StateLength] = {
0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
irsend.reset();
irsend.sendHaierACYRW02(expectedState);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
EXPECT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
}
// Decode a "real" example message.
TEST(TestDecodeHaierAC_YRW02, RealExample) {
IRsendTest irsend(0);
IRrecv irrecv(0);
irsend.begin();
irsend.reset();
// Data from Issue #485 captured by non7top
uint16_t rawData[229] = {
2998, 3086, 2998, 4460, 568, 1640, 596, 492, 514, 1690, 590, 496,
566, 532, 592, 1596, 570, 1618, 518, 584, 590, 538, 524, 536,
568, 532, 590, 1596, 516, 612, 568, 538, 522, 1638, 586, 500,
512, 614, 568, 538, 520, 538, 586, 538, 566, 540, 520, 538,
586, 538, 522, 538, 588, 538, 568, 538, 520, 538, 586, 538,
566, 538, 520, 540, 588, 1596, 590, 536, 568, 538, 520, 1592,
640, 538, 520, 540, 588, 538, 568, 538, 516, 562, 566, 538,
518, 542, 586, 540, 566, 1596, 590, 538, 566, 538, 516, 544,
586, 538, 516, 542, 588, 540, 564, 540, 468, 590, 588, 538,
566, 540, 466, 590, 588, 538, 514, 544, 588, 538, 566, 538,
468, 1692, 606, 526, 466, 592, 588, 538, 568, 490, 588, 538,
566, 540, 466, 592, 588, 538, 566, 538, 466, 592, 588, 538,
568, 492, 586, 540, 566, 540, 468, 590, 588, 538, 568, 516,
488, 590, 588, 538, 568, 492, 588, 538, 566, 518, 488, 590,
588, 540, 564, 518, 490, 590, 588, 538, 562, 496, 588, 538,
566, 518, 488, 590, 588, 538, 562, 522, 488, 588, 590, 538,
560, 498, 588, 540, 564, 522, 486, 590, 590, 538, 560, 524,
488, 588, 588, 1598, 514, 608, 564, 1600, 548, 536, 586, 538,
568, 1594, 590, 1618, 578, 1606, 606, 1582, 590, 1596, 590, 1616,
580};
uint8_t expectedState[kHaierACYRW02StateLength] = {
0xA6, 0x12, 0x00, 0x02, 0x40, 0x20, 0x00,
0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3F};
irsend.sendRaw(rawData, 229, 38000);
irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&irsend.capture));
ASSERT_EQ(HAIER_AC_YRW02, irsend.capture.decode_type);
EXPECT_EQ(kHaierACYRW02Bits, irsend.capture.bits);
EXPECT_FALSE(irsend.capture.repeat);
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
IRHaierACYRW02 haier(0);
haier.setRaw(irsend.capture.state);
EXPECT_EQ(
"Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 17C,"
" Fan: 1 (High), Turbo: 0 (Off), Swing: 2 (Middle), Sleep: Off,"
" Health: On",
haier.toString());
}
// Default state of the remote needed to include hidden data.
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/668
TEST(TestHaierAcIssues, Issue668) {
IRHaierAC ac(0);
IRHaierAC acText(1);
IRrecv irrecv(0);
ac.begin();
// Turn on the AC.
ac._irsend.reset();
char expected_on[] =
"Command: 1 (On), Mode: 1 (Cool), Temp: 25C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, "
"On Timer: Off, Off Timer: Off";
// State taken from real capture:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/668#issuecomment-483531895
uint8_t expected_on_state[9] = {
0xA5, 0x91, 0x20, 0x00, 0x0C, 0xC0, 0x20, 0x00, 0x42};
ac.setMode(kHaierAcCool);
ac.setCommand(kHaierAcCmdOn);
EXPECT_EQ(expected_on, ac.toString());
ac.send();
ac._irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
EXPECT_STATE_EQ(expected_on_state,
ac._irsend.capture.state, ac._irsend.capture.bits);
acText.setRaw(ac._irsend.capture.state);
EXPECT_EQ(expected_on, acText.toString());
// Set the temp to 25C
ac._irsend.reset();
ac.setTemp(25);
EXPECT_EQ(expected_on, ac.toString());
ASSERT_EQ(25, ac.getTemp());
ac.send();
ac._irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
EXPECT_STATE_EQ(expected_on_state,
ac._irsend.capture.state, ac._irsend.capture.bits);
acText.setRaw(ac._irsend.capture.state);
EXPECT_EQ(expected_on, acText.toString());
// Increase the temp by 1.
ac._irsend.reset();
char expected_temp_plus_one[] =
"Command: 6 (Temp Up), Mode: 1 (Cool), Temp: 26C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, "
"On Timer: Off, Off Timer: Off";
// State taken from real capture:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/668#issuecomment-483531895
uint8_t expected_temp_plus_one_state[9] = {
0xA5, 0xA6, 0x20, 0x00, 0x0C, 0xC0, 0x20, 0x00, 0x57};
ASSERT_EQ(25, ac.getTemp());
ac.setTemp(ac.getTemp() + 1);
ASSERT_EQ(26, ac.getTemp());
EXPECT_EQ(expected_temp_plus_one, ac.toString());
ac.send();
ac._irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
EXPECT_STATE_EQ(expected_temp_plus_one_state,
ac._irsend.capture.state, ac._irsend.capture.bits);
acText.setRaw(ac._irsend.capture.state);
EXPECT_EQ(expected_temp_plus_one, acText.toString());
// Decrease the temp by 1.
ac._irsend.reset();
char expected_temp_minus_one[] =
"Command: 7 (Temp Down), Mode: 1 (Cool), Temp: 25C, Fan: 0 (Auto), "
"Swing: 0 (Off), Sleep: Off, Health: Off, Clock: 00:00, "
"On Timer: Off, Off Timer: Off";
ASSERT_EQ(26, ac.getTemp());
ac.setTemp(ac.getTemp() - 1);
ASSERT_EQ(25, ac.getTemp());
EXPECT_EQ(expected_temp_minus_one, ac.toString());
ac.send();
ac._irsend.makeDecodeResult();
ASSERT_TRUE(irrecv.decode(&ac._irsend.capture));
ASSERT_EQ(HAIER_AC, ac._irsend.capture.decode_type);
EXPECT_EQ(kHaierACBits, ac._irsend.capture.bits);
acText.setRaw(ac._irsend.capture.state);
EXPECT_EQ(expected_temp_minus_one, acText.toString());
}
TEST(TestHaierACClass, toCommon) {
IRHaierAC ac(0);
ac.setCommand(kHaierAcCmdOn);
ac.setMode(kHaierAcCool);
ac.setTemp(20);
ac.setFan(kHaierAcFanHigh);
ac.setSwing(kHaierAcSwingChg);
ac.setHealth(true);
ac.setSleep(true);
// Now test it.
ASSERT_EQ(decode_type_t::HAIER_AC, ac.toCommon().protocol);
ASSERT_EQ(-1, ac.toCommon().model);
ASSERT_TRUE(ac.toCommon().power);
ASSERT_TRUE(ac.toCommon().celsius);
ASSERT_EQ(20, ac.toCommon().degrees);
ASSERT_TRUE(ac.toCommon().filter);
ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
ASSERT_EQ(stdAc::swingv_t::kAuto, ac.toCommon().swingv);
ASSERT_EQ(0, ac.toCommon().sleep);
// Unsupported.
ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
ASSERT_FALSE(ac.toCommon().turbo);
ASSERT_FALSE(ac.toCommon().light);
ASSERT_FALSE(ac.toCommon().quiet);
ASSERT_FALSE(ac.toCommon().econo);
ASSERT_FALSE(ac.toCommon().clean);
ASSERT_FALSE(ac.toCommon().beep);
ASSERT_EQ(-1, ac.toCommon().clock);
}
TEST(TestHaierACYRW02Class, toCommon) {
IRHaierACYRW02 ac(0);
ac.setPower(true);
ac.setMode(kHaierAcYrw02Cool);
ac.setTemp(20);
ac.setFan(kHaierAcYrw02FanHigh);
ac.setSwing(kHaierAcYrw02SwingTop);
ac.setHealth(true);
ac.setSleep(true);
// Now test it.
ASSERT_EQ(decode_type_t::HAIER_AC_YRW02, ac.toCommon().protocol);
ASSERT_EQ(-1, ac.toCommon().model);
ASSERT_TRUE(ac.toCommon().power);
ASSERT_TRUE(ac.toCommon().celsius);
ASSERT_EQ(20, ac.toCommon().degrees);
ASSERT_TRUE(ac.toCommon().filter);
ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
ASSERT_EQ(stdAc::swingv_t::kHighest, ac.toCommon().swingv);
ASSERT_EQ(0, ac.toCommon().sleep);
// Unsupported.
ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
ASSERT_FALSE(ac.toCommon().turbo);
ASSERT_FALSE(ac.toCommon().light);
ASSERT_FALSE(ac.toCommon().quiet);
ASSERT_FALSE(ac.toCommon().econo);
ASSERT_FALSE(ac.toCommon().clean);
ASSERT_FALSE(ac.toCommon().beep);
ASSERT_EQ(-1, ac.toCommon().clock);
}