@Test
  public void testGenerate() throws Exception {

    IAtomContainer m1 = cyclopentylcyclopentane();
    IAtomContainer m2 = decahydronaphthalene();

    SeedGenerator seeding = new SeedGenerator(BasicAtomEncoder.ATOMIC_NUMBER);
    Pseudorandom pseudorandom = new Xorshift();

    MoleculeHashGenerator basic =
        new BasicMoleculeHashGenerator(new BasicAtomHashGenerator(seeding, pseudorandom, 8));
    MoleculeHashGenerator perturb =
        new BasicMoleculeHashGenerator(
            new PerturbedAtomHashGenerator(
                seeding,
                new BasicAtomHashGenerator(seeding, pseudorandom, 8),
                pseudorandom,
                StereoEncoderFactory.EMPTY,
                new MinimumEquivalentCyclicSet(),
                AtomSuppression.unsuppressed()));
    // basic encoding should say these are the same
    assertThat(basic.generate(m1), is(basic.generate(m2)));

    // perturbed encoding should differentiate them
    assertThat(perturb.generate(m1), is(not(perturb.generate(m2))));
  }
  @Test
  public void testCombine() throws Exception {
    Xorshift prng = new Xorshift();
    PerturbedAtomHashGenerator generator =
        new PerturbedAtomHashGenerator(
            new SeedGenerator(BasicAtomEncoder.ATOMIC_NUMBER),
            new BasicAtomHashGenerator(new SeedGenerator(BasicAtomEncoder.ATOMIC_NUMBER), prng, 8),
            prng,
            StereoEncoderFactory.EMPTY,
            new MinimumEquivalentCyclicSet(),
            AtomSuppression.unsuppressed());
    long[][] perturbed =
        new long[][] {
          {1, 2, 3, 4}, {1, 1, 1, 1}, {1, 2, 2, 4}, {2, 2, 2, 2},
        };

    long _0 = 1 ^ 2 ^ 3 ^ 4;
    long _1 = 1 ^ prng.next(1) ^ prng.next(prng.next(1)) ^ prng.next(prng.next(prng.next(1)));
    long _2 = 1 ^ 2 ^ prng.next(2) ^ 4;
    long _3 = 2 ^ prng.next(2) ^ prng.next(prng.next(2)) ^ prng.next(prng.next(prng.next(2)));

    long[] values = generator.combine(perturbed);
    Assert.assertArrayEquals(values, new long[] {_0, _1, _2, _3});
  }