@Test public void deveVender1ingressoSeHa2vagas() throws Exception { Sessao sessao = new Sessao(); sessao.setTotalIngressos(2); Assert.assertTrue(sessao.podeReservar(1)); }
@Post @Path("/sessao/{sessaoId}/reserva") public void reserva(Long sessaoId, final Integer quantidade) { Sessao sessao = agenda.sessao(sessaoId); if (sessao == null) { result.notFound(); return; } if (quantidade < 1) { validator.add(new SimpleMessage("", "Você deve escolher um lugar ou mais")); } if (!sessao.podeReservar(quantidade)) { validator.add(new SimpleMessage("", "Não existem ingressos disponíveis")); } // em caso de erro, redireciona para a lista de sessao validator.onErrorRedirectTo(this).sessao(sessao.getId()); BigDecimal precoTotal = CalculadoraDePrecos.calcula(sessao, quantidade); sessao.reserva(quantidade); result.include("message", "Sessão reservada com sucesso por " + CURRENCY.format(precoTotal)); result.redirectTo(IndexController.class).index(); }
@Test public void naoDeveVender3ingressoSeHa2vagas() throws Exception { Sessao sessao = new Sessao(); sessao.setTotalIngressos(2); Assert.assertFalse(sessao.podeReservar(3)); }
@Test public void reservarTodososIngressosDeveFuncionar() { Sessao sessao = new Sessao(); sessao.setTotalIngressos(3); Assert.assertTrue(sessao.podeReservar(3)); }
private Sessao sessaoComIngressosSobrando(int quantidade) { Sessao sessao = new Sessao(); sessao.setTotalIngressos(quantidade * 2); sessao.setIngressosReservados(quantidade); return sessao; }
@Test public void reservarTodosOsIngressoQueEstaoDisponiveis() throws Exception { Sessao sessao = new Sessao(); sessao.setTotalIngressos(5); sessao.reserva(5); Assert.assertEquals(0, sessao.getIngressosDisponiveis().intValue()); }
@Test public void reservarIngressosDeveDiminuirONumeroDeIngressosDisponiveis() throws Exception { Sessao sessao = new Sessao(); sessao.setTotalIngressos(5); sessao.reserva(3); Assert.assertEquals(2, sessao.getIngressosDisponiveis().intValue()); }
/** * Esse metodo eh responsavel por criar sessoes para o respectivo espetaculo, dado o intervalo de * inicio e fim, mais a periodicidade. * * <p>O algoritmo funciona da seguinte forma: - Caso a data de inicio seja 01/01/2010, a data de * fim seja 03/01/2010, e a periodicidade seja DIARIA, o algoritmo cria 3 sessoes, uma para cada * dia: 01/01, 02/01 e 03/01. * * <p>- Caso a data de inicio seja 01/01/2010, a data fim seja 31/01/2010, e a periodicidade seja * SEMANAL, o algoritmo cria 5 sessoes, uma a cada 7 dias: 01/01, 08/01, 15/01, 22/01 e 29/01. * * <p>Repare que a data da primeira sessao é sempre a data inicial. */ public List<Sessao> criaSessoes( LocalDate inicio, LocalDate fim, LocalTime horario, Periodicidade periodicidade) { Sessao sessao = new Sessao(); sessao.setInicio(inicio.toDateTime(horario)); sessoes.add(sessao); return sessoes; }
public boolean Vagas(int qtd) { // ALUNO: Não apague esse metodo. Esse sim será usado no futuro! ;) int totDisp = 0; for (Sessao s : sessoes) { totDisp += s.getIngressosDisponiveis(); } if (totDisp >= qtd) return true; else return false; }
@Test public void verificaPromocaoFuturaInvalida() { Sessao sessao = new Sessao(); sessao.setInicio(new DateTime()); Promocao promocao = new Promocao(); promocao.setInicio(new DateTime().plusMinutes(1)); promocao.setFim(new DateTime().plusHours(1)); Util util = new Util(); Assert.assertFalse(sessao.dentroDoIntervalo(promocao)); }
public static BigDecimal calcula(Sessao sessao, Integer quantidade) { BigDecimal preco; Integer totalIngressos = sessao.getTotalIngressos(); Integer ingressosReservados = sessao.getIngressosReservados(); TipoDeEspetaculo tipoEspetaculo = sessao.getEspetaculo().getTipo(); BigDecimal precoSessao = sessao.getPreco(); preco = precoSessao; int diffIngressos = totalIngressos - ingressosReservados; switch (tipoEspetaculo) { case CINEMA: if (diffIngressos / totalIngressos.doubleValue() <= 0.05) { preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.10))); } break; case SHOW: // quando estiver acabando os ingressos... if (diffIngressos / totalIngressos.doubleValue() <= 0.05) { preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.10))); } break; case BALLET: if (diffIngressos / totalIngressos.doubleValue() <= 0.50) { preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.20))); } if (sessao.getDuracaoEmMinutos() > 60) { preco = preco.add(precoSessao.multiply(BigDecimal.valueOf(0.10))); } break; case ORQUESTRA: if (diffIngressos / totalIngressos.doubleValue() <= 0.50) { preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.20))); } if (sessao.getDuracaoEmMinutos() > 60) { preco = preco.add(precoSessao.multiply(BigDecimal.valueOf(0.10))); } break; default: // nao aplica aumento para teatro (quem vai é pobretão) preco = precoSessao; break; } return preco.multiply(BigDecimal.valueOf(quantidade)); }
@Test public void deveVender1ingressoSeHa1vaga() throws Exception { sessao.setTotalIngressos(1); Assert.assertTrue(sessao.podeReservar(1)); }
public static BigDecimal calcula(Sessao sessao, Integer quantidade) { BigDecimal preco = sessao.getPreco(); if (sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.CINEMA) || sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.SHOW)) { if (Sessao.calculaFatorDisponivelSobreTotal(sessao) <= 0.05) { double fatorReajuste = 0.10; preco = Sessao.reajustarSessao(sessao, fatorReajuste); } } else if (sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.BALLET) || sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.ORQUESTRA)) { if (Sessao.calculaFatorDisponivelSobreTotal(sessao) <= 0.50) { double fatorReajuste = 0.20; preco = Sessao.reajustarSessao(sessao, fatorReajuste); } if (sessao.getDuracaoEmMinutos() > UMA_HORA) { double fatorReajuste = 0.10; preco = preco.add(sessao.getPreco().multiply(BigDecimal.valueOf(fatorReajuste))); } } return preco.multiply(BigDecimal.valueOf(quantidade)); }