package com.kuxhausen.huemore;
import android.support.test.runner.AndroidJUnit4;
import com.kuxhausen.huemore.net.BrightnessManager;
import com.kuxhausen.huemore.net.BrightnessManager.BrightnessPolicy;
import com.kuxhausen.huemore.net.MockNetBulb;
import com.kuxhausen.huemore.net.NetworkBulb;
import com.kuxhausen.huemore.state.BulbState;
import com.kuxhausen.huemore.state.BulbState.Alert;
import com.kuxhausen.huemore.state.BulbState.Effect;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@RunWith(AndroidJUnit4.class)
public class BrightnessManagerTest {
@Test
public void testConstructor() {
try {
BrightnessManager manager = new BrightnessManager(null);
fail();
} catch (IllegalArgumentException e) {
}
}
@Test
public void testPolicyToggle1() {
BrightnessManager manager = new BrightnessManager(new ArrayList<NetworkBulb>());
assertEquals(manager.getPolicy(), BrightnessPolicy.DIRECT_BRI);
manager.setPolicy(BrightnessPolicy.VOLUME_BRI);
assertEquals(manager.getPolicy(), BrightnessPolicy.VOLUME_BRI);
manager.setPolicy(BrightnessPolicy.DIRECT_BRI);
manager.setPolicy(BrightnessPolicy.DIRECT_BRI);
assertEquals(manager.getPolicy(), BrightnessPolicy.DIRECT_BRI);
}
//test get/set brightness across the policies
@Test
public void testSetBrightness1() {
ArrayList<NetworkBulb> list = new ArrayList<NetworkBulb>();
MockNetBulb aBulb = new MockNetBulb();
MockNetBulb bBulb = new MockNetBulb();
list.add(aBulb);
list.add(bBulb);
//remember to keep raw manipulation scaled by BS.bri range (0-255)
aBulb.mKnown.setPercentBri(20);
bBulb.mKnown.setPercentBri(40);
BrightnessManager manager = new BrightnessManager(list);
//should return the initial average of known, scaled from 1-100
assertEquals(manager.getBrightness(), 30);
manager.setBrightness(60);
assertEquals(manager.getBrightness(), 60);
manager.setPolicy(BrightnessPolicy.VOLUME_BRI);
assertEquals(manager.getBrightness(), 60);
manager.setBrightness(40);
assertEquals(manager.getBrightness(), 40);
manager.setPolicy(BrightnessPolicy.DIRECT_BRI);
assertEquals(manager.getBrightness(), 40);
}
@Test
public void testSetState1() {
try {
BrightnessManager manager = new BrightnessManager(new ArrayList<NetworkBulb>());
manager.setState(new MockNetBulb(), new BulbState());
fail();
} catch (IllegalArgumentException e) {
}
}
@Test
public void testSetState2() {
ArrayList<NetworkBulb> list = new ArrayList<NetworkBulb>();
MockNetBulb aBulb = new MockNetBulb();
MockNetBulb bBulb = new MockNetBulb();
list.add(aBulb);
list.add(bBulb);
BrightnessManager manager = new BrightnessManager(list);
BulbState emptyState = new BulbState();
assertEquals(emptyState, manager.getState(aBulb, NetworkBulb.GetStateConfidence.DESIRED));
assertEquals(emptyState, manager.getState(aBulb, NetworkBulb.GetStateConfidence.KNOWN));
assertFalse(emptyState.equals(manager.getState(aBulb, NetworkBulb.GetStateConfidence.GUESS)));
BulbState state1 = new BulbState();
state1.setPercentBri(37);
state1.setMiredCT(300);
state1.setTransitionTime(60);
aBulb.mKnown = state1;
assertEquals(emptyState, manager.getState(aBulb, NetworkBulb.GetStateConfidence.DESIRED));
assertEquals(state1, manager.getState(aBulb, NetworkBulb.GetStateConfidence.KNOWN));
BulbState state2 = new BulbState();
state2.setPercentBri(97);
state2.setEffect(Effect.COLORLOOP);
state2.setAlert(Alert.FLASH_30SEC);
state2.setMiredCT(300);
manager.setState(bBulb, state2);
assertEquals(state2, manager.getState(bBulb, NetworkBulb.GetStateConfidence.DESIRED));
assertEquals(state2, manager.getState(bBulb, NetworkBulb.GetStateConfidence.KNOWN));
manager.setState(aBulb, state2);
assertEquals(state2, manager.getState(aBulb, NetworkBulb.GetStateConfidence.DESIRED));
BulbState combined = state1.clone();
combined.merge(state2);
assertEquals(combined, manager.getState(aBulb, NetworkBulb.GetStateConfidence.KNOWN));
}
//This simulates functionality required for a sunrise alarm clock
@Test
public void testFunctionality1() {
ArrayList<NetworkBulb> list = new ArrayList<NetworkBulb>();
MockNetBulb aBulb = new MockNetBulb();
MockNetBulb bBulb = new MockNetBulb();
MockNetBulb cBulb = new MockNetBulb();
list.add(aBulb);
list.add(bBulb);
list.add(cBulb);
BrightnessManager manager = new BrightnessManager(list);
{ //aBulb responds here, now has has known value
aBulb.mKnown.setOn(false);
aBulb.mKnown.setPercentBri(20);
aBulb.mKnown.setKelvinCT(3000);
}
manager.setPolicy(BrightnessPolicy.VOLUME_BRI);
manager.setVolumeWithoutUpdate(75);
assertEquals(75, manager.getBrightness());
{ //bBulb responds here, now has has known value
bBulb.mKnown.setOn(false);
bBulb.mKnown.setPercentBri(20);
bBulb.mKnown.setKelvinCT(3000);
}
BulbState dark = new BulbState();
dark.setOn(true);
dark.setPercentBri(0);
dark.setKelvinCT(2000);
for (NetworkBulb bulb : list) {
manager.setState(bulb, dark);
assertEquals(dark, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
}
BulbState medium = new BulbState();
medium.setOn(true);
medium.set255Bri(64);
medium.setKelvinCT(3500);
for (NetworkBulb bulb : list) {
manager.setState(bulb, medium);
assertEquals(medium, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
assertEquals((Integer) 48, ((MockNetBulb) bulb).mTarget.get255Bri());
}
BulbState light = new BulbState();
light.setOn(true);
light.setPercentBri(100);
light.setKelvinCT(4000);
for (NetworkBulb bulb : list) {
manager.setState(bulb, light);
assertEquals(light, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
assertEquals((Integer) 75, ((MockNetBulb) bulb).mTarget.getPercentBri());
}
assertEquals(75, manager.getBrightness());
//now mood ends and check that brightness correct after switching brightness modes
manager.setPolicy(BrightnessPolicy.DIRECT_BRI);
assertEquals(75, manager.getBrightness());
for (NetworkBulb bulb : list) {
assertEquals((Integer) 75,
manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN).getPercentBri());
}
}
//This simulates functionality required to manually trigger a sunset mood
@Test
public void testFunctionality2() {
ArrayList<NetworkBulb> list = new ArrayList<NetworkBulb>();
MockNetBulb aBulb = new MockNetBulb();
MockNetBulb bBulb = new MockNetBulb();
MockNetBulb cBulb = new MockNetBulb();
list.add(aBulb);
list.add(bBulb);
list.add(cBulb);
BrightnessManager manager = new BrightnessManager(list);
{ //aBulb responds here, now has has known value
aBulb.mKnown.setOn(false);
aBulb.mKnown.setPercentBri(80);
aBulb.mKnown.setKelvinCT(3000);
}
manager.setPolicy(BrightnessPolicy.VOLUME_BRI);
assertEquals(80, manager.getBrightness());
{ //bBulb responds here, now has has known value
bBulb.mKnown.setOn(false);
bBulb.mKnown.setPercentBri(90);
bBulb.mKnown.setKelvinCT(3000);
}
assertEquals(85, manager.getBrightness());
BulbState light = new BulbState();
light.setOn(true);
light.setKelvinCT(4000);
BulbState lightWithBri = light.clone();
lightWithBri.set255Bri(255);
for (NetworkBulb bulb : list) {
manager.setState(bulb, light);
assertEquals(lightWithBri, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
assertEquals((Integer) 85, ((MockNetBulb) bulb).mTarget.getPercentBri());
}
assertEquals(85, manager.getBrightness());
BulbState medium = new BulbState();
medium.setOn(true);
medium.set255Bri(200);
medium.setKelvinCT(3500);
for (NetworkBulb bulb : list) {
manager.setState(bulb, medium);
assertEquals(medium, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
assertEquals((Integer) 170, ((MockNetBulb) bulb).mTarget.get255Bri());
}
assertEquals(85, manager.getBrightness());
BulbState dark = new BulbState();
dark.setOn(true);
dark.setPercentBri(0);
dark.setKelvinCT(2000);
for (NetworkBulb bulb : list) {
manager.setState(bulb, dark);
assertEquals(dark, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
assertEquals((Integer) 1, ((MockNetBulb) bulb).mTarget.get255Bri());
}
assertEquals(85, manager.getBrightness());
BulbState off = new BulbState();
off.setOn(false);
BulbState offWithColorBri = off.clone();
offWithColorBri.setPercentBri(0);
offWithColorBri.setKelvinCT(2000);
for (NetworkBulb bulb : list) {
manager.setState(bulb, off);
assertEquals(offWithColorBri, manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN));
assertEquals((Integer) 1, ((MockNetBulb) bulb).mTarget.get255Bri());
}
assertEquals(85, manager.getBrightness());
//now mood ends and check that brightness correct after switching brightness modes
manager.setPolicy(BrightnessPolicy.DIRECT_BRI);
assertEquals(1, manager.getBrightness());
for (NetworkBulb bulb : list) {
assertEquals((Integer) 1,
manager.getState(bulb, NetworkBulb.GetStateConfidence.KNOWN).getPercentBri());
}
}
}