/**
   * check that the cache is immutable by changing the data passed in the constructor and returned
   * from methods.
   *
   * @throws TimeStampedCacheException
   */
  @Test
  public void testImmutable() throws TimeStampedCacheException {
    // setup
    List<AbsoluteDate> actuals;
    List<AbsoluteDate> expecteds = new ArrayList<AbsoluteDate>(data);
    AbsoluteDate different = date.shiftedBy(-50);

    // actions + verify

    // check constructor
    data.set(0, different);
    Assert.assertArrayEquals(cache.getAll().toArray(), expecteds.toArray());

    // check getAll
    actuals = cache.getAll();
    try {
      actuals.set(0, different);
    } catch (UnsupportedOperationException e) {
      // exception ok
    }
    Assert.assertArrayEquals(cache.getAll().toArray(), expecteds.toArray());

    // check getNeighbors
    actuals = cache.getNeighbors(date);
    try {
      actuals.set(0, different);
    } catch (UnsupportedOperationException e) {
      // exception ok
    }
    Assert.assertArrayEquals(cache.getAll().toArray(), expecteds.toArray());
  }
  /** check {@link ImmutableTimeStampedCache#emptyCache()}. */
  @Test
  public void testEmptyCache() {
    // setup
    cache = ImmutableTimeStampedCache.emptyCache();

    // actions + verify
    try {
      cache.getNeighbors(date);
      Assert.fail("Expected Exception");
    } catch (TimeStampedCacheException e) {
      // expected
    }
    try {
      cache.getEarliest();
      Assert.fail("Expected Exception");
    } catch (IllegalStateException e) {
      // expected
    }
    try {
      cache.getLatest();
      Assert.fail("Expected Exception");
    } catch (IllegalStateException e) {
      // expected
    }
    Assert.assertEquals(cache.getAll().size(), 0);
    Assert.assertEquals(cache.getNeighborsSize(), 0);
  }
  /**
   * check {@link ImmutableTimeStampedCache#getNeighbors(AbsoluteDate)} at a series of different
   * dates designed to test all logic paths.
   *
   * @throws TimeStampedCacheException
   */
  @Test
  public void testGetNeighbors() throws TimeStampedCacheException {
    // setup
    int size = data.size();

    // actions + verify

    // before fist data
    try {
      cache.getNeighbors(data.get(0).shiftedBy(-1));
      Assert.fail("Expected Exception");
    } catch (TimeStampedCacheException e) {
      // expected
    }

    // on fist date
    Assert.assertArrayEquals(
        cache.getNeighbors(data.get(0)).toArray(), data.subList(0, 3).toArray());
    // between fist and second date
    Assert.assertArrayEquals(
        cache.getNeighbors(data.get(0).shiftedBy(0.5)).toArray(), data.subList(0, 3).toArray());
    // in the middle on a date
    Assert.assertArrayEquals(
        cache.getNeighbors(data.get(2)).toArray(), data.subList(1, 4).toArray());
    // in the middle between dates
    Assert.assertArrayEquals(
        cache.getNeighbors(data.get(2).shiftedBy(0.5)).toArray(), data.subList(1, 4).toArray());
    // just before last date
    Assert.assertArrayEquals(
        cache.getNeighbors(data.get(size - 1).shiftedBy(-0.5)).toArray(),
        data.subList(size - 3, size).toArray());
    // on last date
    Assert.assertArrayEquals(
        cache.getNeighbors(data.get(size - 1)).toArray(), data.subList(size - 3, size).toArray());

    // after last date
    try {
      cache.getNeighbors(data.get(size - 1).shiftedBy(1));
      Assert.fail("Expected Exception");
    } catch (TimeStampedCacheException e) {
      // expected
    }
  }
 /** check {@link ImmutableTimeStampedCache#getAll()} */
 @Test
 public void testGetAll() {
   Assert.assertArrayEquals(cache.getAll().toArray(), data.toArray());
 }
 /** check {@link ImmutableTimeStampedCache#getLatest()} */
 @Test
 public void testGetLatest() {
   Assert.assertEquals(cache.getLatest(), data.get(data.size() - 1));
 }
 /** check {@link ImmutableTimeStampedCache#getEarliest()} */
 @Test
 public void testGetEarliest() {
   Assert.assertEquals(cache.getEarliest(), data.get(0));
 }
 /** check {@link ImmutableTimeStampedCache#getNeighborsSize()} */
 @Test
 public void testGetNeighborsSize() {
   Assert.assertEquals(cache.getNeighborsSize(), 3);
 }