@Test
  public void testIllegalRepoPaths() {
    String repo = "series://";
    String docPath = repo + "x/x";

    try {
      Kernel.getSeries()
          .createSeriesRepo(ContextFactory.getKernelUser(), repo, "SERIES {} using MEMORY {}");
      fail("Cannot create a repository without an authority");
    } catch (RaptureException e) {
      assertEquals("Cannot create a repository without an authority", e.getMessage());
    }
    try {
      Kernel.getSeries()
          .createSeriesRepo(ContextFactory.getKernelUser(), "", "SERIES {} using MEMORY {}");
      fail("URI cannot be null or empty");
    } catch (RaptureException e) {
      assertEquals("Argument Repository URI cannot be null or empty", e.getMessage());
    }
    try {
      Kernel.getSeries()
          .createSeriesRepo(ContextFactory.getKernelUser(), null, "SERIES {} using MEMORY {}");
      fail("URI cannot be null or empty");
    } catch (RaptureException e) {
      assertEquals("Argument Repository URI cannot be null or empty", e.getMessage());
    }
    try {
      Kernel.getSeries()
          .createSeriesRepo(ContextFactory.getKernelUser(), docPath, "SERIES {} using MEMORY {}");
      fail("Repository Uri can't have a document path component");
    } catch (RaptureException e) {
      assertEquals("A Repository URI may not have a document path component", e.getMessage());
    }
  }
  @Test
  public void testLastPoint() {
    String seriesName = "ticker";
    String uri = String.format("%s/%s", REPO, seriesName);

    // add data points to series
    int total = 30;
    for (int i = 1; i <= total; i++) {
      Kernel.getSeries().addStringToSeries(ctx, uri, getColumn(i), getValue(i));
    }

    // check last column
    SeriesPoint lastPoint = Kernel.getSeries().getLastPoint(ctx, uri);
    assertEquals(getColumn(total), lastPoint.getColumn());
  }
 @Test
 public void deleteSeriesByUriPrefixTest() {
   ensureRepo(REPO);
   ensureSeries(REPO, "top");
   ensureSeries(REPO, "live/series");
   ensureSeries(REPO, "die/series");
   ensureSeries(REPO, "nested/die/series");
   ensureSeries(REPO, "die/nested/series");
   Kernel.getSeries().deleteSeriesByUriPrefix(ctx, REPO + "/die");
 }
  @Test
  // also tests listSeriesByUriPrefix indirectly - seriesExists uses it
  public void createExistTest() {
    ensureRepo(REPO);
    String name1 = "/Cheers/foo";
    String name2 = "/Cheers/bar";
    String series1 = REPO + name1;
    String series2 = REPO + name2;
    SeriesApi api = Kernel.getSeries();

    ensureSeries(REPO, name1);
    ensureSeries(REPO, name2);

    assertTrue(series1 + " should exist", api.seriesExists(ctx, series1));

    api.deleteSeries(ctx, series1);
    assertTrue(series2 + " should still exist", api.seriesExists(ctx, series2));
    assertFalse(series1 + " should have been deleted", api.seriesExists(ctx, series1));

    api.addStringToSeries(ctx, series1, "column-key", "column-value");
    assertTrue(series2 + " should still exist", api.seriesExists(ctx, series2));
    assertTrue(series1 + " Should be back", api.seriesExists(ctx, series1));
  }
  @Test
  public void testMultiAdd() {
    String seriesName = "foo";
    String uri = String.format("%s/%s", REPO, seriesName);

    List<String> columns = Arrays.asList(new String[] {"19700101", "19700102", "19700103"});
    List<String> stringValues =
        Arrays.asList(new String[] {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"});
    List<String> jsonValues = Arrays.asList(new String[] {"{}", "{}", "{}", "{}"});
    List<Double> doubleValues = Arrays.asList(new Double[] {1.0d, 2.0d, 3.0d, 4.0d});
    List<Long> longValues = Arrays.asList(new Long[] {1l, 2l, 3l, 4l});
    List<Double> nullDoubleValues = Arrays.asList(new Double[] {null, null, null});
    List<String> nullStringValues = Arrays.asList(new String[] {null, null, null});
    List<Long> nullLongValues = Arrays.asList(new Long[] {null, null, null});

    try {
      Kernel.getSeries().addStringsToSeries(ctx, uri, columns, stringValues);
      Assert.fail("Expected exception due to mismatched list sizes");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries().addStructuresToSeries(ctx, uri, columns, jsonValues);
      Assert.fail("Expected exception due to mismatched list sizes");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries().addLongsToSeries(ctx, uri, columns, longValues);
      Assert.fail("Expected exception due to mismatched list sizes");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries().addDoublesToSeries(ctx, uri, columns, doubleValues);
      Assert.fail("Expected exception due to mismatched list sizes");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries().addStringsToSeries(ctx, uri, columns, nullStringValues);
    } catch (RaptureException e) {
      Assert.fail("Unexpected exception adding list of Null strings" + e);
    }

    try {
      Kernel.getSeries().addStructuresToSeries(ctx, uri, columns, nullStringValues);
      Assert.fail("Expected exception due to null values");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries().addLongsToSeries(ctx, uri, columns, nullLongValues);
      Assert.fail("Expected exception due to null values");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries().addDoublesToSeries(ctx, uri, columns, nullDoubleValues);
      Assert.fail("Expected exception due to null values");
    } catch (RaptureException e) {
      // Expected
    }

    try {
      Kernel.getSeries()
          .addStringsToSeries(ctx, uri, new ArrayList<String>(), new ArrayList<String>());
      Kernel.getSeries()
          .addDoublesToSeries(ctx, uri, new ArrayList<String>(), new ArrayList<Double>());
      Kernel.getSeries().addLongsToSeries(ctx, uri, new ArrayList<String>(), new ArrayList<Long>());
      Kernel.getSeries()
          .addStructuresToSeries(ctx, uri, new ArrayList<String>(), new ArrayList<String>());
    } catch (RaptureException e) {
      Assert.fail("Unexpected exception - empty list is silly but legal " + e);
    }
  }
 private void ensureRepo(String repo) {
   if (!Kernel.getSeries().seriesRepoExists(ctx, repo)) {
     Kernel.getSeries().createSeriesRepo(ctx, repo, "SREP {} USING MEMORY { }");
   }
 }
 private void ensureSeries(String repo, String name) {
   String uri = repo + (name.startsWith("/") ? "" : "/") + name;
   Kernel.getSeries().addDoubleToSeries(ctx, uri, "mel", 45.0);
 }
 private void deleteRepo(String repo) {
   Kernel.getSeries().deleteSeriesRepo(ctx, repo);
 }