ProductItems { public static Function<ProductItem, ProductItemPrice> price() { return new Function<ProductItem, ProductItemPrice>() { @Override public ProductItemPrice apply(ProductItem productItem) { if (productItem.getPrices().size() < 1) throw new NoSuchElementException("ProductItem has no prices:" + productItem); return Iterables.get(productItem.getPrices(), 0); } }; }  static Function<ProductItem, Float> capacity(); static Function<ProductItem, String> description(); static Function<ProductItem, ProductItemPrice> price(); static Function<ProductItemPrice, ProductItem> item();  }
@Test public void testPrice() { assertEquals(price().apply(item),price); }
@Test public void testPriceMultiplePrices() { ImmutableSet<ProductItemPrice> prices = ImmutableSet.of(price, ProductItemPrice.builder().id(2).build()); ProductItem item2 = ProductItem.builder().prices(prices).build(); assertEquals(price().apply(item2),price); }
@Test(expectedExceptions = NoSuchElementException.class) public void testPriceMissing() { ProductItem noPriceItem = ProductItem.builder().id(1).build(); price().apply(noPriceItem); }