summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2018-10-14 14:07:00 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2018-10-14 14:07:00 -0400
commitd1d01769e7c55f7f62dc01cadf420d5f63424584 (patch)
tree5415f41c405622441840d5dd81b91ea8d7e7de31
parenta78d2f10f8142af6a4e557588c06546e2231eb3f (diff)
Testing
-rw-r--r--base/src/main/java/bjc/utils/data/CircularIterator.java19
-rw-r--r--base/src/main/java/bjc/utils/funcdata/FunctionalList.java15
-rw-r--r--base/src/main/java/bjc/utils/funcutils/FileUtils.java20
-rw-r--r--base/src/main/java/bjc/utils/funcutils/FuncUtils.java43
-rw-r--r--base/src/main/java/bjc/utils/funcutils/TestUtils.java44
-rw-r--r--base/src/test/java/bjc/utils/data/BooleanToggleTest.java36
-rw-r--r--base/src/test/java/bjc/utils/data/CircularIteratorTest.java50
7 files changed, 197 insertions, 30 deletions
diff --git a/base/src/main/java/bjc/utils/data/CircularIterator.java b/base/src/main/java/bjc/utils/data/CircularIterator.java
index 4558b63..9af4d87 100644
--- a/base/src/main/java/bjc/utils/data/CircularIterator.java
+++ b/base/src/main/java/bjc/utils/data/CircularIterator.java
@@ -8,7 +8,7 @@ import java.util.Iterator;
* @author EVE
*
* @param <E>
- * The type of the iterable.
+ * The type of the iterable.
*/
public class CircularIterator<E> implements Iterator<E> {
/* The iterable, and our current iterator into it. */
@@ -28,11 +28,11 @@ public class CircularIterator<E> implements Iterator<E> {
* Create a new circular iterator.
*
* @param src
- * The iterable to iterate from.
+ * The iterable to iterate from.
*
* @param circ
- * Should we actually do circular iteration, or just repeat the
- * terminal element?
+ * Should we actually do circular iteration, or just
+ * repeat the terminal element?
*/
public CircularIterator(final Iterable<E> src, final boolean circ) {
source = src;
@@ -45,7 +45,7 @@ public class CircularIterator<E> implements Iterator<E> {
* Create a new circular iterator that does actual circular iteration.
*
* @param src
- * The iterable to iterate from.
+ * The iterable to iterate from.
*/
public CircularIterator(final Iterable<E> src) {
this(src, true);
@@ -59,11 +59,12 @@ public class CircularIterator<E> implements Iterator<E> {
@Override
public E next() {
- if(!curr.hasNext()) {
- if(doCircle) {
- curr = source.iterator();
- } else
+ if (!curr.hasNext()) {
+ if (!doCircle) {
return curElm;
+ }
+
+ curr = source.iterator();
}
curElm = curr.next();
diff --git a/base/src/main/java/bjc/utils/funcdata/FunctionalList.java b/base/src/main/java/bjc/utils/funcdata/FunctionalList.java
index 6953bd0..b988588 100644
--- a/base/src/main/java/bjc/utils/funcdata/FunctionalList.java
+++ b/base/src/main/java/bjc/utils/funcdata/FunctionalList.java
@@ -54,7 +54,20 @@ public class FunctionalList<E> implements Cloneable, IList<E> {
wrapped.add(item);
}
}
-
+
+ /**
+ * Create a new functional list containing the specified items.
+ *
+ * Takes O(n) time, where n is the number of items specified
+ *
+ * @param items
+ * The items to put into this functional list.
+ * @return The returned list.
+ */
+ @SafeVarargs
+ public static <T> IList<T> listOf(final T... items) {
+ return new FunctionalList<>(items);
+ }
/**
* Create a new functional list with the specified size.
*
diff --git a/base/src/main/java/bjc/utils/funcutils/FileUtils.java b/base/src/main/java/bjc/utils/funcutils/FileUtils.java
index 0fd3db0..04ac6b0 100644
--- a/base/src/main/java/bjc/utils/funcutils/FileUtils.java
+++ b/base/src/main/java/bjc/utils/funcutils/FileUtils.java
@@ -13,26 +13,28 @@ import java.util.function.BiPredicate;
*/
public class FileUtils {
/*
- * @NOTE If it becomes necessary, write another overload for this with
- * all the buttons and knobs from walkFileTree.
+ * @NOTE
+ *
+ * If it becomes necessary, write another overload for this with all the
+ * buttons and knobs from walkFileTree.
*/
/**
* Traverse a directory recursively. This is a depth-first traversal.
*
* @param root
- * The directory to start the traversal at.
+ * The directory to start the traversal at.
*
* @param predicate
- * The predicate to determine whether or not to traverse a
- * directory.
+ * The predicate to determine whether or not to traverse
+ * a directory.
*
* @param action
- * The action to invoke upon each file in the directory.
- * Returning true means to continue the traversal, returning
- * false stops it.
+ * The action to invoke upon each file in the directory.
+ * Returning true means to continue the traversal,
+ * returning false stops it.
*
* @throws IOException
- * If the walk throws an exception.
+ * If the walk throws an exception.
*
*/
public static void traverseDirectory(final Path root, final BiPredicate<Path, BasicFileAttributes> predicate,
diff --git a/base/src/main/java/bjc/utils/funcutils/FuncUtils.java b/base/src/main/java/bjc/utils/funcutils/FuncUtils.java
index 2e55a3d..ff9fefb 100644
--- a/base/src/main/java/bjc/utils/funcutils/FuncUtils.java
+++ b/base/src/main/java/bjc/utils/funcutils/FuncUtils.java
@@ -1,6 +1,7 @@
package bjc.utils.funcutils;
import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.UnaryOperator;
@@ -16,16 +17,16 @@ public class FuncUtils {
* function.
*
* @param <A>
- * The initial type of the function.
+ * The initial type of the function.
*
* @param <B>
- * The intermediate type of the function.
+ * The intermediate type of the function.
*
* @param <C>
- * The terminal type of the function.
+ * The terminal type of the function.
*
* @param func
- * The function to transform.
+ * The function to transform.
*
* @return The function transformed into a unary function returning a
* function.
@@ -40,13 +41,13 @@ public class FuncUtils {
* Do the specified action the specified number of times.
*
* @param nTimes
- * The number of times to do the action.
+ * The number of times to do the action.
*
* @param cons
- * The action to perform.
+ * The action to perform.
*/
public static void doTimes(final int nTimes, final Consumer<Integer> cons) {
- for(int i = 0; i < nTimes; i++) {
+ for (int i = 0; i < nTimes; i++) {
cons.accept(i);
}
}
@@ -55,15 +56,35 @@ public class FuncUtils {
* Return an operator that executes until it converges.
*
* @param op
- * The operator to execute.
+ * The operator to execute.
*
* @param maxTries
- * The maximum amount of times to apply the function in an
- * attempt to cause it to converge.
+ * The maximum amount of times to apply the function in
+ * an attempt to cause it to converge.
*
* @return The requested operator.
*/
public static <T> UnaryOperator<T> converge(final UnaryOperator<T> op, final int maxTries) {
+ return converge(op, (nw, old) -> nw.equals(old), maxTries);
+ }
+
+ /**
+ * Return an operator that executes until it converges.
+ *
+ * @param op
+ * The operator to execute.
+ * @param converged
+ * The predicate to execute to check if the function has
+ * converged.
+ *
+ * @param maxTries
+ * The maximum amount of times to apply the function in
+ * an attempt to cause it to converge.
+ *
+ * @return The requested operator.
+ */
+ public static <T> UnaryOperator<T> converge(final UnaryOperator<T> op, final BiPredicate<T, T> converged,
+ final int maxTries) {
return (val) -> {
T newVal = op.apply(val);
T oldVal;
@@ -75,7 +96,7 @@ public class FuncUtils {
newVal = op.apply(newVal);
tries += 1;
- } while(!newVal.equals(oldVal) && tries < maxTries);
+ } while (!converged.test(newVal, oldVal) && tries < maxTries);
return newVal;
};
diff --git a/base/src/main/java/bjc/utils/funcutils/TestUtils.java b/base/src/main/java/bjc/utils/funcutils/TestUtils.java
new file mode 100644
index 0000000..df44e7a
--- /dev/null
+++ b/base/src/main/java/bjc/utils/funcutils/TestUtils.java
@@ -0,0 +1,44 @@
+package bjc.utils.funcutils;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Utilities for testing.
+ *
+ * @author bjculkin
+ *
+ */
+public class TestUtils {
+ /**
+ * Assert an iterator provides a particular sequence of values.
+ *
+ * @param src
+ * The iterator to pull values from.
+ * @param vals
+ * The values to expect from the iterator.
+ */
+ public static <T> void assertIteratorEquals(Iterator<T> src, T... vals) {
+ for (T val : vals) {
+ assertEquals(val, src.next());
+ }
+ }
+
+ /**
+ * Assert an iterator provides a particular sequence of values.
+ *
+ * @param src
+ * The iterator to pull values from.
+ * @param hasMore
+ * The expected value of hasNext for the iterator.
+ * @param vals
+ * The values to expect from the iterator.
+ */
+ public static <T> void assertIteratorEquals(Iterator<T> src, boolean hasMore, T... vals) {
+ assertIteratorEquals(src, vals);
+
+ assertEquals(hasMore, src.hasNext());
+ }
+}
diff --git a/base/src/test/java/bjc/utils/data/BooleanToggleTest.java b/base/src/test/java/bjc/utils/data/BooleanToggleTest.java
new file mode 100644
index 0000000..f2b4994
--- /dev/null
+++ b/base/src/test/java/bjc/utils/data/BooleanToggleTest.java
@@ -0,0 +1,36 @@
+package bjc.utils.data;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Test for boolean toggles.
+ * @author bjculkin
+ *
+ */
+public class BooleanToggleTest {
+
+ /**
+ * Test that boolean toggles work right.
+ */
+ @Test
+ public void test() {
+ BooleanToggle tog = new BooleanToggle();
+
+ // Check initial value is false.
+ assertEquals(false, tog.peek());
+ // Check that 'get' returns the old value
+ assertEquals(false, tog.get());
+ // Check that 'get' swaps the value
+ assertEquals(true, tog.peek());
+ // Check that we can round-trip back.
+ assertEquals(true, tog.get());
+ assertEquals(false, tog.peek());
+
+ tog.set(true);
+
+ // Check set works
+ assertEquals(true, tog.peek());
+ }
+}
diff --git a/base/src/test/java/bjc/utils/data/CircularIteratorTest.java b/base/src/test/java/bjc/utils/data/CircularIteratorTest.java
new file mode 100644
index 0000000..c08bbb1
--- /dev/null
+++ b/base/src/test/java/bjc/utils/data/CircularIteratorTest.java
@@ -0,0 +1,50 @@
+package bjc.utils.data;
+
+import static org.junit.Assert.*;
+import static bjc.utils.funcutils.TestUtils.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+/**
+ * Test for circular iterators.,
+ *
+ * @author bjculkin
+ *
+ */
+public class CircularIteratorTest {
+
+ /**
+ * Test regular repetition of the entire iterator.
+ */
+ @Test
+ public void testRegular() {
+ List<String> lst = Arrays.asList("a", "b", "c");
+
+ CircularIterator<String> itr = new CircularIterator<>(lst);
+
+ // Check we get initial values correctly, and have more remaining
+ assertIteratorEquals(itr, true, "a", "b", "c");
+
+ // Check we repeat correctly, and can still repeat
+ assertIteratorEquals(itr, true, "a", "b", "c");
+ }
+
+ /**
+ * Test that the last element repeats correctly.
+ */
+ @Test
+ public void testRepLast() {
+ List<String> lst = Arrays.asList("a", "b", "c");
+
+ CircularIterator<String> itr = new CircularIterator<>(lst, false);
+
+ // Check we get initial values correctly, and have more remaining
+ assertIteratorEquals(itr, true, "a", "b", "c");
+
+ // Check we repeat correctly, and can still repeat
+ assertIteratorEquals(itr, true, "c", "c", "c");
+ }
+}