package nl.ipo.cds.etl; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import nl.ipo.cds.etl.theme.protectedSite.ProtectedSite; import org.junit.Before; import org.junit.Test; public class FeaturePipelineTest { private ProtectedSite a; private ProtectedSite b; private ProtectedSite c; private ProtectedSite d; @Before public void createFeatures () { a = new ProtectedSite (); b = new ProtectedSite (); c = new ProtectedSite (); d = new ProtectedSite (); } /** * Test a pipeline without any filters: it should pass all features * directly to output stream without modification or change in ordering. */ public @Test void testEmptyPipeline () { List<ProtectedSite> result = process (pipeline ()); assertEquals (0, result.size ()); result = process (pipeline (), a); assertEquals (1, result.size ()); assertSame (a, result.get (0)); result = process (pipeline (), a, b, c); assertEquals (3, result.size ()); assertSame (a, result.get (0)); assertSame (b, result.get (1)); assertSame (c, result.get (2)); } /** * Tests a pipeline that discards all or some of the input features. */ public @Test void testDiscardingPipeline () { List<ProtectedSite> result = process (pipeline (discardFilter ()), a, b, c); assertEquals (0, result.size ()); result = process (pipeline (discardModuloFilter (2)), a, b, c, d); assertEquals (2, result.size ()); assertSame (a, result.get (0)); assertSame (c, result.get (1)); } /** * Test using pipelines that increase the number of features. */ public @Test void testEmitMultiple () { List<ProtectedSite> result = process (pipeline (duplicateFilter ()), a, b, c); assertEquals (6, result.size ()); assertSame (a, result.get (0)); assertSame (b, result.get (2)); assertSame (c, result.get (4)); } /** * Tests using pipelines consisting of multiple filters. */ public @Test void testLongPipeline () { List<ProtectedSite> result = process (pipeline (noOpFilter (), noOpFilter (), noOpFilter (), noOpFilter ()), a, b, c); assertEquals (3, result.size ()); assertSame (a, result.get (0)); assertSame (b, result.get (1)); assertSame (c, result.get (2)); result = process (pipeline (noOpFilter (), noOpFilter (), discardFilter (), noOpFilter ()), a, b, c); assertEquals (0, result.size ()); result = process (pipeline (noOpFilter (), discardModuloFilter (2), noOpFilter (), noOpFilter ()), a, b, c); assertEquals (2, result.size ()); assertSame (a, result.get (0)); assertSame (c, result.get (1)); result = process (pipeline (noOpFilter (), discardModuloFilter (3), noOpFilter (), discardModuloFilter (2), noOpFilter ()), a, b, c, d); assertEquals (2, result.size ()); assertSame (a, result.get (0)); assertSame (d, result.get (1)); } private static List<ProtectedSite> process (final FeaturePipeline<ProtectedSite, ProtectedSite> pipeline, final ProtectedSite ... features) { final List<ProtectedSite> result = new ArrayList<ProtectedSite> (); final FeatureOutputStream<ProtectedSite> outputStream = new FeatureOutputStream<ProtectedSite> () { @Override public void writeFeature (final ProtectedSite feature) { assertNotNull (feature); result.add (feature); } }; final FeatureOutputStream<Feature> errorStream = new FeatureOutputStream<Feature> () { @Override public void writeFeature (final Feature feature) { assertNotNull (feature); } }; for (final ProtectedSite feature: features) { pipeline.processFeature (feature, outputStream, errorStream); } return result; } private static FeaturePipeline<ProtectedSite, ProtectedSite> pipeline (final Filter ... featureFilters) { return new FeaturePipeline<ProtectedSite, ProtectedSite> (featureFilters); } private static Filter noOpFilter () { return new Filter () { @Override public void processFeature (final ProtectedSite feature, final FeatureOutputStream<ProtectedSite> outputStream, final FeatureOutputStream<Feature> errorStream) { outputStream.writeFeature (feature); } @Override public void finish () { } @Override public boolean postProcess() { return true; } }; } private static Filter discardFilter () { return new Filter () { @Override public void processFeature (final ProtectedSite feature, final FeatureOutputStream<ProtectedSite> outputStream, final FeatureOutputStream<Feature> errorStream) { // Write nothing to the output stream. } @Override public void finish () { } @Override public boolean postProcess() { return true; } }; } private static Filter discardModuloFilter (final int n) { return new Filter () { int count = 1; @Override public void processFeature (final ProtectedSite feature, final FeatureOutputStream<ProtectedSite> outputStream, final FeatureOutputStream<Feature> errorStream) { if ((count % n) != 0) { outputStream.writeFeature (feature); } ++ count; } @Override public void finish () { } @Override public boolean postProcess() { return true; } }; } private static Filter duplicateFilter () { return new Filter () { @Override public void processFeature (final ProtectedSite feature, final FeatureOutputStream<ProtectedSite> outputStream, final FeatureOutputStream<Feature> errorStream) { outputStream.writeFeature (feature); outputStream.writeFeature (new ProtectedSite ()); } @Override public void finish () { } @Override public boolean postProcess() { return true; } }; } private static interface Filter extends FeatureFilter<ProtectedSite, ProtectedSite> { } }