@Override
    public DataSourceProvenance getProvenance() {
        return new DemoLabelDataSourceProvenance(this);
    }
@Test
    public void testCheckerboard() {
        // Check zero samples throws
        assertThrows(PropertyException.class, () -> new CheckerboardDataSource(0, 1, 10, 0.0, 1.0));
        // Check invalid numSquares throws
        assertThrows(PropertyException.class, () -> new CheckerboardDataSource(200, 1, 1, 0.0, 1.0));
        // Check invalid min & max
        assertThrows(PropertyException.class, () -> new CheckerboardDataSource(200, 1, 10, 0.0, 0.0));
        assertThrows(PropertyException.class, () -> new CheckerboardDataSource(200, 1, 10, 0.0, -1.0));

        // Check valid parameters work
        CheckerboardDataSource source = new CheckerboardDataSource(2000, 1, 10, -1.0, 1.0);
        assertEquals(2000, source.examples.size());
        Dataset<Label> dataset = new MutableDataset<>(source);
        Map<String, Long> map = new HashMap<>();
        dataset.getOutputInfo().outputCountsIterable().forEach((p) -> map.put(p.getA(), p.getB()));
        assertEquals(996, map.get("X"));
        assertEquals(1004, map.get("O"));
        Helpers.testProvenanceMarshalling(source.getProvenance());
    }