package com.levelup.java.util.stream;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;

import org.junit.Before;
import org.junit.Test;

import com.google.common.base.Objects;

/**
 * This java example will demonstrate java.util.stream common find and match
 * methods.
 * 
 * @author Justin Musgrove
 * @see <a href='http://www.leveluplunch.com//'></a>
 */
public class StreamFindAndMatch {

	class HiddenObjectGame {

		String name = null;
		double rating;
		double totalPlays;
		LocalDate releaseDate;

		public HiddenObjectGame(String name, double rating, double totalPlays,
				LocalDate releaseDate) {
			super();
			this.name = name;
			this.rating = rating;
			this.totalPlays = totalPlays;
			this.releaseDate = releaseDate;
		}

		public String getName() {
			return name;
		}

		public double getRating() {
			return rating;
		}

		public double getTotalPlays() {
			return totalPlays;
		}

		public LocalDate getReleaseDate() {
			return releaseDate;
		}

		@Override
		public String toString() {

			return Objects.toStringHelper(this).add("name", name)
					.add("rating", rating).add("totalPlays", totalPlays)
					.add("releaseDate", releaseDate).toString();
		}

	}

	List<HiddenObjectGame> games;

	@Before
	public void setUp() {

		games = new ArrayList<>();

		games.add(new HiddenObjectGame("The Daily SNOOP", 4.65, 22207,
				LocalDate.of(2011, Month.MARCH, 15)));
		games.add(new HiddenObjectGame("Gardenscapes", 4.43, 1670, LocalDate
				.of(2009, Month.DECEMBER, 29)));
		games.add(new HiddenObjectGame("Barn Yarn", 4.55, 1453, LocalDate.of(
				2013, Month.JUNE, 18)));
		games.add(new HiddenObjectGame("The Treasures of Mystery Island", 4.09,
				594, LocalDate.of(2009, Month.JUNE, 29)));
		games.add(new HiddenObjectGame("Paparazzi", 3.74, 391, LocalDate.of(
				2006, Month.OCTOBER, 10)));
	}

	@Test
	public void stream_allMatch() {

		boolean containVowel = games.stream().allMatch(
				game -> game.getName().contains("a"));

		assertTrue(containVowel);

	}

	@Test
	public void stream_anyMatch() {

		boolean playsGt1000 = games.stream().anyMatch(
				game -> game.getTotalPlays() > 1000);

		assertTrue(playsGt1000);
	}

	@Test
	public void stream_noneMatch() {

		Predicate<HiddenObjectGame> playsGt1000 = p -> p.getTotalPlays() > 1000;
		Predicate<HiddenObjectGame> ratingGt5 = p -> p.getRating() > 5;

		boolean noneMatch = games.stream()
				.noneMatch(ratingGt5.and(playsGt1000));

		assertTrue(noneMatch);
	}

	@Test
	public void stream_findFirst() {

		Optional<HiddenObjectGame> firstHiddenGame = games.stream().findFirst();

		assertTrue(firstHiddenGame.isPresent());
		assertEquals("The Daily SNOOP", firstHiddenGame.get().getName());
	}

	@Test
	public void stream_findAny() {

		Predicate<HiddenObjectGame> releaseDateInApril = p -> Month.APRIL == p
				.getReleaseDate().getMonth();

		Optional<HiddenObjectGame> hiddenGameReleaseInApril = games.stream()
				.filter(releaseDateInApril).findAny();
		
		assertFalse(hiddenGameReleaseInApril.isPresent());
	}

}

@@ -595,11 +595,81 @@
 com/
-/'%3E
+java/examples/java-util-stream-find-match-example/'%3EStream find and match
 %3C/a%3E

fix url