package org.fcrepo.server.utilities;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class PIDStreamIterableWrapperTest {
// list-style input tests
// (pids on separate lines)
@Test
public void testEmpty() throws Exception {
// no data
testIterable(new String[0], getIterable(""));
testIterable(new String[0], getIterable(" "));
// blank lines
testIterable(new String[0], getIterable("\n"));
testIterable(new String[0], getIterable(" \n"));
testIterable(new String[0], getIterable(" \n" ));
testIterable(new String[0], getIterable(" \n \n"));
testIterable(new String[0], getIterable("\n\n\n\n"));
}
@Test
public void testSingleItem() throws Exception {
// single item
testIterable(new String[] {"item"}, getIterable("item"));
testIterable(new String[] {"item"}, getIterable(" item"));
testIterable(new String[] {"item"}, getIterable(" item "));
// with blank lines
testIterable(new String[] {"item"}, getIterable("\n item "));
testIterable(new String[] {"item"}, getIterable("\n item \n"));
testIterable(new String[] {"item"}, getIterable("item\n"));
testIterable(new String[] {"item"}, getIterable("\nitem"));
testIterable(new String[] {"item"}, getIterable("\nitem\n"));
}
// xml input tests
// (element: pid, element and contents on single line, no sub-elements, attributes, etc)
@Test
public void testXML() throws IOException {
// no element
testIterable(new String[0], getIterable("<dummy>\n</dummy>"));
testIterable(new String[0], getIterable("\n<dummy>\n</dummy>"));
testIterable(new String[0], getIterable("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<dummy>\n</dummy>"));
testIterable(new String[0], getIterable("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<dummy>\n</dummy>"));
// single element
testIterable(new String[] {"test"}, getIterable("<dummy>\n<pid>test</pid>\n</dummy>"));
testIterable(new String[] {"test"}, getIterable("\n<dummy>\n\n<pid>test</pid>\n</dummy>"));
testIterable(new String[] {"test"}, getIterable("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<dummy>\n<pid>test</pid>\n</dummy>"));
// several elements, newlines, spaces before and after
String test3 = "\n<dummy>\n\n<pid>test1</pid>\n\n <pid>test2</pid>\n<pid>test3</pid> \n</dummy>";
String[] expected = {"test1", "test2", "test3"};
testIterable(expected, getIterable(test3));
test3 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + test3;
testIterable(expected, getIterable(test3));
}
private static Iterable<String> getIterable(String string) throws IOException {
return getIterable(string.getBytes("UTF-8"));
}
private static Iterable<String> getIterable(byte[] bytes) throws IOException {
return new PIDStreamIterableWrapper(new ByteArrayInputStream(bytes));
}
private static void testIterable(String[] expected, Iterable<String> it) {
// iterate, collect the results
ArrayList<String> res = new ArrayList<String>();
for (String element : it) {
res.add(element);
}
// check number of elements found
assertEquals("Iterator count matches expected", expected.length, res.size());
// check each element
for (int i = 0; i < expected.length; i++) {
assertEquals("Element matches", expected[i], res.get(i));
}
}
}