@Test
  public void deveInformarSeEhPossivelReservarAQuantidadeDeIngressosDentroDeQualquerDasSessoes() {
    Espetaculo ivete = new Espetaculo();

    ivete.getSessoes().add(sessaoComIngressosSobrando(1));
    ivete.getSessoes().add(sessaoComIngressosSobrando(3));
    ivete.getSessoes().add(sessaoComIngressosSobrando(2));

    assertTrue(ivete.Vagas(5));
  }
  @Test
  public void
      DeveInformarSeNaoEhPossivelReservarAQuantidadeDeIngressosDentroDeQualquerDasSessoesComUmMinimoPorSessao() {
    Espetaculo ivete = new Espetaculo();

    ivete.getSessoes().add(sessaoComIngressosSobrando(2));
    ivete.getSessoes().add(sessaoComIngressosSobrando(2));
    ivete.getSessoes().add(sessaoComIngressosSobrando(2));

    assertFalse(ivete.Vagas(5, 3));
  }
  @Test
  public void naoDeveCriarSessaoParaEspetaculoComDataInicioMaiorQueFimSemanal() {
    LocalDate inicio = new LocalDate();
    LocalDate fim = new LocalDate().minusDays(20);
    LocalTime hora = new LocalTime();
    Periodicidade semanal = Periodicidade.SEMANAL;

    Espetaculo show = new Espetaculo();
    List<Sessao> sessoes = show.criaSessoes(inicio, fim, hora, semanal);

    Assert.assertEquals(0, sessoes.size());
  }
  @Test
  public void naoDeveCriarSessaoParaEspetaculoComDataInicioMaiorQueFimDiario() {
    LocalDate inicio = new LocalDate();
    LocalDate fim = new LocalDate().minusDays(5);
    LocalTime hora = new LocalTime();
    Periodicidade diaria = Periodicidade.DIARIA;

    Espetaculo show = new Espetaculo();
    List<Sessao> sessoes = show.criaSessoes(inicio, fim, hora, diaria);

    Assert.assertEquals(0, sessoes.size());
  }
  @Test
  public void deveCriarSessoesDiariasComExemploEnunciado() {
    Espetaculo espetaculo = new Espetaculo();

    LocalDate inicio = new LocalDate(2010, 1, 1);
    LocalDate fim = new LocalDate(2010, 1, 3);
    LocalTime horario = new LocalTime(17);
    Periodicidade periodicidade = Periodicidade.DIARIA;

    List<Sessao> sessoes = espetaculo.criaSessoes(inicio, fim, horario, periodicidade);

    Assert.assertEquals(3, sessoes.size());
  }
  @Test
  public void deveCriarSessoesSemanais() {
    Espetaculo espetaculo = new Espetaculo();

    LocalDate inicio = new LocalDate(2015, 1, 9);
    LocalDate fim = new LocalDate(2015, 1, 23);
    LocalTime horario = new LocalTime(17);
    Periodicidade periodicidade = Periodicidade.SEMANAL;

    List<Sessao> sessoes = espetaculo.criaSessoes(inicio, fim, horario, periodicidade);

    Assert.assertEquals(3, sessoes.size());
  }
  @Test
  public void deveCriar1SessaoParaEspetaculoComDatasIguaisEPeriodicidadeSemanal() {
    LocalDate inicio = new LocalDate();
    LocalDate fim = new LocalDate();
    LocalTime hora = new LocalTime();
    Periodicidade semanal = Periodicidade.SEMANAL;

    Espetaculo show = new Espetaculo();
    List<Sessao> sessoes = show.criaSessoes(inicio, fim, hora, semanal);

    Assert.assertEquals(1, sessoes.size());
    Assert.assertEquals(sessoes.get(0).getEspetaculo(), show);
    Assert.assertEquals(sessoes.get(0).getInicio(), inicio.toDateTime(hora));
  }
  @Post("/espetaculos")
  public void adiciona(Espetaculo espetaculo) {
    // aqui eh onde fazemos as varias validacoes
    // se nao tiver nome, avisa o usuario
    // se nao tiver descricao, avisa o usuario
    if (Strings.isNullOrEmpty(espetaculo.getNome())) {
      validator.add(new SimpleMessage("", "Nome do espetáculo não pode estar em branco"));
    }
    if (Strings.isNullOrEmpty(espetaculo.getDescricao())) {
      validator.add(new SimpleMessage("", "Descrição do espetáculo não pode estar em branco"));
    }
    validator.onErrorRedirectTo(this).lista();

    agenda.cadastra(espetaculo);
    result.redirectTo(this).lista();
  }
  @Test
  public void deveCriarSessaoParaEspetaculoComDatasDiferentessEPeriodicidadeSemanal() {
    LocalDate inicio = new LocalDate();
    LocalDate fim = inicio.plusDays(10);
    LocalTime hora = new LocalTime();
    Periodicidade semanal = Periodicidade.SEMANAL;

    Espetaculo show = new Espetaculo();
    List<Sessao> sessoes = show.criaSessoes(inicio, fim, hora, semanal);

    Assert.assertEquals(2, sessoes.size());
    Assert.assertEquals(sessoes.get(0).getEspetaculo(), show);

    for (int i = 0; i < sessoes.size(); i++) {
      Assert.assertEquals(sessoes.get(i).getInicio(), inicio.plusWeeks(i).toDateTime(hora));
    }
  }
  @Post("/espetaculo/{espetaculoId}/sessoes")
  public void cadastraSessoes(
      Long espetaculoId,
      LocalDate inicio,
      LocalDate fim,
      LocalTime horario,
      Periodicidade periodicidade) {
    Espetaculo espetaculo = carregaEspetaculo(espetaculoId);

    // aqui faz a magica!
    // cria sessoes baseado no periodo de inicio e fim passados pelo usuario
    List<Sessao> sessoes = espetaculo.criaSessoes(inicio, fim, horario, periodicidade);

    agenda.agende(sessoes);

    result.include("message", sessoes.size() + " sessões criadas com sucesso");
    result.redirectTo(this).lista();
  }