/** \file test_HueLight.cpp Copyright Notice\n Copyright (C) 2017 Jan Rogall - developer\n Copyright (C) 2017 Moritz Wirger - developer\n This file is part of hueplusplus. hueplusplus is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. hueplusplus is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with hueplusplus. If not, see . **/ #include #include #include "testhelper.h" #include "hueplusplus/Bridge.h" #include "hueplusplus/Light.h" #include "json/json.hpp" #include "mocks/mock_HttpHandler.h" using namespace hueplusplus; class HueLightTest : public ::testing::Test { protected: std::shared_ptr handler; nlohmann::json hue_bridge_state; Bridge test_bridge; protected: HueLightTest() : handler(std::make_shared()), hue_bridge_state({{"lights", {{"1", {{"state", {{"on", true}, {"bri", 254}, {"ct", 366}, {"alert", "none"}, {"colormode", "ct"}, {"reachable", true}, {"effect", "none"}}}, {"swupdate", {{"state", "noupdates"}, {"lastinstall", nullptr}}}, {"type", "Dimmable light"}, {"name", "Hue lamp 1"}, {"modelid", "LWB004"}, {"manufacturername", "Philips"}, {"productname", "Hue bloom"}, {"uniqueid", "00:00:00:00:00:00:00:00-00"}, {"swversion", "5.50.1.19085"}, {"luminaireuniqueid", "0000000"}}}, {"2", {{"state", {{"on", false}, {"bri", 0}, {"ct", 366}, {"hue", 12345}, {"sat", 123}, {"xy", {0.102, 0.102}}, {"alert", "none"}, {"colormode", "ct"}, {"reachable", true}, {"effect", "none"}}}, {"swupdate", {{"state", "noupdates"}, {"lastinstall", nullptr}}}, {"type", "Color light"}, {"name", "Hue lamp 2"}, {"modelid", "LST001"}, {"uniqueid", "11:11:11:11:11:11:11:11-11"}, {"swversion", "5.50.1.19085"}}}, {"3", {{"state", {{"on", false}, {"bri", 254}, {"ct", 366}, {"hue", 12345}, {"sat", 123}, {"xy", {0.102, 0.102}}, {"alert", "none"}, {"colormode", "ct"}, {"reachable", true}, {"effect", "none"}}}, {"swupdate", {{"state", "noupdates"}, {"lastinstall", nullptr}}}, {"type", "Extended color light"}, {"name", "Hue lamp 3"}, {"modelid", "LCT010"}, {"manufacturername", "Philips"}, {"productname", "Hue bloom"}, {"swversion", "5.50.1.19085"}}}}}}), test_bridge(getBridgeIp(), getBridgePort(), getBridgeUsername(), handler) { using namespace ::testing; EXPECT_CALL(*handler, GETJson("/api/" + getBridgeUsername(), nlohmann::json::object(), getBridgeIp(), 80)) .Times(AtLeast(1)) .WillRepeatedly(Return(hue_bridge_state)); } ~HueLightTest() {}; }; TEST_F(HueLightTest, Constructor) { const Light ctest_light_1 = test_bridge.lights().get(1); Light test_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); Light test_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_3 = test_bridge.lights().get(3); } TEST_F(HueLightTest, on) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 255; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(true, test_light_1.on(33)); EXPECT_EQ(false, test_light_2.on()); EXPECT_EQ(true, test_light_3.on(255)); } TEST_F(HueLightTest, off) { using namespace ::testing; nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/1/state/transitiontime"] = 33; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/1/state/on"] = false; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/1/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(true, test_light_1.off(33)); EXPECT_EQ(true, test_light_2.off()); EXPECT_EQ(true, test_light_3.off(255)); } TEST_F(HueLightTest, isOn) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(true, ctest_light_1.isOn()); EXPECT_EQ(false, ctest_light_2.isOn()); EXPECT_EQ(false, ctest_light_3.isOn()); EXPECT_EQ(true, test_light_1.isOn()); EXPECT_EQ(false, test_light_2.isOn()); EXPECT_EQ(false, test_light_3.isOn()); } TEST_F(HueLightTest, getId) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(1, ctest_light_1.getId()); EXPECT_EQ(2, ctest_light_2.getId()); EXPECT_EQ(3, ctest_light_3.getId()); EXPECT_EQ(1, test_light_1.getId()); EXPECT_EQ(2, test_light_2.getId()); EXPECT_EQ(3, test_light_3.getId()); } TEST_F(HueLightTest, getType) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("Dimmable light", ctest_light_1.getType()); EXPECT_EQ("Color light", ctest_light_2.getType()); EXPECT_EQ("Extended color light", ctest_light_3.getType()); EXPECT_EQ("Dimmable light", test_light_1.getType()); EXPECT_EQ("Color light", test_light_2.getType()); EXPECT_EQ("Extended color light", test_light_3.getType()); } TEST_F(HueLightTest, getName) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("Hue lamp 1", ctest_light_1.getName()); EXPECT_EQ("Hue lamp 2", ctest_light_2.getName()); EXPECT_EQ("Hue lamp 3", ctest_light_3.getName()); EXPECT_EQ("Hue lamp 1", test_light_1.getName()); EXPECT_EQ("Hue lamp 2", test_light_2.getName()); EXPECT_EQ("Hue lamp 3", test_light_3.getName()); } TEST_F(HueLightTest, getModelId) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("LWB004", ctest_light_1.getModelId()); EXPECT_EQ("LST001", ctest_light_2.getModelId()); EXPECT_EQ("LCT010", ctest_light_3.getModelId()); EXPECT_EQ("LWB004", test_light_1.getModelId()); EXPECT_EQ("LST001", test_light_2.getModelId()); EXPECT_EQ("LCT010", test_light_3.getModelId()); } TEST_F(HueLightTest, getUId) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("00:00:00:00:00:00:00:00-00", ctest_light_1.getUId()); EXPECT_EQ("11:11:11:11:11:11:11:11-11", ctest_light_2.getUId()); EXPECT_EQ("", ctest_light_3.getUId()); EXPECT_EQ("00:00:00:00:00:00:00:00-00", test_light_1.getUId()); EXPECT_EQ("11:11:11:11:11:11:11:11-11", test_light_2.getUId()); EXPECT_EQ("", test_light_3.getUId()); } TEST_F(HueLightTest, getManufacturername) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("Philips", ctest_light_1.getManufacturername()); EXPECT_EQ("", ctest_light_2.getManufacturername()); EXPECT_EQ("Philips", ctest_light_3.getManufacturername()); EXPECT_EQ("Philips", test_light_1.getManufacturername()); EXPECT_EQ("", test_light_2.getManufacturername()); EXPECT_EQ("Philips", test_light_3.getManufacturername()); } TEST_F(HueLightTest, getProductname) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("Hue bloom", ctest_light_1.getProductname()); EXPECT_EQ("", ctest_light_2.getProductname()); EXPECT_EQ("Hue bloom", ctest_light_3.getProductname()); EXPECT_EQ("Hue bloom", test_light_1.getProductname()); EXPECT_EQ("", test_light_2.getProductname()); EXPECT_EQ("Hue bloom", test_light_3.getProductname()); } TEST_F(HueLightTest, getLuminaireUId) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("0000000", ctest_light_1.getLuminaireUId()); EXPECT_EQ("", ctest_light_2.getLuminaireUId()); EXPECT_EQ("", ctest_light_3.getLuminaireUId()); EXPECT_EQ("0000000", test_light_1.getLuminaireUId()); EXPECT_EQ("", test_light_2.getLuminaireUId()); EXPECT_EQ("", test_light_3.getLuminaireUId()); } TEST_F(HueLightTest, getSwVersion) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ("5.50.1.19085", ctest_light_1.getSwVersion()); EXPECT_EQ("5.50.1.19085", ctest_light_2.getSwVersion()); EXPECT_EQ("5.50.1.19085", ctest_light_3.getSwVersion()); EXPECT_EQ("5.50.1.19085", test_light_1.getSwVersion()); EXPECT_EQ("5.50.1.19085", test_light_2.getSwVersion()); EXPECT_EQ("5.50.1.19085", test_light_3.getSwVersion()); } TEST_F(HueLightTest, setName) { using namespace ::testing; nlohmann::json expected_request({}); expected_request["name"] = "Baskj189"; nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/1/name"] = expected_request["name"]; EXPECT_CALL( *handler, PUTJson("/api/" + getBridgeUsername() + "/lights/1/name", expected_request, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); EXPECT_CALL( *handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/name", expected_request, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/name"] = expected_request["name"]; EXPECT_CALL( *handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/name", expected_request, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(true, test_light_1.setName(expected_request["name"].get())); EXPECT_EQ(false, test_light_2.setName(expected_request["name"].get())); EXPECT_EQ(true, test_light_3.setName(expected_request["name"].get())); } TEST_F(HueLightTest, getColorType) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(ColorType::NONE, ctest_light_1.getColorType()); EXPECT_EQ(ColorType::GAMUT_A, ctest_light_2.getColorType()); EXPECT_EQ(ColorType::GAMUT_C_TEMPERATURE, ctest_light_3.getColorType()); EXPECT_EQ(ColorType::NONE, test_light_1.getColorType()); EXPECT_EQ(ColorType::GAMUT_A, test_light_2.getColorType()); EXPECT_EQ(ColorType::GAMUT_C_TEMPERATURE, test_light_3.getColorType()); } TEST_F(HueLightTest, hasBrightnessControl) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(true, ctest_light_1.hasBrightnessControl()); EXPECT_EQ(true, ctest_light_2.hasBrightnessControl()); EXPECT_EQ(true, ctest_light_3.hasBrightnessControl()); EXPECT_EQ(true, test_light_1.hasBrightnessControl()); EXPECT_EQ(true, test_light_2.hasBrightnessControl()); EXPECT_EQ(true, test_light_3.hasBrightnessControl()); } TEST_F(HueLightTest, hasTemperatureControl) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, ctest_light_1.hasTemperatureControl()); EXPECT_EQ(false, ctest_light_2.hasTemperatureControl()); EXPECT_EQ(true, ctest_light_3.hasTemperatureControl()); EXPECT_EQ(false, test_light_1.hasTemperatureControl()); EXPECT_EQ(false, test_light_2.hasTemperatureControl()); EXPECT_EQ(true, test_light_3.hasTemperatureControl()); } TEST_F(HueLightTest, hasColorControl) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, ctest_light_1.hasColorControl()); EXPECT_EQ(true, ctest_light_2.hasColorControl()); EXPECT_EQ(true, ctest_light_3.hasColorControl()); EXPECT_EQ(false, test_light_1.hasColorControl()); EXPECT_EQ(true, test_light_2.hasColorControl()); EXPECT_EQ(true, test_light_3.hasColorControl()); } TEST_F(HueLightTest, setBrightness) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/1/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/bri"] = 253; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setBrightness(200)); EXPECT_EQ(true, test_light_2.setBrightness(0, 2)); EXPECT_EQ(true, test_light_3.setBrightness(253, 0)); } TEST_F(HueLightTest, getBrightness) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(254, ctest_light_1.getBrightness()); EXPECT_EQ(0, ctest_light_2.getBrightness()); EXPECT_EQ(254, ctest_light_3.getBrightness()); EXPECT_EQ(254, test_light_1.getBrightness()); EXPECT_EQ(0, test_light_2.getBrightness()); EXPECT_EQ(254, test_light_3.getBrightness()); } TEST_F(HueLightTest, setColorTemperature) { using namespace ::testing; nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/ct"] = 153; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorTemperature(153)); EXPECT_EQ(false, test_light_2.setColorTemperature(400, 2)); EXPECT_EQ(true, test_light_3.setColorTemperature(100, 0)); } TEST_F(HueLightTest, getColorTemperature) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(0, ctest_light_1.getColorTemperature()); EXPECT_EQ(0, ctest_light_2.getColorTemperature()); EXPECT_EQ(366, ctest_light_3.getColorTemperature()); EXPECT_EQ(0, test_light_1.getColorTemperature()); EXPECT_EQ(0, test_light_2.getColorTemperature()); EXPECT_EQ(366, test_light_3.getColorTemperature()); } TEST_F(HueLightTest, setColorHue) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/hue"] = 65500; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorHue(153)); EXPECT_EQ(false, test_light_2.setColorHue(30000, 2)); EXPECT_EQ(true, test_light_3.setColorHue(65500, 0)); } TEST_F(HueLightTest, setColorSaturation) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/sat"] = 250; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorSaturation(0)); EXPECT_EQ(false, test_light_2.setColorSaturation(140, 2)); EXPECT_EQ(true, test_light_3.setColorSaturation(250, 0)); } TEST_F(HueLightTest, setColorHueSaturation) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/hue"] = 65500; prep_ret[3] = nlohmann::json::object(); prep_ret[3]["success"] = nlohmann::json::object(); prep_ret[3]["success"]["/lights/3/state/sat"] = 250; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorHueSaturation({153, 0})); EXPECT_EQ(false, test_light_2.setColorHueSaturation({30000, 140}, 2)); EXPECT_EQ(true, test_light_3.setColorHueSaturation({65500, 250}, 0)); } TEST_F(HueLightTest, getColorHueSaturation) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ((HueSaturation {0, 0}), ctest_light_1.getColorHueSaturation()); EXPECT_EQ((HueSaturation {12345, 123}), ctest_light_2.getColorHueSaturation()); EXPECT_EQ((HueSaturation {12345, 123}), ctest_light_3.getColorHueSaturation()); EXPECT_EQ((HueSaturation {0, 0}), test_light_1.getColorHueSaturation()); EXPECT_EQ((HueSaturation {12345, 123}), test_light_2.getColorHueSaturation()); EXPECT_EQ((HueSaturation {12345, 123}), test_light_3.getColorHueSaturation()); } TEST_F(HueLightTest, setColorXY) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/xy"][0] = 0.4232; prep_ret[2]["success"]["/lights/3/state/xy"][1] = 0.1231; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorXY({{0.01f, 0.f}, 1.f})); EXPECT_EQ(false, test_light_2.setColorXY({{0.123f, 1.f}, 1.f}, 2)); EXPECT_EQ(true, test_light_3.setColorXY({{0.4232f, 0.1231f}, 1.f}, 0)); } TEST_F(HueLightTest, getColorXY) { const Light ctest_light_1 = test_bridge.lights().get(1); const Light ctest_light_2 = test_bridge.lights().get(2); const Light ctest_light_3 = test_bridge.lights().get(3); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ((XYBrightness {{0.f, 0.f}, 0.f}), ctest_light_1.getColorXY()); EXPECT_EQ((XYBrightness {{0.102f, 0.102f}, 0.f}), ctest_light_2.getColorXY()); EXPECT_EQ((XYBrightness {{0.102f, 0.102f}, 1.f}), ctest_light_3.getColorXY()); EXPECT_EQ((XYBrightness {{0.f, 0.f}, 0.f}), test_light_1.getColorXY()); EXPECT_EQ((XYBrightness {{0.102f, 0.102f}, 0.f}), test_light_2.getColorXY()); EXPECT_EQ((XYBrightness {{0.102f, 0.102f}, 1.f}), test_light_3.getColorXY()); } TEST_F(HueLightTest, setColorRGB) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[2] = nlohmann::json::object(); prep_ret[2]["success"] = nlohmann::json::object(); prep_ret[2]["success"]["/lights/3/state/xy"][0] = 0.1596; prep_ret[2]["success"]["/lights/3/state/xy"][1] = 0.1437; prep_ret[1] = nlohmann::json::object(); prep_ret[1]["success"] = nlohmann::json::object(); prep_ret[1]["success"]["/lights/3/state/on"] = true; prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/transitiontime"] = 0; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorRGB({0, 0, 0}, 0)); EXPECT_EQ(false, test_light_2.setColorRGB({32, 64, 128}, 2)); EXPECT_EQ(true, test_light_3.setColorRGB({64, 128, 255}, 0)); } TEST_F(HueLightTest, alert) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/1/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); nlohmann::json prep_ret; prep_ret = nlohmann::json::array(); prep_ret[0] = nlohmann::json::object(); prep_ret[0]["success"] = nlohmann::json::object(); prep_ret[0]["success"]["/lights/3/state/alert"] = "select"; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(prep_ret)); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.alert()); EXPECT_EQ(false, test_light_2.alert()); EXPECT_EQ(true, test_light_3.alert()); } TEST_F(HueLightTest, alertTemperature) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.alertTemperature(400)); EXPECT_EQ(false, test_light_2.alertTemperature(100)); EXPECT_EQ(false, test_light_3.alertTemperature(0)); } TEST_F(HueLightTest, alertHueSaturation) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.alertHueSaturation({0, 255})); EXPECT_EQ(false, test_light_2.alertHueSaturation({3000, 100})); EXPECT_EQ(false, test_light_3.alertHueSaturation({50000, 0})); } TEST_F(HueLightTest, alertXY) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.alertXY({{0.1f, 0.1f}, 1.f})); EXPECT_EQ(false, test_light_2.alertXY({{0.2434f, 0.2344f}, 1.f})); EXPECT_EQ(false, test_light_3.alertXY({{0.1234f, 0.1234f}, 1.f})); } TEST_F(HueLightTest, setColorLoop) { using namespace ::testing; EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/2/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); EXPECT_CALL(*handler, PUTJson("/api/" + getBridgeUsername() + "/lights/3/state", _, getBridgeIp(), 80)) .Times(1) .WillOnce(Return(nlohmann::json::array())); Light test_light_1 = test_bridge.lights().get(1); Light test_light_2 = test_bridge.lights().get(2); Light test_light_3 = test_bridge.lights().get(3); EXPECT_EQ(false, test_light_1.setColorLoop(true)); EXPECT_EQ(false, test_light_2.setColorLoop(false)); EXPECT_EQ(false, test_light_3.setColorLoop(true)); }