package agilpizza.modelo;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;

import java.util.ArrayList;
import java.util.List;

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

public class PizzaMontadaTest {

	private PizzaMontada pizza;
	private Ingrediente queijo;
	private Ingrediente tomate;

	@Before
	public void setUp() {
		pizza = new PizzaMontada();
		queijo = new Ingrediente("Queijo");
		tomate = new Ingrediente("Tomate");
	}

	@Test
	public void testaNovaPizzaVazia() {
		List<Ingrediente> ingredientes = pizza.getIngredientes();
		assertNotNull(ingredientes);
		assertTrue(ingredientes.isEmpty());
	}

	@Test
	public void testaAdicionaIngrediente() {
		pizza.adicionaIngrediente(queijo);
		List<Ingrediente> ingredientes = pizza.getIngredientes();
		assertNotNull(ingredientes);
		assertTrue(ingredientes.contains(queijo));
	}

	@Test
	public void testaAdicionaIngredientes() {
		List<Ingrediente> ingredientesEsperados = new ArrayList<Ingrediente>();
		ingredientesEsperados.add(queijo);
		ingredientesEsperados.add(tomate);

		pizza.adicionaIngredientes(ingredientesEsperados);

		List<Ingrediente> ingredientes = pizza.getIngredientes();
		assertNotNull(ingredientes);
		assertTrue(ingredientes.containsAll(ingredientesEsperados));
	}

	@Test
	public void testaNaoPodeAlterarListaDeIngredientes() {
		pizza.adicionaIngrediente(queijo);

		List<Ingrediente> ingredientes = pizza.getIngredientes();
		assertNotNull(ingredientes);
		try {
			ingredientes.add(queijo);
			fail("Não deve adicionar ingrediente na lista");
		} catch (UnsupportedOperationException e) {
			// Tudo bem
		}
	}

	@Test
	public void testaRemoveIngrediente() {
		pizza.adicionaIngrediente(queijo);

		pizza.removeIngrediente(queijo);
		List<Ingrediente> ingredientes = pizza.getIngredientes();
		assertNotNull(ingredientes);
		assertFalse(ingredientes.contains(queijo));
	}

	@Test
	public void testaRemoveIngredienteInexistente() {
		pizza.adicionaIngrediente(queijo);

		pizza.removeIngrediente(tomate);
		List<Ingrediente> ingredientes = pizza.getIngredientes();
		assertTrue(ingredientes.contains(queijo));
	}

	@Test
	public void testaRemoveIngredientes() {
		List<Ingrediente> ingredientes = new ArrayList<Ingrediente>();
		ingredientes.add(queijo);
		ingredientes.add(tomate);
		pizza.adicionaIngredientes(ingredientes);

		pizza.removeIngredientes(ingredientes);

		List<Ingrediente> ingredientesDaPizza = pizza.getIngredientes();
		assertNotNull(ingredientesDaPizza);
		assertFalse(ingredientesDaPizza.contains(queijo));
		assertFalse(ingredientesDaPizza.contains(tomate));
	}
}
