mirror of https://github.com/arendst/Tasmota.git
222 lines
6.3 KiB
C++
Executable File
222 lines
6.3 KiB
C++
Executable File
// Copyright 2019 David Conran
|
|
#include "ir_Argo.h"
|
|
#include "IRrecv.h"
|
|
#include "IRrecv_test.h"
|
|
#include "IRsend.h"
|
|
#include "IRsend_test.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
|
|
TEST(TestArgoACClass, toCommon) {
|
|
IRArgoAC ac(0);
|
|
ac.setPower(true);
|
|
ac.setMode(kArgoCool);
|
|
ac.setTemp(20);
|
|
ac.setFan(kArgoFan3);
|
|
ac.setMax(true);
|
|
ac.setNight(true);
|
|
// Now test it.
|
|
ASSERT_EQ(decode_type_t::ARGO, ac.toCommon().protocol);
|
|
ASSERT_TRUE(ac.toCommon().power);
|
|
ASSERT_TRUE(ac.toCommon().celsius);
|
|
ASSERT_EQ(20, ac.toCommon().degrees);
|
|
ASSERT_EQ(stdAc::opmode_t::kCool, ac.toCommon().mode);
|
|
ASSERT_EQ(stdAc::fanspeed_t::kMax, ac.toCommon().fanspeed);
|
|
ASSERT_EQ(0, ac.toCommon().sleep);
|
|
ASSERT_TRUE(ac.toCommon().turbo);
|
|
// Unsupported.
|
|
ASSERT_EQ(-1, ac.toCommon().model);
|
|
ASSERT_EQ(stdAc::swingv_t::kOff, ac.toCommon().swingv);
|
|
ASSERT_EQ(stdAc::swingh_t::kOff, ac.toCommon().swingh);
|
|
ASSERT_FALSE(ac.toCommon().econo);
|
|
ASSERT_FALSE(ac.toCommon().light);
|
|
ASSERT_FALSE(ac.toCommon().filter);
|
|
ASSERT_FALSE(ac.toCommon().clean);
|
|
ASSERT_FALSE(ac.toCommon().beep);
|
|
ASSERT_FALSE(ac.toCommon().quiet);
|
|
ASSERT_EQ(-1, ac.toCommon().clock);
|
|
}
|
|
|
|
TEST(TestArgoACClass, MessageConstructon) {
|
|
IRArgoAC ac(0);
|
|
ac.setPower(true);
|
|
ac.setTemp(20);
|
|
ac.setMode(kArgoCool);
|
|
ac.setFan(kArgoFanAuto);
|
|
ac.setRoomTemp(21);
|
|
ac.setiFeel(true);
|
|
ac.setMax(true);
|
|
ac.setNight(true);
|
|
|
|
// Don't implicitly trust this. It's just a guess.
|
|
uint8_t expected[kArgoStateLength] = {
|
|
0xAC, 0xF5, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD6, 0x01};
|
|
EXPECT_STATE_EQ(expected, ac.getRaw(), kArgoBits);
|
|
EXPECT_EQ(
|
|
"Power: On, Mode: 0 (COOL), Fan: 0 (AUTO), Temp: 20C, Room Temp: 21C, "
|
|
"Max: On, iFeel: On, Night: On",
|
|
ac.toString());
|
|
}
|
|
|
|
// Tests for sendArgo().
|
|
|
|
// Test sending typical data only.
|
|
TEST(TestSendArgo, SendDataOnly) {
|
|
IRsendTest irsend(0);
|
|
irsend.begin();
|
|
uint8_t data[kArgoStateLength] = {
|
|
0xAC, 0xF5, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD6, 0x01};
|
|
|
|
irsend.sendArgo(data);
|
|
EXPECT_EQ(
|
|
"f38000d50"
|
|
"m6400s3300"
|
|
"m400s900m400s900m400s2200m400s2200m400s900m400s2200m400s900m400s2200"
|
|
"m400s2200m400s900m400s2200m400s900m400s2200m400s2200m400s2200m400s2200"
|
|
"m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900m400s900m400s2200m400s900m400s900m400s2200m400s900m400s900"
|
|
"m400s900m400s2200m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900m400s900m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900m400s900m400s2200m400s2200m400s900m400s2200m400s900m400s2200"
|
|
"m400s900m400s2200m400s2200m400s900m400s2200m400s900m400s2200m400s2200"
|
|
"m400s2200m400s900m400s900m400s900m400s900m400s900m400s900"
|
|
"m400s900",
|
|
irsend.outputStr());
|
|
}
|
|
|
|
// Tests for decodeArgo().
|
|
// Decode normal Argo messages.
|
|
|
|
TEST(TestDecodeArgo, SyntheticDecode) {
|
|
IRsendTest irsend(0);
|
|
IRrecv irrecv(0);
|
|
irsend.begin();
|
|
|
|
// Synthesised Normal Argo message.
|
|
irsend.reset();
|
|
uint8_t expectedState[kArgoStateLength] = {
|
|
0xAC, 0xF5, 0x00, 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xD6, 0x01};
|
|
irsend.sendArgo(expectedState);
|
|
irsend.makeDecodeResult();
|
|
EXPECT_TRUE(irrecv.decode(&irsend.capture));
|
|
EXPECT_EQ(decode_type_t::ARGO, irsend.capture.decode_type);
|
|
EXPECT_EQ(kArgoBits, irsend.capture.bits);
|
|
EXPECT_STATE_EQ(expectedState, irsend.capture.state, irsend.capture.bits);
|
|
}
|
|
|
|
|
|
TEST(TestArgoACClass, SetAndGetTemp) {
|
|
IRArgoAC ac(0);
|
|
|
|
ac.setTemp(25);
|
|
EXPECT_EQ(25, ac.getTemp());
|
|
ac.setTemp(kArgoMinTemp);
|
|
EXPECT_EQ(kArgoMinTemp, ac.getTemp());
|
|
ac.setTemp(kArgoMaxTemp);
|
|
EXPECT_EQ(kArgoMaxTemp, ac.getTemp());
|
|
ac.setTemp(kArgoMinTemp - 1);
|
|
EXPECT_EQ(kArgoMinTemp, ac.getTemp());
|
|
ac.setTemp(kArgoMaxTemp + 1);
|
|
EXPECT_EQ(kArgoMaxTemp, ac.getTemp());
|
|
}
|
|
|
|
TEST(TestArgoACClass, SetAndGetRoomTemp) {
|
|
IRArgoAC ac(0);
|
|
|
|
ac.setRoomTemp(25);
|
|
EXPECT_EQ(25, ac.getRoomTemp());
|
|
ac.setRoomTemp(kArgoTempOffset);
|
|
EXPECT_EQ(kArgoTempOffset, ac.getRoomTemp());
|
|
ac.setRoomTemp(kArgoMaxRoomTemp);
|
|
EXPECT_EQ(kArgoMaxRoomTemp, ac.getRoomTemp());
|
|
ac.setRoomTemp(kArgoTempOffset - 1);
|
|
EXPECT_EQ(kArgoTempOffset, ac.getRoomTemp());
|
|
ac.setRoomTemp(kArgoMaxRoomTemp + 1);
|
|
EXPECT_EQ(kArgoMaxRoomTemp, ac.getRoomTemp());
|
|
}
|
|
|
|
TEST(TestArgoACClass, SetAndGetMode) {
|
|
IRArgoAC ac(0);
|
|
|
|
ac.setMode(kArgoHeat);
|
|
EXPECT_EQ(kArgoHeat, ac.getMode());
|
|
ac.setMode(kArgoCool);
|
|
EXPECT_EQ(kArgoCool, ac.getMode());
|
|
ac.setMode(kArgoDry);
|
|
EXPECT_EQ(kArgoDry, ac.getMode());
|
|
ac.setMode(kArgoAuto);
|
|
EXPECT_EQ(kArgoAuto, ac.getMode());
|
|
ac.setMode(kArgoHeatAuto);
|
|
EXPECT_EQ(kArgoHeatAuto, ac.getMode());
|
|
ac.setMode(kArgoOff);
|
|
EXPECT_EQ(kArgoOff, ac.getMode());
|
|
ac.setMode(255);
|
|
EXPECT_EQ(kArgoAuto, ac.getMode());
|
|
}
|
|
|
|
TEST(TestArgoACClass, SetAndGetFan) {
|
|
IRArgoAC ac(0);
|
|
|
|
ac.setFan(kArgoFan3);
|
|
EXPECT_EQ(kArgoFan3, ac.getFan());
|
|
ac.setFan(kArgoFan1);
|
|
EXPECT_EQ(kArgoFan1, ac.getFan());
|
|
ac.setFan(kArgoFanAuto);
|
|
EXPECT_EQ(kArgoFanAuto, ac.getFan());
|
|
ac.setFan(kArgoFan3);
|
|
EXPECT_EQ(kArgoFan3, ac.getFan());
|
|
ASSERT_NE(7, kArgoFan3);
|
|
// Now try some unexpected value.
|
|
ac.setFan(7);
|
|
EXPECT_EQ(kArgoFan3, ac.getFan());
|
|
}
|
|
|
|
TEST(TestArgoACClass, Night) {
|
|
IRArgoAC ac(0);
|
|
ac.setNight(false);
|
|
ASSERT_FALSE(ac.getNight());
|
|
ac.setNight(true);
|
|
ASSERT_TRUE(ac.getNight());
|
|
ac.setNight(false);
|
|
ASSERT_FALSE(ac.getNight());
|
|
}
|
|
|
|
TEST(TestArgoACClass, iFeel) {
|
|
IRArgoAC ac(0);
|
|
ac.setiFeel(false);
|
|
ASSERT_FALSE(ac.getiFeel());
|
|
ac.setiFeel(true);
|
|
ASSERT_TRUE(ac.getiFeel());
|
|
ac.setiFeel(false);
|
|
ASSERT_FALSE(ac.getiFeel());
|
|
}
|
|
|
|
TEST(TestArgoACClass, Power) {
|
|
IRArgoAC ac(0);
|
|
ac.setPower(false);
|
|
ASSERT_FALSE(ac.getPower());
|
|
ac.setPower(true);
|
|
ASSERT_TRUE(ac.getPower());
|
|
ac.setPower(false);
|
|
ASSERT_FALSE(ac.getPower());
|
|
}
|
|
|
|
TEST(TestArgoACClass, Max) {
|
|
IRArgoAC ac(0);
|
|
ac.setMax(false);
|
|
ASSERT_FALSE(ac.getMax());
|
|
ac.setMax(true);
|
|
ASSERT_TRUE(ac.getMax());
|
|
ac.setMax(false);
|
|
ASSERT_FALSE(ac.getMax());
|
|
}
|
|
|
|
TEST(TestUtils, Housekeeping) {
|
|
ASSERT_EQ("ARGO", typeToString(decode_type_t::ARGO));
|
|
ASSERT_EQ(decode_type_t::ARGO, strToDecodeType("ARGO"));
|
|
ASSERT_TRUE(hasACState(decode_type_t::ARGO));
|
|
}
|