From af57c045ff6dca2fea6bc4adfc0958b245b6cad2 Mon Sep 17 00:00:00 2001 From: Boris Krivonog Date: Wed, 15 Jul 2026 22:07:22 +0200 Subject: [PATCH] [mitsubishi_cn105] Extract swing mode management for tests (#17302) --- .../mitsubishi_cn105_climate.cpp | 81 +++-------- .../mitsubishi_cn105_climate.h | 5 +- .../mitsubishi_cn105_swing_mode_manager.h | 92 +++++++++++++ .../mitsubishi_cn105_climate_tests.cpp | 129 +----------------- ...subishi_cn105_swing_mode_manager_tests.cpp | 129 ++++++++++++++++++ tests/components/mitsubishi_cn105/common.h | 10 -- 6 files changed, 245 insertions(+), 201 deletions(-) create mode 100644 esphome/components/mitsubishi_cn105/mitsubishi_cn105_swing_mode_manager.h create mode 100644 tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_swing_mode_manager_tests.cpp diff --git a/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.cpp b/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.cpp index afffe7ea5e..a3c32b5f3b 100644 --- a/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.cpp +++ b/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.cpp @@ -84,7 +84,7 @@ climate::ClimateTraits MitsubishiCN105Climate::traits() { traits.add_supported_fan_mode(p.second); } - traits.set_supported_swing_modes(this->supported_swing_modes_); + traits.set_supported_swing_modes(this->swing_mode_manager_.supported_swing_modes()); traits.set_visual_min_temperature(16.0f); traits.set_visual_max_temperature(31.0f); @@ -117,33 +117,11 @@ void MitsubishiCN105Climate::control(const climate::ClimateCall &call) { } if (const auto swing_mode = call.get_swing_mode()) { - auto vane = this->last_non_swing_vane_mode_; - auto wide = this->last_non_swing_wide_vane_mode_; - - switch (*swing_mode) { - case climate::CLIMATE_SWING_BOTH: - vane = MitsubishiCN105::VaneMode::SWING; - wide = MitsubishiCN105::WideVaneMode::SWING; - break; - - case climate::CLIMATE_SWING_VERTICAL: - vane = MitsubishiCN105::VaneMode::SWING; - break; - - case climate::CLIMATE_SWING_HORIZONTAL: - wide = MitsubishiCN105::WideVaneMode::SWING; - break; - - case climate::CLIMATE_SWING_OFF: - default: - break; + if (const auto vane = this->swing_mode_manager_.vane_from(*swing_mode)) { + this->hp_.set_vane_mode(*vane); } - - if (this->supported_swing_modes_.count(climate::CLIMATE_SWING_VERTICAL)) { - this->hp_.set_vane_mode(vane); - } - if (this->supported_swing_modes_.count(climate::CLIMATE_SWING_HORIZONTAL)) { - this->hp_.set_wide_vane_mode(wide); + if (const auto wide = this->swing_mode_manager_.wide_vane_from(*swing_mode)) { + this->hp_.set_wide_vane_mode(*wide); } } @@ -176,58 +154,31 @@ void MitsubishiCN105Climate::apply_values_() { ESP_LOGD(TAG, "Unable to map fan mode"); } - if (!this->supported_swing_modes_.empty()) { - bool vertical_swinging = false; - bool horizontal_swinging = false; - - if (this->supported_swing_modes_.count(climate::CLIMATE_SWING_VERTICAL)) { - if (status.vane_mode == MitsubishiCN105::VaneMode::SWING) { - vertical_swinging = true; - } else if (status.vane_mode != MitsubishiCN105::VaneMode::UNKNOWN) { - this->last_non_swing_vane_mode_ = status.vane_mode; - } - } - - if (this->supported_swing_modes_.count(climate::CLIMATE_SWING_HORIZONTAL)) { - if (status.wide_vane_mode == MitsubishiCN105::WideVaneMode::SWING) { - horizontal_swinging = true; - } else if (status.wide_vane_mode != MitsubishiCN105::WideVaneMode::UNKNOWN) { - this->last_non_swing_wide_vane_mode_ = status.wide_vane_mode; - } - } - - if (vertical_swinging && horizontal_swinging) { - this->swing_mode = climate::CLIMATE_SWING_BOTH; - } else if (vertical_swinging) { - this->swing_mode = climate::CLIMATE_SWING_VERTICAL; - } else if (horizontal_swinging) { - this->swing_mode = climate::CLIMATE_SWING_HORIZONTAL; - } else { - this->swing_mode = climate::CLIMATE_SWING_OFF; - } + if (const auto swing_mode = this->swing_mode_manager_.swing_mode_from(status.vane_mode, status.wide_vane_mode)) { + this->swing_mode = *swing_mode; } this->publish_state(); } void MitsubishiCN105Climate::set_supported_swing_mode(climate::ClimateSwingMode mode) { - this->supported_swing_modes_.clear(); + this->swing_mode_manager_.supported_swing_modes().clear(); switch (mode) { case climate::CLIMATE_SWING_VERTICAL: - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_OFF); - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_VERTICAL); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_OFF); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_VERTICAL); break; case climate::CLIMATE_SWING_HORIZONTAL: - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_OFF); - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_HORIZONTAL); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_OFF); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_HORIZONTAL); break; case climate::CLIMATE_SWING_BOTH: - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_OFF); - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_VERTICAL); - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_HORIZONTAL); - this->supported_swing_modes_.insert(climate::CLIMATE_SWING_BOTH); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_OFF); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_VERTICAL); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_HORIZONTAL); + this->swing_mode_manager_.supported_swing_modes().insert(climate::CLIMATE_SWING_BOTH); break; case climate::CLIMATE_SWING_OFF: diff --git a/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.h b/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.h index 952eac98d7..3363893637 100644 --- a/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.h +++ b/esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.h @@ -5,6 +5,7 @@ #include "esphome/components/climate/climate.h" #include "esphome/components/uart/uart.h" #include "mitsubishi_cn105.h" +#include "mitsubishi_cn105_swing_mode_manager.h" namespace esphome::mitsubishi_cn105 { @@ -31,9 +32,7 @@ class MitsubishiCN105Climate final : public climate::Climate, public Component, void apply_values_(); MitsubishiCN105 hp_; - climate::ClimateSwingModeMask supported_swing_modes_{}; - MitsubishiCN105::VaneMode last_non_swing_vane_mode_{MitsubishiCN105::VaneMode::AUTO}; - MitsubishiCN105::WideVaneMode last_non_swing_wide_vane_mode_{MitsubishiCN105::WideVaneMode::CENTER}; + SwingModeManager swing_mode_manager_; }; template diff --git a/esphome/components/mitsubishi_cn105/mitsubishi_cn105_swing_mode_manager.h b/esphome/components/mitsubishi_cn105/mitsubishi_cn105_swing_mode_manager.h new file mode 100644 index 0000000000..dc5644fc7f --- /dev/null +++ b/esphome/components/mitsubishi_cn105/mitsubishi_cn105_swing_mode_manager.h @@ -0,0 +1,92 @@ +#pragma once + +#include + +#include "esphome/components/climate/climate.h" +#include "mitsubishi_cn105.h" + +namespace esphome::mitsubishi_cn105 { + +class SwingModeManager { + public: + const climate::ClimateSwingModeMask &supported_swing_modes() const { return this->supported_swing_modes_; } + climate::ClimateSwingModeMask &supported_swing_modes() { return this->supported_swing_modes_; } + + std::optional vane_from(climate::ClimateSwingMode swing_mode) const { + if (!this->supported_swing_modes_.count(climate::CLIMATE_SWING_VERTICAL)) { + return std::nullopt; + } + + switch (swing_mode) { + case climate::CLIMATE_SWING_BOTH: + case climate::CLIMATE_SWING_VERTICAL: + return MitsubishiCN105::VaneMode::SWING; + + case climate::CLIMATE_SWING_HORIZONTAL: + case climate::CLIMATE_SWING_OFF: + default: + return this->last_non_swing_vane_mode_; + } + } + + std::optional wide_vane_from(climate::ClimateSwingMode swing_mode) const { + if (!this->supported_swing_modes_.count(climate::CLIMATE_SWING_HORIZONTAL)) { + return std::nullopt; + } + + switch (swing_mode) { + case climate::CLIMATE_SWING_BOTH: + case climate::CLIMATE_SWING_HORIZONTAL: + return MitsubishiCN105::WideVaneMode::SWING; + + case climate::CLIMATE_SWING_VERTICAL: + case climate::CLIMATE_SWING_OFF: + default: + return this->last_non_swing_wide_vane_mode_; + } + } + + std::optional swing_mode_from(MitsubishiCN105::VaneMode vane_mode, + MitsubishiCN105::WideVaneMode wide_vane_mode) { + if (this->supported_swing_modes_.empty()) { + return std::nullopt; + } + + bool vertical_swinging = false; + bool horizontal_swinging = false; + + if (this->supported_swing_modes_.count(climate::CLIMATE_SWING_VERTICAL)) { + if (vane_mode == MitsubishiCN105::VaneMode::SWING) { + vertical_swinging = true; + } else if (vane_mode != MitsubishiCN105::VaneMode::UNKNOWN) { + this->last_non_swing_vane_mode_ = vane_mode; + } + } + + if (this->supported_swing_modes_.count(climate::CLIMATE_SWING_HORIZONTAL)) { + if (wide_vane_mode == MitsubishiCN105::WideVaneMode::SWING) { + horizontal_swinging = true; + } else if (wide_vane_mode != MitsubishiCN105::WideVaneMode::UNKNOWN) { + this->last_non_swing_wide_vane_mode_ = wide_vane_mode; + } + } + + if (vertical_swinging && horizontal_swinging) { + return climate::CLIMATE_SWING_BOTH; + } + if (vertical_swinging) { + return climate::CLIMATE_SWING_VERTICAL; + } + if (horizontal_swinging) { + return climate::CLIMATE_SWING_HORIZONTAL; + } + return climate::CLIMATE_SWING_OFF; + } + + protected: + climate::ClimateSwingModeMask supported_swing_modes_{}; + MitsubishiCN105::VaneMode last_non_swing_vane_mode_{MitsubishiCN105::VaneMode::AUTO}; + MitsubishiCN105::WideVaneMode last_non_swing_wide_vane_mode_{MitsubishiCN105::WideVaneMode::CENTER}; +}; + +} // namespace esphome::mitsubishi_cn105 diff --git a/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_climate_tests.cpp b/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_climate_tests.cpp index 36e0fc90b4..bd94d5be79 100644 --- a/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_climate_tests.cpp +++ b/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_climate_tests.cpp @@ -1,9 +1,11 @@ #include "../common.h" +#include "esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.h" + namespace esphome::mitsubishi_cn105::testing { TEST(MitsubishiCN105ClimateTests, SupportedSwingModeOffLeavesTraitsEmpty) { - TestableMitsubishiCN105Climate sut; + MitsubishiCN105Climate sut; sut.set_supported_swing_mode(climate::CLIMATE_SWING_OFF); @@ -11,7 +13,7 @@ TEST(MitsubishiCN105ClimateTests, SupportedSwingModeOffLeavesTraitsEmpty) { } TEST(MitsubishiCN105ClimateTests, SupportedSwingModeVerticalExposesOffAndVertical) { - TestableMitsubishiCN105Climate sut; + MitsubishiCN105Climate sut; sut.set_supported_swing_mode(climate::CLIMATE_SWING_VERTICAL); @@ -22,7 +24,7 @@ TEST(MitsubishiCN105ClimateTests, SupportedSwingModeVerticalExposesOffAndVertica } TEST(MitsubishiCN105ClimateTests, SupportedSwingModeHorizontalExposesOffAndHorizontal) { - TestableMitsubishiCN105Climate sut; + MitsubishiCN105Climate sut; sut.set_supported_swing_mode(climate::CLIMATE_SWING_HORIZONTAL); @@ -33,7 +35,7 @@ TEST(MitsubishiCN105ClimateTests, SupportedSwingModeHorizontalExposesOffAndHoriz } TEST(MitsubishiCN105ClimateTests, SupportedSwingModeBothExposesAllExpectedModes) { - TestableMitsubishiCN105Climate sut; + MitsubishiCN105Climate sut; sut.set_supported_swing_mode(climate::CLIMATE_SWING_BOTH); @@ -43,123 +45,4 @@ TEST(MitsubishiCN105ClimateTests, SupportedSwingModeBothExposesAllExpectedModes) EXPECT_TRUE(sut.traits().supports_swing_mode(climate::CLIMATE_SWING_BOTH)); } -TEST(MitsubishiCN105ClimateTests, ApplyValuesMapsVerticalSwingWhenSupported) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_VERTICAL); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::SWING; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::CENTER; - - sut.apply_values_(); - - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_VERTICAL); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesMapsHorizontalSwingWhenSupported) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_HORIZONTAL); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::AUTO; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::SWING; - - sut.apply_values_(); - - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_HORIZONTAL); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesMapsBothSwingWhenSupported) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_BOTH); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::SWING; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::SWING; - - sut.apply_values_(); - - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_BOTH); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesMapsSwingOffWhenNoSwingActive) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_BOTH); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::POSITION_3; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::CENTER; - - sut.apply_values_(); - - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_OFF); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesRemembersLastNonSwingPositions) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_BOTH); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::POSITION_4; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::RIGHT; - - sut.apply_values_(); - - EXPECT_EQ(sut.last_non_swing_vane_mode_, MitsubishiCN105::VaneMode::POSITION_4); - EXPECT_EQ(sut.last_non_swing_wide_vane_mode_, MitsubishiCN105::WideVaneMode::RIGHT); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::SWING; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::SWING; - - sut.apply_values_(); - - EXPECT_EQ(sut.last_non_swing_vane_mode_, MitsubishiCN105::VaneMode::POSITION_4); - EXPECT_EQ(sut.last_non_swing_wide_vane_mode_, MitsubishiCN105::WideVaneMode::RIGHT); - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_BOTH); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesDoesNotOverwriteRememberedPositionWithUnknownValues) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_BOTH); - - sut.last_non_swing_vane_mode_ = MitsubishiCN105::VaneMode::POSITION_2; - sut.last_non_swing_wide_vane_mode_ = MitsubishiCN105::WideVaneMode::LEFT; - - sut.status().vane_mode = MitsubishiCN105::VaneMode::UNKNOWN; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::UNKNOWN; - - sut.apply_values_(); - - EXPECT_EQ(sut.last_non_swing_vane_mode_, MitsubishiCN105::VaneMode::POSITION_2); - EXPECT_EQ(sut.last_non_swing_wide_vane_mode_, MitsubishiCN105::WideVaneMode::LEFT); - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_OFF); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesIgnoresUnsupportedVerticalSwingState) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_HORIZONTAL); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::SWING; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::CENTER; - - sut.apply_values_(); - - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_OFF); -} - -TEST(MitsubishiCN105ClimateTests, ApplyValuesIgnoresUnsupportedHorizontalSwingState) { - TestableMitsubishiCN105Climate sut; - - sut.set_supported_swing_mode(climate::CLIMATE_SWING_VERTICAL); - - sut.status().vane_mode = MitsubishiCN105::VaneMode::AUTO; - sut.status().wide_vane_mode = MitsubishiCN105::WideVaneMode::SWING; - - sut.apply_values_(); - - EXPECT_EQ(sut.swing_mode, climate::CLIMATE_SWING_OFF); -} - } // namespace esphome::mitsubishi_cn105::testing diff --git a/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_swing_mode_manager_tests.cpp b/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_swing_mode_manager_tests.cpp new file mode 100644 index 0000000000..5b57abb7da --- /dev/null +++ b/tests/components/mitsubishi_cn105/climate/mitsubishi_cn105_swing_mode_manager_tests.cpp @@ -0,0 +1,129 @@ +#include "../common.h" + +#include "esphome/components/mitsubishi_cn105/mitsubishi_cn105_swing_mode_manager.h" + +namespace esphome::mitsubishi_cn105::testing { + +static SwingModeManager make_swing_mode_manager(std::initializer_list supported_modes) { + SwingModeManager manager; + for (const auto mode : supported_modes) { + manager.supported_swing_modes().insert(mode); + } + return manager; +} + +TEST(SwingModeManagerTests, StatusMapsVerticalSwingWhenSupported) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::SWING, MitsubishiCN105::WideVaneMode::CENTER); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_VERTICAL}); +} + +TEST(SwingModeManagerTests, StatusMapsHorizontalSwingWhenSupported) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_HORIZONTAL}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::AUTO, MitsubishiCN105::WideVaneMode::SWING); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_HORIZONTAL}); +} + +TEST(SwingModeManagerTests, StatusMapsBothSwingWhenSupported) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL, + climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::SWING, MitsubishiCN105::WideVaneMode::SWING); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_BOTH}); +} + +TEST(SwingModeManagerTests, StatusMapsSwingOffWhenNoSwingActive) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL, + climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::POSITION_3, MitsubishiCN105::WideVaneMode::CENTER); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_OFF}); +} + +TEST(SwingModeManagerTests, RemembersLastNonSwingPositions) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL, + climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}); + + manager.swing_mode_from(MitsubishiCN105::VaneMode::POSITION_4, MitsubishiCN105::WideVaneMode::RIGHT); + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::SWING, MitsubishiCN105::WideVaneMode::SWING); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_BOTH}); + EXPECT_EQ(manager.vane_from(climate::CLIMATE_SWING_OFF), std::optional{MitsubishiCN105::VaneMode::POSITION_4}); + EXPECT_EQ(manager.wide_vane_from(climate::CLIMATE_SWING_OFF), std::optional{MitsubishiCN105::WideVaneMode::RIGHT}); +} + +TEST(SwingModeManagerTests, UnknownValuesDoNotOverwriteRememberedPositions) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL, + climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}); + + manager.swing_mode_from(MitsubishiCN105::VaneMode::POSITION_2, MitsubishiCN105::WideVaneMode::LEFT); + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::UNKNOWN, MitsubishiCN105::WideVaneMode::UNKNOWN); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_OFF}); + EXPECT_EQ(manager.vane_from(climate::CLIMATE_SWING_OFF), std::optional{MitsubishiCN105::VaneMode::POSITION_2}); + EXPECT_EQ(manager.wide_vane_from(climate::CLIMATE_SWING_OFF), std::optional{MitsubishiCN105::WideVaneMode::LEFT}); +} + +TEST(SwingModeManagerTests, UnsupportedVerticalSwingStateIsIgnored) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_HORIZONTAL}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::SWING, MitsubishiCN105::WideVaneMode::CENTER); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_OFF}); +} + +TEST(SwingModeManagerTests, UnsupportedHorizontalSwingStateIsIgnored) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::AUTO, MitsubishiCN105::WideVaneMode::SWING); + + EXPECT_EQ(swing_mode, std::optional{climate::CLIMATE_SWING_OFF}); +} + +TEST(SwingModeManagerTests, SwingModeFromReturnsNulloptWhenNoSwingModesSupported) { + auto manager = make_swing_mode_manager({}); + + const auto swing_mode = + manager.swing_mode_from(MitsubishiCN105::VaneMode::SWING, MitsubishiCN105::WideVaneMode::SWING); + + EXPECT_FALSE(swing_mode.has_value()); +} + +TEST(SwingModeManagerTests, VaneFromSwingModeReturnsNulloptWhenVerticalUnsupported) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_HORIZONTAL}); + + EXPECT_FALSE(manager.vane_from(climate::CLIMATE_SWING_VERTICAL).has_value()); +} + +TEST(SwingModeManagerTests, WideVaneFromSwingModeReturnsNulloptWhenHorizontalUnsupported) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL}); + + EXPECT_FALSE(manager.wide_vane_from(climate::CLIMATE_SWING_HORIZONTAL).has_value()); +} + +TEST(SwingModeManagerTests, VaneAndWideVaneFromSwingModeMapSwingModes) { + auto manager = make_swing_mode_manager({climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL, + climate::CLIMATE_SWING_HORIZONTAL, climate::CLIMATE_SWING_BOTH}); + + EXPECT_EQ(manager.vane_from(climate::CLIMATE_SWING_VERTICAL), std::optional{MitsubishiCN105::VaneMode::SWING}); + EXPECT_EQ(manager.vane_from(climate::CLIMATE_SWING_BOTH), std::optional{MitsubishiCN105::VaneMode::SWING}); + EXPECT_EQ(manager.wide_vane_from(climate::CLIMATE_SWING_HORIZONTAL), + std::optional{MitsubishiCN105::WideVaneMode::SWING}); + EXPECT_EQ(manager.wide_vane_from(climate::CLIMATE_SWING_BOTH), std::optional{MitsubishiCN105::WideVaneMode::SWING}); +} + +} // namespace esphome::mitsubishi_cn105::testing diff --git a/tests/components/mitsubishi_cn105/common.h b/tests/components/mitsubishi_cn105/common.h index 798f7283f6..7294d6d6fb 100644 --- a/tests/components/mitsubishi_cn105/common.h +++ b/tests/components/mitsubishi_cn105/common.h @@ -8,7 +8,6 @@ #include #include "esphome/components/uart/uart_component.h" #include "esphome/components/mitsubishi_cn105/mitsubishi_cn105.h" -#include "esphome/components/mitsubishi_cn105/mitsubishi_cn105_climate.h" namespace esphome::mitsubishi_cn105::testing { @@ -60,13 +59,4 @@ class TestableMitsubishiCN105 : public MitsubishiCN105 { void set_current_time(uint32_t ms) { test_loop_time_ms = ms; } }; -class TestableMitsubishiCN105Climate : public MitsubishiCN105Climate { - public: - using MitsubishiCN105Climate::apply_values_; - using MitsubishiCN105Climate::last_non_swing_vane_mode_; - using MitsubishiCN105Climate::last_non_swing_wide_vane_mode_; - - MitsubishiCN105::Status &status() { return static_cast(this->hp_).status_; } -}; - } // namespace esphome::mitsubishi_cn105::testing