package org.xbib.elasticsearch.index.analysis.combo; import org.junit.Test; import org.xbib.elasticsearch.index.analysis.BaseTokenStreamTest; import java.io.IOException; import java.io.Reader; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; public class ReusableStringReaderClonerTests extends BaseTokenStreamTest { @Test public void test() throws Exception { String content = "test\n"; ReusableStringReader reader = new ReusableStringReader(); reader.setValue(content); ReusableStringReaderCloner cloner = new ReusableStringReaderCloner(); cloner.init(reader); Reader clone1 = cloner.giveAClone(); // The original Reader can be returned with this implementation. // Check it actually is. assertThat("returns original reader", clone1, is((Reader) reader)); assertThat("same content", ReaderContent.readWhole(clone1), equalTo(content)); assertThat("empty after reading", clone1.read(), equalTo(-1)); Reader clone2 = cloner.giveAClone(); assertThat("do not return the previous clone", clone2, not(is(clone1))); assertThat("same content", ReaderContent.readWhole(clone2), equalTo(content)); assertThat("empty after reading", clone2.read(), equalTo(-1)); } @Test public void testReuseAfterUse() throws Exception { String content = "test\n"; ReusableStringReader reader = new ReusableStringReader(); reader.setValue(content); ReusableStringReaderCloner cloner = new ReusableStringReaderCloner(); cloner.init(reader); Reader clone1 = cloner.giveAClone(); // The original Reader can be returned with this implementation. // Check it actually is. assertThat("returns original reader", clone1, is((Reader) reader)); assertThat("same content", ReaderContent.readWhole(clone1), equalTo(content)); assertThat("empty after reading", clone1.read(), equalTo(-1)); // Now change the content! String otherContent = content + " CHANGED"; assertThat("contents are not equal", otherContent, not(equalTo(content))); reader.setValue(otherContent); Reader clone2 = cloner.giveAClone(); assertThat("do not return the previous clone", clone2, not(is(clone1))); assertThat("same content as before", ReaderContent.readWhole(clone2), equalTo(content)); assertThat("empty after reading", clone2.read(), equalTo(-1)); } @Test public void testReuseBeforeUse() throws Exception { String content = "test\n"; ReusableStringReader reader = new ReusableStringReader(); reader.setValue(content); ReusableStringReaderCloner cloner = new ReusableStringReaderCloner(); cloner.init(reader); // Now change the content! String otherContent = content + " CHANGED"; assertThat("contents are not equal", otherContent, not(equalTo(content))); reader.setValue(otherContent); Reader clone1 = cloner.giveAClone(); // The original Reader can be returned with this implementation. // Check it actually is. assertThat("returns original reader", clone1, is((Reader) reader)); assertThat("has the new content", ReaderContent.readWhole(clone1), equalTo(otherContent)); // alas, but desirable performance-wise assertThat("empty after reading", clone1.read(), equalTo(-1)); Reader clone2 = cloner.giveAClone(); assertThat("do not return the previous clone", clone2, not(is(clone1))); String actualContent = ReaderContent.readWhole(clone2); assertThat("same content as before", actualContent, equalTo(content)); assertThat("empty after reading", clone2.read(), equalTo(-1)); } @Test public void testCloningReusableStringReader() throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException { // This test cannot be located inside TestReaderCloneFactory // because of the ReusableStringReader class being package private // (and it's a real pain to use Java reflection to gain access to // a package private constructor) Reader clone; ReusableStringReader reader = new ReusableStringReader(); reader.setValue("test string"); ReaderCloneFactory.ReaderCloner<Reader> cloner = ReaderCloneFactory.getCloner(reader); assertNotNull(cloner); assertEquals(cloner.getClass().getName(), ReusableStringReaderCloner.class.getName()); clone = cloner.giveAClone(); ReaderContent.assertReaderContent(clone, "test string"); clone = cloner.giveAClone(); ReaderContent.assertReaderContent(clone, "test string"); // Test reusability ReaderCloneFactory.ReaderCloner<ReusableStringReader> forClassClonerStrict = ReaderCloneFactory.getClonerStrict(ReusableStringReader.class); assertNotNull(forClassClonerStrict); assertEquals(forClassClonerStrict.getClass().getName(), ReusableStringReaderCloner.class.getName()); reader.setValue("another test string"); forClassClonerStrict.init(reader); clone = forClassClonerStrict.giveAClone(); ReaderContent.assertReaderContent(clone, "another test string"); clone = forClassClonerStrict.giveAClone(); ReaderContent.assertReaderContent(clone, "another test string"); reader.setValue("test string"); forClassClonerStrict.init(reader); clone = forClassClonerStrict.giveAClone(); ReaderContent.assertReaderContent(clone, "test string"); clone = forClassClonerStrict.giveAClone(); ReaderContent.assertReaderContent(clone, "test string"); ReaderCloneFactory.ReaderCloner<Reader> forClassCloner = ReaderCloneFactory.getCloner(ReusableStringReader.class); assertNotNull(forClassCloner); assertEquals(forClassCloner.getClass().getName(), ReusableStringReaderCloner.class.getName()); reader.setValue("another test string"); forClassCloner.init(reader); clone = forClassCloner.giveAClone(); ReaderContent.assertReaderContent(clone, "another test string"); clone = forClassCloner.giveAClone(); ReaderContent.assertReaderContent(clone, "another test string"); reader.setValue("test string"); forClassCloner.init(reader); clone = forClassCloner.giveAClone(); ReaderContent.assertReaderContent(clone, "test string"); clone = forClassCloner.giveAClone(); ReaderContent.assertReaderContent(clone, "test string"); } }