@Test
  public void checkUnion2() {
    DoublesSketch qs1 = buildQS(256, 1000);
    DoublesSketch qs2 = buildQS(128, 1000);
    DoublesUnion union = DoublesUnion.builder().build(); // virgin

    union.update(qs1);
    DoublesSketch res1 = union.getResult();
    // println(res1.toString());
    assertEquals(res1.getN(), 1000);
    assertEquals(res1.getK(), 256);

    union.update(qs2);
    DoublesSketch res2 = union.getResult();
    assertEquals(res2.getN(), 2000);
    assertEquals(res2.getK(), 128);
    // println(union.toString());
  }
  @Test
  public void checkUnion1() {
    DoublesSketch result;
    DoublesSketch qs1 = null;
    DoublesUnion union = DoublesUnion.builder().build(); // virgin

    qs1 = buildQS(256, 1000); // first 1000
    union.update(qs1); // copy   me = null,  that = valid, OK

    // check copy   me = null,  that = valid
    result = union.getResult();
    assertEquals(result.getN(), 1000);
    assertEquals(result.getK(), 256);

    // check merge  me = valid, that = valid, both K's the same
    DoublesSketch qs2 = buildQS(256, 1000, 1000); // add 1000
    union.update(qs2);
    result = union.getResult();
    assertEquals(result.getN(), 2000);
    assertEquals(result.getK(), 256);
  }
  @Test
  public void checkUpdateMemory() {
    DoublesSketch qs1 = buildQS(256, 1000);
    int bytes = qs1.getStorageBytes();
    Memory dstMem = new NativeMemory(new byte[bytes]);
    qs1.putMemory(dstMem);
    Memory srcMem = dstMem;

    DoublesUnion union = DoublesUnion.builder().build(); // virgin
    union.update(srcMem);
    for (int i = 1000; i < 2000; i++) union.update(i);
    DoublesSketch qs2 = union.getResult();
    assertEquals(qs2.getMaxValue(), 1999, 0.0);
    String s = union.toString();
    println(s); // enable printing to see
    union.reset(); // sets to null
  }