Created
March 24, 2018 13:47
-
-
Save brbrt/9ee0706e65b0953e1eb9881dada62c26 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package br.counterwithrange; | |
import java.util.concurrent.atomic.AtomicInteger; | |
public class Counter { | |
private final int rangeMin; | |
private final int rangeMax; | |
private final int step; | |
private final AtomicInteger counter; | |
public Counter(int rangeMin, int rangeMax) { | |
this.rangeMin = rangeMin; | |
this.rangeMax = rangeMax; | |
this.step = rangeMin <= rangeMax ? 1 : -1; | |
this.counter = new AtomicInteger(rangeMin); | |
} | |
public int get() { | |
return counter.get(); | |
} | |
public int incrementAndGet() { | |
return counter.updateAndGet(this::updateCounter); | |
} | |
public int getAndIncrement() { | |
return counter.getAndUpdate(this::updateCounter); | |
} | |
private int updateCounter(int previousValue) { | |
int nextValue = previousValue + step; | |
// Counting up and reaching the upper limit | |
if (step == 1 && nextValue > rangeMax) { | |
return rangeMin; | |
} | |
// Counting down and reaching the lower limit | |
if (step == -1 && nextValue < rangeMax) { | |
return rangeMin; | |
} | |
return nextValue; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package br.counterwithrange; | |
import org.junit.jupiter.api.Test; | |
import static org.assertj.core.api.Assertions.assertThat; | |
class CounterTest { | |
private Counter counter; | |
@Test | |
void getReturnsMinFirst() { | |
counter = new Counter(1, 3); | |
assertThat(counter.get()).isEqualTo(1); | |
} | |
@Test | |
void incrementAndGet1to3() { | |
counter = new Counter(1, 3); | |
assertThat(counter.incrementAndGet()).isEqualTo(2); | |
assertThat(counter.get()).isEqualTo(2); | |
assertThat(counter.incrementAndGet()).isEqualTo(3); | |
assertThat(counter.get()).isEqualTo(3); | |
assertThat(counter.incrementAndGet()).isEqualTo(1); | |
assertThat(counter.get()).isEqualTo(1); | |
} | |
@Test | |
void getAndIncrementAndGet1to3() { | |
counter = new Counter(1, 3); | |
assertThat(counter.getAndIncrement()).isEqualTo(1); | |
assertThat(counter.get()).isEqualTo(2); | |
assertThat(counter.getAndIncrement()).isEqualTo(2); | |
assertThat(counter.get()).isEqualTo(3); | |
assertThat(counter.getAndIncrement()).isEqualTo(3); | |
assertThat(counter.get()).isEqualTo(1); | |
assertThat(counter.getAndIncrement()).isEqualTo(1); | |
assertThat(counter.get()).isEqualTo(2); | |
} | |
@Test | |
void incrementAndGet9to6() { | |
counter = new Counter(9, 6); | |
assertThat(counter.incrementAndGet()).isEqualTo(8); | |
assertThat(counter.get()).isEqualTo(8); | |
assertThat(counter.incrementAndGet()).isEqualTo(7); | |
assertThat(counter.get()).isEqualTo(7); | |
assertThat(counter.incrementAndGet()).isEqualTo(6); | |
assertThat(counter.get()).isEqualTo(6); | |
assertThat(counter.incrementAndGet()).isEqualTo(9); | |
assertThat(counter.get()).isEqualTo(9); | |
} | |
@Test | |
void getAndIncrementAndGet9to6() { | |
counter = new Counter(9, 6); | |
assertThat(counter.getAndIncrement()).isEqualTo(9); | |
assertThat(counter.get()).isEqualTo(8); | |
assertThat(counter.getAndIncrement()).isEqualTo(8); | |
assertThat(counter.get()).isEqualTo(7); | |
assertThat(counter.getAndIncrement()).isEqualTo(7); | |
assertThat(counter.get()).isEqualTo(6); | |
assertThat(counter.getAndIncrement()).isEqualTo(6); | |
assertThat(counter.get()).isEqualTo(9); | |
assertThat(counter.getAndIncrement()).isEqualTo(9); | |
assertThat(counter.get()).isEqualTo(8); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment