diff --git a/src/lib/DebouncedBoolean.java b/src/lib/DebouncedBoolean.java new file mode 100644 index 0000000..c87ed94 --- /dev/null +++ b/src/lib/DebouncedBoolean.java @@ -0,0 +1,54 @@ +package lib; + +import java.util.LinkedList; + +public class DebouncedBoolean implements DebouncedBooleanInterface { + private LinkedList queue; + private final int windowSize; + private int count; + + /** + * Creates and initializes the queue. + * @param size Sets the size of values being looked at + * @param initial Initializes the queue to a boolean type. + */ + public DebouncedBoolean(int size, boolean initial) { + if (size <= 0) { + throw new IllegalArgumentException(size + " is not a valid window size"); + } + if (initial) { + count = size; + } else { + count = -size; + } + windowSize = size; + queue = new LinkedList(); + + } + + /* + * @see lib.DebouncedBooleanInterface#add(boolean) + */ + @Override + public void add(boolean value) { + if (queue.size() == windowSize) { + queue.removeFirst(); + queue.addLast(value); + } else { + queue.addLast(value); + } + if (value) { + count++; + } else { + count--; + } + } + + /* + * @see lib.DebouncedBooleanInterface#get() + */ + @Override + public boolean get() { + return count >= 0; + } +} diff --git a/src/lib/DebouncedBooleanInterface.java b/src/lib/DebouncedBooleanInterface.java new file mode 100644 index 0000000..3b03835 --- /dev/null +++ b/src/lib/DebouncedBooleanInterface.java @@ -0,0 +1,20 @@ +package lib; + +/** + * A Debounced Boolean is used to keep track of a windowed size amount of booleans being added the + * window. + */ +public interface DebouncedBooleanInterface { + /** + * Adds the new boolean to the average and removes the least recent boolean if there would be more + * than the windowSize value. + * + * @param value Boolean being passed into the queue. + */ + void add(boolean value); + + /** + * @return Boolean that determines if the queue is true or false. + */ + boolean get(); +} diff --git a/src/lib/MovingAverage.java b/src/lib/MovingAverage.java index 26358e7..3b4f070 100644 --- a/src/lib/MovingAverage.java +++ b/src/lib/MovingAverage.java @@ -33,7 +33,7 @@ public void update(double val) { queue.addLast(val); } - /* + /* * @see lib.MovingAverageInterface#getAverage() */ @Override diff --git a/test/com/nutrons/nu17/BooleanTest.java b/test/com/nutrons/nu17/BooleanTest.java new file mode 100644 index 0000000..f756d28 --- /dev/null +++ b/test/com/nutrons/nu17/BooleanTest.java @@ -0,0 +1,74 @@ +package com.nutrons.nu17; + +import static org.junit.Assert.*; +import com.nutrons.nu17.*; + +import org.junit.Test; + +import lib.DebouncedBoolean; +import lib.DebouncedBooleanInterface; + +public class BooleanTest { + @Test + public void allFalse() { + DebouncedBooleanInterface x = new DebouncedBoolean(3, true); + x.add(false); + assertEquals(true, x.get()); + x.add(false); + assertEquals(true, x.get()); + x.add(false); + assertEquals(true, x.get()); + x.add(false); + assertEquals(false, x.get()); + } + + @Test + public void allTrue() { + DebouncedBooleanInterface x = new DebouncedBoolean(3, false); + x.add(true); + assertEquals(false, x.get()); + x.add(true); + assertEquals(false, x.get()); + x.add(true); + assertEquals(true, x.get()); + x.add(true); + assertEquals(true, x.get()); + } + + @Test + public void changingValues() { + DebouncedBooleanInterface x = new DebouncedBoolean(3, true); + x.add(false); + assertEquals(true, x.get()); + x.add(false); + assertEquals(true, x.get()); + x.add(false); + assertEquals(true, x.get()); + x.add(false); + assertEquals(false, x.get()); + x.add(false); + assertEquals(false, x.get()); + x.add(false); + assertEquals(false, x.get()); + x.add(false); + assertEquals(false, x.get()); + x.add(true); + assertEquals(false, x.get()); + x.add(true); + assertEquals(false, x.get()); + x.add(true); + assertEquals(false, x.get()); + x.add(true); + assertEquals(true, x.get()); + } + + @Test(expected = IllegalArgumentException.class) + public void negativeExceptionTest() { + DebouncedBooleanInterface x = new DebouncedBoolean(-1, true); + } + + @Test(expected = IllegalArgumentException.class) + public void zeroExceptionTest() { + DebouncedBooleanInterface x = new DebouncedBoolean(0, true); + } +}