@Override
    public DataSourceProvenance getProvenance() {
        return new AggregateDataSourceProvenance(this);
    }
@Test
    public void testADSIterationOrder() {
        MockOutputFactory factory = new MockOutputFactory();
        String[] featureNames = new String[] {"X1","X2"};
        double[] featureValues = new double[] {1.0, 2.0};

        List<Example<MockOutput>> first = new ArrayList<>();
        first.add(new ArrayExample<>(new MockOutput("A"),featureNames,featureValues));
        first.add(new ArrayExample<>(new MockOutput("B"),featureNames,featureValues));
        first.add(new ArrayExample<>(new MockOutput("C"),featureNames,featureValues));
        first.add(new ArrayExample<>(new MockOutput("D"),featureNames,featureValues));
        first.add(new ArrayExample<>(new MockOutput("E"),featureNames,featureValues));
        ListDataSource<MockOutput> firstSource = new ListDataSource<>(first,factory,new SimpleDataSourceProvenance("First",factory));

        List<Example<MockOutput>> second = new ArrayList<>();
        second.add(new ArrayExample<>(new MockOutput("F"),featureNames,featureValues));
        second.add(new ArrayExample<>(new MockOutput("G"),featureNames,featureValues));
        ListDataSource<MockOutput> secondSource = new ListDataSource<>(second,factory,new SimpleDataSourceProvenance("Second",factory));

        List<Example<MockOutput>> third = new ArrayList<>();
        third.add(new ArrayExample<>(new MockOutput("H"),featureNames,featureValues));
        third.add(new ArrayExample<>(new MockOutput("I"),featureNames,featureValues));
        third.add(new ArrayExample<>(new MockOutput("J"),featureNames,featureValues));
        third.add(new ArrayExample<>(new MockOutput("K"),featureNames,featureValues));
        ListDataSource<MockOutput> thirdSource = new ListDataSource<>(third,factory,new SimpleDataSourceProvenance("Third",factory));

        List<DataSource<MockOutput>> sources = new ArrayList<>();
        sources.add(firstSource);
        sources.add(secondSource);
        sources.add(thirdSource);

        AggregateDataSource<MockOutput> adsSeq = new AggregateDataSource<>(sources, AggregateDataSource.IterationOrder.SEQUENTIAL);
        String[] expectedSeq = new String[] {"A","B","C","D","E","F","G","H","I","J","K"};
        String[] actualSeq = StreamSupport.stream(adsSeq.spliterator(), false).map(Example::getOutput).map(MockOutput::toString).toArray(String[]::new);
        Assertions.assertArrayEquals(expectedSeq,actualSeq);
        Helpers.testProvenanceMarshalling(adsSeq.getProvenance());

        AggregateDataSource<MockOutput> adsRR = new AggregateDataSource<>(sources, AggregateDataSource.IterationOrder.ROUNDROBIN);
        String[] expectedRR = new String[] {"A","F","H","B","G","I","C","J","D","K","E"};
        String[] actualRR = StreamSupport.stream(adsRR.spliterator(), false).map(Example::getOutput).map(MockOutput::toString).toArray(String[]::new);
        Assertions.assertArrayEquals(expectedRR,actualRR);
        Helpers.testProvenanceMarshalling(adsRR.getProvenance());
    }