package org.commcare.android.tests; import org.commcare.CommCareApplication; import org.commcare.android.CommCareTestRunner; import org.commcare.android.mocks.ExtendedTestCursor; import org.commcare.models.database.IndexSpanningIterator; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Arrays; import java.util.Vector; import static junit.framework.Assert.assertEquals; @Config(application = CommCareApplication.class) @RunWith(CommCareTestRunner.class) public class IndexSpanningIteratorTest { private int[] i(int... inputs) { return inputs; } @Test public void testGapWalking() { //Empty inputs testSpans(i(), i(), 0, 0, 0); //Multiple Gaps testSpans(i(5, 7, 9), i(1, 2, 3, 4, 6, 8)); //No gap testSpans(i(5), i(1, 2, 3, 4)); //No Gap, late start testSpans(i(5), i(2, 3, 4)); //endpoint gaps testSpans(i(2, 3, 6), i(1, 4, 5)); //No results testSpans(i(3, 4), i(), 3, 4, 0); //N gap testSpans(i(3, 4, 5, 8), i(1, 2, 6, 7)); //Multiple split gaps testSpans(i(5, 6, 8, 9, 11), i(2, 3, 4, 7, 10)); //From the iterator documentation testSpans(i(4, 8, 9, 12), i(1, 2, 3, 5, 6, 7, 10, 11)); } private void testSpans(int[] inputs, int[] expected) { testSpans(inputs, expected, expected[0], inputs[inputs.length - 1], expected.length); } private void testSpans(int[] inputs, int[] expected, int min, int max, int count) { Integer[][] master = new Integer[inputs.length][1]; for (int i = 0; i < inputs.length; ++i) { master[i] = new Integer[]{inputs[i]}; } ExtendedTestCursor c = new ExtendedTestCursor(); c.setResults(master); Vector<Integer> vals = new Vector<>(); IndexSpanningIterator iterator = new IndexSpanningIterator(c, null, min, max, count); while (iterator.hasMore()) { vals.add(iterator.nextID()); } assertEquals("Index Size for: " + Arrays.toString(expected) + " | " + vals.toString(), expected.length, vals.size()); for (int i = 0; i < expected.length; ++i) { assertEquals("Mismatched value: " + Arrays.toString(expected) + " | " + vals.toString(), expected[i], (int)vals.elementAt(i)); } } }