@Test
 public void shouldBeAbleToAdvanceClockTimeOnEachQuery() throws Exception {
   Date startOfTheCentury = ymdDateFormat.parse("2000-01-01");
   new DateAlteringClock(startOfTheCentury).advanceMillisOnEachQuery();
   assertThat(Clock.currentTimeInMillis(), is(startOfTheCentury.getTime() + 1));
   assertThat(Clock.currentTimeInMillis(), is(startOfTheCentury.getTime() + 2));
   assertThat(Clock.currentTimeInMillis(), is(startOfTheCentury.getTime() + 3));
 }
 @Test
 public void currentClockTimeInMillisShouldTickOnFromZero() throws Exception {
   Date endOfTheDecade = ymdDateFormat.parse("2010-12-31");
   new DateAlteringClock(endOfTheDecade);
   long before = 0, after = 0;
   while (after == before) {
     after = Clock.currentTimeInMillis();
     if (before == 0) {
       before = after;
     }
   }
   assertTrue(Clock.currentTimeInMillis() - endOfTheDecade.getTime() < 1000);
 }
 @Test
 public void shouldBeAbleToFreezeClockTime() throws Exception {
   SystemClock systemClock = new SystemClock();
   long before = 0, after = 0;
   new DateAlteringClock(systemClock.currentClockDate()).freeze();
   long frozenTime = Clock.currentTimeInMillis();
   while (after == before) {
     after = systemClock.currentClockTimeInMillis();
     if (before == 0) {
       before = after;
     }
   }
   assertThat(Clock.currentTimeInMillis(), is(frozenTime));
 }
 @Test
 public void testPutReturnValue() {
   cache.put(1, "apple");
   assertNotNull(cache.put(1, "banana"));
   Clock.setTime(3000);
   assertNull(cache.put(1, "mango"));
 }
 @Test
 public void testSize() throws Exception {
   assertEquals(0, cache.size());
   cache.put(1, "apple");
   assertEquals(1, cache.size());
   Clock.setTime(3000);
   assertEquals(0, cache.size());
 }
  @Test
  public void testExpiry() throws Exception {

    cache.put(1, "apple");
    assertEquals("apple", cache.get(1));
    assertFalse(cache.isEmpty());
    Clock.setTime(3000);
    assertNull(cache.get(1));
    assertTrue(cache.isEmpty());
  }
  @Test
  public void testPartialExpiry() throws Exception {
    // Add an apple, it will expire at 2000
    // System.out.println(cache.getTimeToLive());
    cache.put(1, "apple");
    Clock.setTime(1500);
    // System.out.println(cache.getTimeToLive());
    // Add an orange, it will expire at 2500
    cache.put(2, "orange");

    assertEquals("apple", cache.get(1));
    assertEquals("orange", cache.get(2));
    assertEquals(2, cache.size());

    // Set time to 2300 and check that only the apple has disappeared
    Clock.setTime(2300);

    assertNull(cache.get(1));
    assertEquals("orange", cache.get(2));
    assertEquals(1, cache.size());
  }
  @Test
  public void testContainsKeyAndContainsValue() {
    assertFalse(cache.containsKey(1));
    assertFalse(cache.containsValue("apple"));
    assertFalse(cache.containsKey(2));
    assertFalse(cache.containsValue("orange"));

    cache.put(1, "apple");
    assertTrue(cache.containsKey(1));
    assertTrue(cache.containsValue("apple"));
    assertFalse(cache.containsKey(2));
    assertFalse(cache.containsValue("orange"));

    Clock.setTime(3000);
    assertFalse(cache.containsKey(1));
    assertFalse(cache.containsValue("apple"));
    assertFalse(cache.containsKey(2));
    assertFalse(cache.containsValue("orange"));
  }
 @Test
 public void shouldBeAbleToDefineElapsedTime() throws Exception {
   Date startOfTheCentury = ymdDateFormat.parse("2000-01-01");
   new DateAlteringClock(startOfTheCentury).freeze().elapse(39);
   assertThat(Clock.currentTimeInMillis(), is(startOfTheCentury.getTime() + 39));
 }
 @Test
 public void currentClockTimeInMillisShouldBeRebasedToConstructorArg() throws Exception {
   Date startOfTheDecade = ymdDateFormat.parse("2010-01-01");
   new DateAlteringClock(startOfTheDecade);
   assertThat(ymdDateFormat.format(new Date(Clock.currentTimeInMillis())), is("2010-01-01"));
 }
 @After
 public void restoreDefaultClock() {
   Clock.restoreDefaultClock();
 }
 @Before
 public void setUp() throws Exception {
   Clock.setTime(1000);
   cache = new CacheMapImpl<>();
   cache.setTimeToLive(TIME_TO_LIVE);
 }