package com.ldbc.driver.generator;
import org.apache.commons.math3.random.RandomDataGenerator;
import org.junit.Test;
import java.util.Iterator;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class GeneratorFactoryDeterminismTest {
@Test
public void randomGeneratorsWithSameSeedShouldReturnSameNumberSequence() {
new RandomDataGenerator();
GeneratorFactory generatorsA = new GeneratorFactory(new RandomDataGeneratorFactory(42L));
GeneratorFactory generatorsB = new GeneratorFactory(new RandomDataGeneratorFactory(42L));
for (int i = 0; i < 1000; i++) {
RandomDataGenerator generatorA = generatorsA.getRandom();
RandomDataGenerator generatorB = generatorsB.getRandom();
for (int j = 0; j < 1000; j++) {
assertThat(generatorA.nextLong(0, 1000), is(generatorB.nextLong(0, 1000)));
assertThat(generatorA.nextUniform(0D, 1000D), is(generatorB.nextUniform(0D, 1000D)));
}
}
}
@Test
public void randomGeneratorsWithDifferentSeedShouldReturnDifferentNumberSequence() {
RandomDataGenerator generatorA = new GeneratorFactory(new RandomDataGeneratorFactory(41L)).getRandom();
RandomDataGenerator generatorB = new GeneratorFactory(new RandomDataGeneratorFactory(42L)).getRandom();
boolean generatorsDiffer = false;
for (int j = 0; j < 100; j++) {
if (generatorA.nextLong(0, 1000) != generatorB.nextLong(0, 1000))
generatorsDiffer = true;
}
assertThat(generatorsDiffer, is(true));
}
@Test
public void randomGeneratorsFromSameGeneratorFactoryShouldReturnDifferentNumberSequences() {
GeneratorFactory generators = new GeneratorFactory(new RandomDataGeneratorFactory(42L));
RandomDataGenerator generatorA = generators.getRandom();
RandomDataGenerator generatorB = generators.getRandom();
boolean generatorsDiffer = false;
for (int j = 0; j < 100; j++) {
if (generatorA.nextLong(0, 1000) != generatorB.nextLong(0, 1000))
generatorsDiffer = true;
}
assertThat(generatorsDiffer, is(true));
}
@Test
public void generatorsFromDifferentGeneratorFactoriesWithSameSeedShouldReturnSameNumberSequences() {
GeneratorFactory generatorsA = new GeneratorFactory(new RandomDataGeneratorFactory(42L));
GeneratorFactory generatorsB = new GeneratorFactory(new RandomDataGeneratorFactory(42L));
Iterator<Double> doubleUniformA = generatorsA.uniform(0D, 1000D);
Iterator<Long> longUniformA = generatorsA.uniform(0L, 1000L);
Iterator<Double> doubleUniformB = generatorsB.uniform(0D, 1000D);
Iterator<Long> longUniformB = generatorsB.uniform(0L, 1000L);
for (int j = 0; j < 1000; j++) {
assertThat(doubleUniformA.next(), is(doubleUniformB.next()));
assertThat(longUniformA.next(), is(longUniformB.next()));
}
}
@Test
public void generatorsFromSameGeneratorFactoryShouldReturnDifferentNumberSequences() {
GeneratorFactory generators = new GeneratorFactory(new RandomDataGeneratorFactory(42L));
boolean generatorsDiffer = false;
for (int j = 0; j < 100; j++) {
Iterator<Long> longUniformA = generators.uniform(0L, 1000L);
Iterator<Long> longUniformB = generators.uniform(0L, 1000L);
if (longUniformA.next() != longUniformB.next())
generatorsDiffer = true;
}
assertThat(generatorsDiffer, is(true));
}
}