Skip to content

Instantly share code, notes, and snippets.

@brbrt
Created March 24, 2018 13:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brbrt/9ee0706e65b0953e1eb9881dada62c26 to your computer and use it in GitHub Desktop.
Save brbrt/9ee0706e65b0953e1eb9881dada62c26 to your computer and use it in GitHub Desktop.
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;
}
}
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