/*
* SPDX-FileCopyrightText: 2023 The Refinery Authors
*
* SPDX-License-Identifier: EPL-2.0
*/
package tools.refinery.store.dse.transition.statespace.internal;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.Stream;
class ActivationUnitTest {
private final static int SMALL_SIZE = 5;
private static Stream entries() {
return Stream.of(
new ActivationStoreBitVectorEntry(SMALL_SIZE),
new ActivationStoreListEntry(SMALL_SIZE)
);
}
void addTest(ActivationStoreEntry entry, int elementsAdded) {
Assertions.assertEquals(elementsAdded, entry.getNumberOfVisitedActivations());
Assertions.assertEquals(SMALL_SIZE - elementsAdded, entry.getNumberOfUnvisitedActivations());
}
@ParameterizedTest
@MethodSource("entries")
void testDifferent(ActivationStoreEntry entry) {
int elementsAdded = 0;
addTest(entry, elementsAdded);
Assertions.assertEquals(2, entry.getAndAddActivationAfter(2));
addTest(entry, ++elementsAdded);
Assertions.assertEquals(3, entry.getAndAddActivationAfter(3));
addTest(entry, ++elementsAdded);
Assertions.assertEquals(1, entry.getAndAddActivationAfter(1));
addTest(entry, ++elementsAdded);
Assertions.assertEquals(4, entry.getAndAddActivationAfter(4));
addTest(entry, ++elementsAdded);
Assertions.assertEquals(0, entry.getAndAddActivationAfter(0));
addTest(entry, ++elementsAdded);
}
@ParameterizedTest
@MethodSource("entries")
void testSame(ActivationStoreEntry entry) {
int elementsAdded = 0;
addTest(entry, 0);
entry.getAndAddActivationAfter(2);
addTest(entry, ++elementsAdded);
entry.getAndAddActivationAfter(2);
addTest(entry, ++elementsAdded);
entry.getAndAddActivationAfter(2);
addTest(entry, ++elementsAdded);
entry.getAndAddActivationAfter(2);
addTest(entry, ++elementsAdded);
entry.getAndAddActivationAfter(2);
addTest(entry, ++elementsAdded);
}
@ParameterizedTest
@MethodSource("entries")
void testFilling(ActivationStoreEntry entry) {
int elementsAdded = 0;
while (elementsAdded < SMALL_SIZE) {
entry.getAndAddActivationAfter(2);
elementsAdded++;
}
Assertions.assertThrows(IllegalArgumentException.class, () -> entry.getAndAddActivationAfter(2));
}
void randomDifferentTestCase(ActivationStoreEntry entry, int seed) {
List elements = new ArrayList<>(SMALL_SIZE);
for (int i = 0; i < SMALL_SIZE; i++) {
elements.add(i);
}
@SuppressWarnings("squid:S2245")
var random = new Random(seed);
Collections.shuffle(elements, random);
for (int element : elements) {
entry.getAndAddActivationAfter(element);
}
Assertions.assertThrows(IllegalArgumentException.class, () -> entry.getAndAddActivationAfter(2));
}
private static final int fuzzNumber = 20;
@ParameterizedTest
@MethodSource("entryFactories")
void randomDifferentTest(Supplier entry) {
for (int i = 0; i < fuzzNumber; i++) {
randomDifferentTestCase(entry.get(), i);
}
}
void randomSameTestCase(ActivationStoreEntry entry, int seed) {
@SuppressWarnings("squid:S2245")
var random = new Random(seed);
for (int i = 0; i < SMALL_SIZE; i++) {
entry.getAndAddActivationAfter(random.nextInt(SMALL_SIZE));
}
Assertions.assertThrows(IllegalArgumentException.class, () -> entry.getAndAddActivationAfter(2));
}
@ParameterizedTest
@MethodSource("entryFactories")
void randomSameTest(Supplier entry) {
for (int i = 0; i < fuzzNumber; i++) {
randomSameTestCase(entry.get(), i);
}
}
private static Stream> entryFactories() {
return Stream.of(
() -> new ActivationStoreBitVectorEntry(SMALL_SIZE),
() -> new ActivationStoreListEntry(SMALL_SIZE)
);
}
}