mirror of
https://github.com/esphome/esphome.git
synced 2026-09-28 07:20:24 +00:00
75 lines
2.1 KiB
C++
75 lines
2.1 KiB
C++
#include <gtest/gtest.h>
|
|
|
|
#include "esphome/components/json/json_util.h"
|
|
#include "esphome/components/light/light_call.h"
|
|
#include "esphome/components/light/light_json_schema.h"
|
|
#include "esphome/components/light/light_output.h"
|
|
#include "esphome/components/light/light_state.h"
|
|
|
|
namespace esphome::light::testing {
|
|
|
|
namespace {
|
|
|
|
// An `rgbw` light with `color_interlock: true`
|
|
class InterlockedRgbwOutput : public LightOutput {
|
|
public:
|
|
LightTraits get_traits() override {
|
|
LightTraits traits;
|
|
traits.set_supported_color_modes({ColorMode::RGB, ColorMode::WHITE});
|
|
return traits;
|
|
}
|
|
void write_state(LightState *state) override {}
|
|
};
|
|
|
|
class TestableLightCall : public LightCall {
|
|
public:
|
|
using LightCall::LightCall;
|
|
using LightCall::validate_;
|
|
};
|
|
|
|
LightColorValues parse(LightState &state, const char *payload) {
|
|
TestableLightCall call(&state);
|
|
json::parse_json(payload, [&](JsonObject root) {
|
|
LightJSONSchema::parse_json(state, call, root);
|
|
return true;
|
|
});
|
|
return call.validate_();
|
|
}
|
|
|
|
} // namespace
|
|
|
|
// HA's MQTT JSON schema selects the white color mode with a top-level `white` key
|
|
TEST(LightJSONSchema, TopLevelWhiteSelectsWhiteMode) {
|
|
InterlockedRgbwOutput output;
|
|
LightState state(&output);
|
|
state.remote_values.set_color_mode(ColorMode::RGB);
|
|
|
|
auto values = parse(state, R"({"state":"ON","white":128})");
|
|
|
|
EXPECT_EQ(values.get_color_mode(), ColorMode::WHITE);
|
|
EXPECT_FLOAT_EQ(values.get_brightness(), 128.0f / 255.0f);
|
|
EXPECT_FLOAT_EQ(values.get_white(), 1.0f);
|
|
}
|
|
|
|
TEST(LightJSONSchema, TopLevelWhiteOverridesBrightness) {
|
|
InterlockedRgbwOutput output;
|
|
LightState state(&output);
|
|
|
|
auto values = parse(state, R"({"state":"ON","brightness":255,"white":128})");
|
|
|
|
EXPECT_EQ(values.get_color_mode(), ColorMode::WHITE);
|
|
EXPECT_FLOAT_EQ(values.get_brightness(), 128.0f / 255.0f);
|
|
}
|
|
|
|
TEST(LightJSONSchema, ColorWStillSetsWhite) {
|
|
InterlockedRgbwOutput output;
|
|
LightState state(&output);
|
|
|
|
auto values = parse(state, R"({"state":"ON","color":{"w":255}})");
|
|
|
|
EXPECT_EQ(values.get_color_mode(), ColorMode::WHITE);
|
|
EXPECT_FLOAT_EQ(values.get_white(), 1.0f);
|
|
}
|
|
|
|
} // namespace esphome::light::testing
|