package com.kuxhausen.huemore;
import android.support.test.runner.AndroidJUnit4;
import android.util.Pair;
import com.kuxhausen.huemore.net.PlayingMood;
import com.kuxhausen.huemore.state.BulbState;
import com.kuxhausen.huemore.state.Event;
import com.kuxhausen.huemore.state.Group;
import com.kuxhausen.huemore.state.Mood;
import com.kuxhausen.huemore.state.SyntheticGroup;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@RunWith(AndroidJUnit4.class)
public class PlayingMoodTest {
@Test
public void testConstructor() {
try {
new PlayingMood(null, "", new SyntheticGroup(null, null), 1, -1000, null);
fail();
} catch (IllegalArgumentException e) {
}
Mood m = new Mood.Builder().build();
new PlayingMood(m, null, new SyntheticGroup(null, null), 1, -1000, null);
try {
new PlayingMood(m, "", null, 1, -1000, null);
fail();
} catch (IllegalArgumentException e) {
}
String mName = "some mood";
String gName = "some group";
Group g = new SyntheticGroup(new ArrayList<Long>(), gName);
PlayingMood pm = new PlayingMood(m, mName, g, 1, -1000, null);
assertEquals(g, pm.getGroup());
assertEquals(m, pm.getMood());
assertEquals(mName, pm.getMoodName());
assertEquals(gName, pm.getGroupName());
}
/**
* playing a simple on mood
*/
@Test
public void testFunctionality1() {
BulbState bs1 = new BulbState();
bs1.setOn(true);
BulbState bs2 = new BulbState();
bs2.set255Bri(127);
Event e1 = new Event(bs1, 0, 0l);
Event e2 = new Event(bs2, 1, 0l);
Event[] eRay = {e1, e2};
Mood m = new Mood.Builder()
.setEvents(eRay)
.setNumChannels(2)
.build();
Long bulb1 = 123l;
Long bulb2 = 456l;
Long[] bulbs = {bulb1, bulb2};
Group g = new SyntheticGroup(Arrays.asList(bulbs), "");
long startTime = 543l;
long dayStartTime = 12l;
PlayingMood pm = new PlayingMood(m, "", g, startTime, dayStartTime, null);
assertTrue(pm.hasFutureEvents());
assertEquals(startTime, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> toPlay = pm.tick(startTime);
assertEquals(2, toPlay.size());
assertEquals(bs1, toPlay.get(0).second);
assertEquals(1, toPlay.get(0).first.size());
assertEquals(bulb1, toPlay.get(0).first.get(0));
assertEquals(bs2, toPlay.get(1).second);
assertEquals(1, toPlay.get(1).first.size());
assertEquals(bulb2, toPlay.get(1).first.get(0));
assertFalse(pm.hasFutureEvents());
assertEquals(0, pm.tick(startTime + 1).size());
}
/**
* playing a timed, non-looping mood
*/
@Test
public void testFunctionality2() {
BulbState bs1 = new BulbState();
bs1.setOn(true);
BulbState bs2 = new BulbState();
bs2.set255Bri(127);
Event e1 = new Event(bs1, 0, 0l);
Event e2 = new Event(bs2, 1, 100l);
Event[] eRay = {e1, e2};
Mood m = new Mood.Builder()
.setEvents(eRay)
.setNumChannels(2)
.build();
Long bulb1 = 123l;
Long bulb2 = 456l;
Long[] bulbs = {bulb1, bulb2};
Group g = new SyntheticGroup(Arrays.asList(bulbs), "");
long startTime = 543l;
long dayStartTime = 12l;
PlayingMood pm = new PlayingMood(m, "", g, startTime, dayStartTime, null);
assertTrue(pm.hasFutureEvents());
assertEquals(startTime, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick1 = pm.tick(startTime);
assertEquals(1, tick1.size());
assertEquals(bs1, tick1.get(0).second);
assertEquals(1, tick1.get(0).first.size());
assertEquals(bulb1, tick1.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 100, pm.getNextEventInCurrentMillis());
assertEquals(0, pm.tick(startTime + 50).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 100, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick3 = pm.tick(startTime + 100);
assertEquals(1, tick3.size());
assertEquals(bs2, tick3.get(0).second);
assertEquals(1, tick3.get(0).first.size());
assertEquals(bulb2, tick3.get(0).first.get(0));
assertFalse(pm.hasFutureEvents());
assertEquals(0, pm.tick(startTime + 150).size());
}
/**
* playing a timed looping mood
*/
@Test
public void testFunctionality3() {
BulbState bs1 = new BulbState();
bs1.setOn(true);
BulbState bs2 = new BulbState();
bs2.set255Bri(127);
Event e1 = new Event(bs1, 0, 0l);
Event e2 = new Event(bs2, 1, 100l);
Event[] eRay = {e1, e2};
Mood m = new Mood.Builder()
.setEvents(eRay)
.setNumChannels(2)
.setTimingPolicy(Mood.TimingPolicy.LOOPING)
.setLoopMilliTime(200)
.build();
Long bulb1 = 123l;
Long bulb2 = 456l;
Long[] bulbs = {bulb1, bulb2};
Group g = new SyntheticGroup(Arrays.asList(bulbs), "");
long startTime = 543l;
long dayStartTime = 12l;
PlayingMood pm = new PlayingMood(m, "", g, startTime, dayStartTime, null);
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 0, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick1 = pm.tick(startTime + 0);
assertEquals(1, tick1.size());
assertEquals(bs1, tick1.get(0).second);
assertEquals(1, tick1.get(0).first.size());
assertEquals(bulb1, tick1.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 100, pm.getNextEventInCurrentMillis());
assertEquals(0, pm.tick(startTime + 1).size());
assertEquals(0, pm.tick(startTime + 99).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 100, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick3 = pm.tick(startTime + 100);
assertEquals(1, tick3.size());
assertEquals(bs2, tick3.get(0).second);
assertEquals(1, tick3.get(0).first.size());
assertEquals(bulb2, tick3.get(0).first.get(0));
assertEquals(0, pm.tick(startTime + 101).size());
assertEquals(0, pm.tick(startTime + 199).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 200, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick5 = pm.tick(startTime + 200);
assertEquals(1, tick5.size());
assertEquals(bs1, tick5.get(0).second);
assertEquals(1, tick5.get(0).first.size());
assertEquals(bulb1, tick5.get(0).first.get(0));
assertEquals(0, pm.tick(startTime + 201).size());
assertEquals(0, pm.tick(startTime + 299).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 300, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick7 = pm.tick(startTime + 300);
assertEquals(1, tick7.size());
assertEquals(bs2, tick7.get(0).second);
assertEquals(1, tick7.get(0).first.size());
assertEquals(bulb2, tick7.get(0).first.get(0));
assertEquals(0, pm.tick(startTime + 301).size());
assertEquals(0, pm.tick(startTime + 399).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 400, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick9 = pm.tick(startTime + 400);
assertEquals(1, tick9.size());
assertEquals(bs1, tick9.get(0).second);
assertEquals(1, tick9.get(0).first.size());
assertEquals(bulb1, tick9.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
}
/**
* playing a timed looping mood with saves & resumes
*/
@Test
public void testFunctionality4() {
BulbState bs1 = new BulbState();
bs1.setOn(true);
BulbState bs2 = new BulbState();
bs2.set255Bri(127);
Event e1 = new Event(bs1, 0, 0);
Event e2 = new Event(bs2, 1, 100);
Event[] eRay = {e1, e2};
Mood m = new Mood.Builder()
.setEvents(eRay)
.setNumChannels(2)
.setTimingPolicy(Mood.TimingPolicy.LOOPING)
.setLoopMilliTime(200)
.build();
Long bulb1 = 123l;
Long bulb2 = 456l;
Long[] bulbs = {bulb1, bulb2};
Group g = new SyntheticGroup(Arrays.asList(bulbs), "");
long startTime = 543l;
long dayStartTime = 12l;
PlayingMood pm = new PlayingMood(m, "", g, startTime, dayStartTime, null);
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 0, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick1 = pm.tick(startTime + 0);
assertEquals(1, tick1.size());
assertEquals(bs1, tick1.get(0).second);
assertEquals(1, tick1.get(0).first.size());
assertEquals(bulb1, tick1.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 100, pm.getNextEventInCurrentMillis());
assertEquals(0, pm.tick(startTime + 1).size());
long savedProgress = pm.getInternalProgress();
long savedStartTime = pm.getStartTime();
pm = new PlayingMood(m, "", g, savedStartTime, dayStartTime, savedProgress);
assertEquals(0, pm.tick(startTime + 99).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 100, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick3 = pm.tick(startTime + 100);
assertEquals(1, tick3.size());
assertEquals(bs2, tick3.get(0).second);
assertEquals(1, tick3.get(0).first.size());
assertEquals(bulb2, tick3.get(0).first.get(0));
assertEquals(0, pm.tick(startTime + 101).size());
savedProgress = pm.getInternalProgress();
savedStartTime = pm.getStartTime();
pm = new PlayingMood(m, "", g, savedStartTime, dayStartTime, savedProgress);
assertEquals(0, pm.tick(startTime + 199).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 200, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick5 = pm.tick(startTime + 200);
assertEquals(1, tick5.size());
assertEquals(bs1, tick5.get(0).second);
assertEquals(1, tick5.get(0).first.size());
assertEquals(bulb1, tick5.get(0).first.get(0));
assertEquals(0, pm.tick(startTime + 201).size());
savedProgress = pm.getInternalProgress();
savedStartTime = pm.getStartTime();
pm = new PlayingMood(m, "", g, savedStartTime, dayStartTime, savedProgress);
assertEquals(0, pm.tick(startTime + 299).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 300, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick7 = pm.tick(startTime + 300);
assertEquals(1, tick7.size());
assertEquals(bs2, tick7.get(0).second);
assertEquals(1, tick7.get(0).first.size());
assertEquals(bulb2, tick7.get(0).first.get(0));
assertEquals(0, pm.tick(startTime + 301).size());
savedProgress = pm.getInternalProgress();
savedStartTime = pm.getStartTime();
pm = new PlayingMood(m, "", g, savedStartTime, dayStartTime, savedProgress);
assertEquals(0, pm.tick(startTime + 399).size());
assertTrue(pm.hasFutureEvents());
assertEquals(startTime + 400, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick9 = pm.tick(startTime + 400);
assertEquals(1, tick9.size());
assertEquals(bs1, tick9.get(0).second);
assertEquals(1, tick9.get(0).first.size());
assertEquals(bulb1, tick9.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
}
/**
* playing a daily mood with some save/restarts
*/
@Test
public void testFunctionality5() {
long startTime = 543l;
long dayStartTime = 12l;
long millisPerHour = 3600000;
BulbState bs1 = new BulbState();
bs1.setOn(true);
BulbState bs2 = new BulbState();
bs2.set255Bri(127);
Event e1 = new Event(bs1, 0, (5 * millisPerHour));
Event e2 = new Event(bs2, 1, (13 * millisPerHour));
Event[] eRay = {e1, e2};
Mood m = new Mood.Builder()
.setEvents(eRay)
.setNumChannels(2)
.setTimingPolicy(Mood.TimingPolicy.DAILY)
.build();
Long bulb1 = 123l;
Long bulb2 = 456l;
Long[] bulbs = {bulb1, bulb2};
Group g = new SyntheticGroup(Arrays.asList(bulbs), "");
PlayingMood pm = new PlayingMood(m, "", g, startTime, dayStartTime, null);
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 5 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick1 = pm.tick(dayStartTime + 1 * millisPerHour);
assertEquals(2, tick1.size());
assertEquals(bs1, tick1.get(0).second);
assertEquals(1, tick1.get(0).first.size());
assertEquals(bulb1, tick1.get(0).first.get(0));
assertEquals(bs2, tick1.get(1).second);
assertEquals(1, tick1.get(1).first.size());
assertEquals(bulb2, tick1.get(1).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 5 * millisPerHour, pm.getNextEventInCurrentMillis());
assertEquals(0, pm.tick(dayStartTime + 2 * millisPerHour).size());
assertEquals(0, pm.tick(dayStartTime + 3 * millisPerHour).size());
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 5 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick3 = pm.tick(dayStartTime + 5 * millisPerHour);
assertEquals(1, tick3.size());
assertEquals(bs1, tick3.get(0).second);
assertEquals(1, tick3.get(0).first.size());
assertEquals(bulb1, tick3.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 13 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick5 = pm.tick(dayStartTime + 13 * millisPerHour);
assertEquals(1, tick5.size());
assertEquals(bs2, tick5.get(0).second);
assertEquals(1, tick5.get(0).first.size());
assertEquals(bulb2, tick5.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 29 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick7 = pm.tick(dayStartTime + 29 * millisPerHour);
assertEquals(1, tick7.size());
assertEquals(bs1, tick7.get(0).second);
assertEquals(1, tick7.get(0).first.size());
assertEquals(bulb1, tick7.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 37 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick9 = pm.tick(dayStartTime + 37 * millisPerHour);
assertEquals(1, tick9.size());
assertEquals(bs2, tick9.get(0).second);
assertEquals(1, tick9.get(0).first.size());
assertEquals(bulb2, tick9.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 53 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick11 = pm.tick(dayStartTime + 53 * millisPerHour);
assertEquals(1, tick11.size());
assertEquals(bs1, tick11.get(0).second);
assertEquals(1, tick11.get(0).first.size());
assertEquals(bulb1, tick11.get(0).first.get(0));
long savedProgress = pm.getInternalProgress();
long savedStartTime = pm.getStartTime();
pm =
new PlayingMood(m, "", g, savedStartTime, dayStartTime + 48 * millisPerHour, savedProgress);
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 61 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick13 = pm.tick(dayStartTime + 61 * millisPerHour);
assertEquals(1, tick13.size());
assertEquals(bs2, tick13.get(0).second);
assertEquals(1, tick13.get(0).first.size());
assertEquals(bulb2, tick13.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 77 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick15 = pm.tick(dayStartTime + 77 * millisPerHour);
assertEquals(1, tick15.size());
assertEquals(bs1, tick15.get(0).second);
assertEquals(1, tick15.get(0).first.size());
assertEquals(bulb1, tick15.get(0).first.get(0));
}
/**
* playing a daily mood with some save/restarts when the device has recently booted
*/
@Test
public void testFunctionality6() {
long startTime = 543l;
long dayStartTime = -4000;
long millisPerHour = 3600000;
BulbState bs1 = new BulbState();
bs1.setOn(true);
BulbState bs2 = new BulbState();
bs2.set255Bri(127);
Event e1 = new Event(bs1, 0, (5 * millisPerHour));
Event e2 = new Event(bs2, 1, (13 * millisPerHour));
Event[] eRay = {e1, e2};
Mood m = new Mood.Builder()
.setEvents(eRay)
.setNumChannels(2)
.setTimingPolicy(Mood.TimingPolicy.DAILY)
.build();
Long bulb1 = 123l;
Long bulb2 = 456l;
Long[] bulbs = {bulb1, bulb2};
Group g = new SyntheticGroup(Arrays.asList(bulbs), "");
PlayingMood pm = new PlayingMood(m, "", g, startTime, dayStartTime, null);
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 5 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick1 = pm.tick(dayStartTime + 1 * millisPerHour);
assertEquals(2, tick1.size());
assertEquals(bs1, tick1.get(0).second);
assertEquals(1, tick1.get(0).first.size());
assertEquals(bulb1, tick1.get(0).first.get(0));
assertEquals(bs2, tick1.get(1).second);
assertEquals(1, tick1.get(1).first.size());
assertEquals(bulb2, tick1.get(1).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 5 * millisPerHour, pm.getNextEventInCurrentMillis());
assertEquals(0, pm.tick(dayStartTime + 2 * millisPerHour).size());
assertEquals(0, pm.tick(dayStartTime + 3 * millisPerHour).size());
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 5 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick3 = pm.tick(dayStartTime + 5 * millisPerHour);
assertEquals(1, tick3.size());
assertEquals(bs1, tick3.get(0).second);
assertEquals(1, tick3.get(0).first.size());
assertEquals(bulb1, tick3.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 13 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick5 = pm.tick(dayStartTime + 13 * millisPerHour);
assertEquals(1, tick5.size());
assertEquals(bs2, tick5.get(0).second);
assertEquals(1, tick5.get(0).first.size());
assertEquals(bulb2, tick5.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 29 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick7 = pm.tick(dayStartTime + 29 * millisPerHour);
assertEquals(1, tick7.size());
assertEquals(bs1, tick7.get(0).second);
assertEquals(1, tick7.get(0).first.size());
assertEquals(bulb1, tick7.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 37 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick9 = pm.tick(dayStartTime + 37 * millisPerHour);
assertEquals(1, tick9.size());
assertEquals(bs2, tick9.get(0).second);
assertEquals(1, tick9.get(0).first.size());
assertEquals(bulb2, tick9.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 53 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick11 = pm.tick(dayStartTime + 53 * millisPerHour);
assertEquals(1, tick11.size());
assertEquals(bs1, tick11.get(0).second);
assertEquals(1, tick11.get(0).first.size());
assertEquals(bulb1, tick11.get(0).first.get(0));
long savedProgress = pm.getInternalProgress();
long savedStartTime = pm.getStartTime();
pm =
new PlayingMood(m, "", g, savedStartTime, dayStartTime + 48 * millisPerHour, savedProgress);
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 61 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick13 = pm.tick(dayStartTime + 61 * millisPerHour);
assertEquals(1, tick13.size());
assertEquals(bs2, tick13.get(0).second);
assertEquals(1, tick13.get(0).first.size());
assertEquals(bulb2, tick13.get(0).first.get(0));
assertTrue(pm.hasFutureEvents());
assertEquals(dayStartTime + 77 * millisPerHour, pm.getNextEventInCurrentMillis());
List<Pair<List<Long>, BulbState>> tick15 = pm.tick(dayStartTime + 77 * millisPerHour);
assertEquals(1, tick15.size());
assertEquals(bs1, tick15.get(0).second);
assertEquals(1, tick15.get(0).first.size());
assertEquals(bulb1, tick15.get(0).first.get(0));
}
}