/** test OffsetRounding with an internal interval rounding on random inputs */
 public void testOffsetRoundingRandom() {
   for (int i = 0; i < 1000; ++i) {
     final long interval = randomIntBetween(1, 100);
     Rounding.Interval internalRounding = new Rounding.Interval(interval);
     final long offset = randomIntBetween(-100, 100);
     Rounding.OffsetRounding rounding = new Rounding.OffsetRounding(internalRounding, offset);
     long safetyMargin = Math.abs(interval) + Math.abs(offset); // to prevent range overflow
     long value = Math.max(randomLong() - safetyMargin, Long.MIN_VALUE + safetyMargin);
     final long key = rounding.roundKey(value);
     final long key_next = rounding.roundKey(value + interval);
     final long r_value = rounding.round(value);
     final long nextRoundingValue = rounding.nextRoundingValue(r_value);
     assertThat("Rounding should be idempotent", r_value, equalTo(rounding.round(r_value)));
     assertThat(
         "Rounded value smaller than unrounded, regardless of offset",
         r_value - offset,
         lessThanOrEqualTo(value - offset));
     assertThat("Key and next_key should differ by one", key_next - key, equalTo(1L));
     assertThat(
         "Rounded value <= value < next interval start", r_value + interval, greaterThan(value));
     assertThat(
         "NextRounding value should be interval from rounded value",
         r_value + interval,
         equalTo(nextRoundingValue));
   }
 }
 /**
  * Simple test case to illustrate how Rounding.Offset works on readable input. offset shifts input
  * value back before rounding (so here 6 - 7 -&gt; -1) then shifts rounded Value back (here -10
  * -&gt; -3)
  */
 public void testOffsetRounding() {
   final long interval = 10;
   final long offset = 7;
   Rounding.OffsetRounding rounding =
       new Rounding.OffsetRounding(new Rounding.Interval(interval), offset);
   assertEquals(-1, rounding.roundKey(6));
   assertEquals(-3, rounding.round(6));
   assertEquals(7, rounding.nextRoundingValue(-3));
   assertEquals(0, rounding.roundKey(7));
   assertEquals(7, rounding.round(7));
   assertEquals(17, rounding.nextRoundingValue(7));
   assertEquals(0, rounding.roundKey(16));
   assertEquals(7, rounding.round(16));
   assertEquals(1, rounding.roundKey(17));
   assertEquals(17, rounding.round(17));
   assertEquals(27, rounding.nextRoundingValue(17));
 }