package gov.samhsa.consent2share.common; import static org.junit.Assert.assertEquals; import gov.samhsa.consent2share.common.UniqueValueGenerator; import gov.samhsa.consent2share.common.UniqueValueGeneratorException; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class UniqueValueGeneratorTest { private static final String TEST_VALUE = "TEST_VALUE"; private static final short LIMIT = 3; @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testGenerateUniqueValue_Success_First_Trial() { // Arrange AtomicInteger counter = new AtomicInteger(0); // Act String value = UniqueValueGenerator.generateUniqueValue( () -> TEST_VALUE, v -> { counter.incrementAndGet(); return true; }, LIMIT); // Assert assertEquals(TEST_VALUE, value); assertEquals(1, counter.get()); } @Test public void testGenerateUniqueValue_Success_Last_Trial() { // Arrange AtomicInteger counter = new AtomicInteger(0); // Act String value = UniqueValueGenerator.generateUniqueValue( () -> TEST_VALUE, v -> counter.incrementAndGet() >= LIMIT, LIMIT); // Assert assertEquals(TEST_VALUE, value); assertEquals(LIMIT, counter.get()); } @Test public void testGenerateUniqueValue_Throws_UniqueValueGeneratorException_Last_Trial1() { // Arrange AtomicInteger counter = new AtomicInteger(0); thrown.expect(UniqueValueGeneratorException.class); // Act String value = null; try { value = UniqueValueGenerator.generateUniqueValue(() -> TEST_VALUE, v -> { counter.incrementAndGet(); return false; }, LIMIT); } catch (Exception e) { // Assert assertEquals(null, value); assertEquals(LIMIT, counter.get()); throw e; } } @Test public void testGenerateUniqueValue_Throws_UniqueValueGeneratorException_Last_Trial2() { // Arrange AtomicInteger counter = new AtomicInteger(0); thrown.expect(UniqueValueGeneratorException.class); // Act String value = null; try { value = UniqueValueGenerator.generateUniqueValue(() -> TEST_VALUE, v -> counter.incrementAndGet() > LIMIT, LIMIT); } catch (Exception e) { // Assert assertEquals(null, value); assertEquals(LIMIT, counter.get()); throw e; } } }