From c5eab2c1c42f7477f306c3c630706f3bcf0443af Mon Sep 17 00:00:00 2001 From: Eriksen Costa Paixão Date: Tue, 23 Mar 2010 22:40:40 +0000 Subject: [PATCH] Atualizado service {{{Avaliacao_Service_Boletim}}} para suportar pareceres descritivos. Refactoring nos casos de testes para torná-los mais simples e configuráveis para diferentes cenários --- ieducar/lib/App/Model/Matricula.php | 4 +++- ieducar/modules/Avaliacao/Model/ParecerDescritivoAbstract.php | 10 ++++++++++ ieducar/modules/Avaliacao/Service/Boletim.php | 740 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------ ieducar/modules/Avaliacao/Views/BoletimController.php | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- ieducar/modules/Avaliacao/Views/NotaController.php | 26 +++++++++++++++++++++++--- ieducar/modules/Avaliacao/Views/ParecerController.php | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Boletim/Common.php | 387 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php | 1192 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaGeralTest.php | 414 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ieducar/modules/Avaliacao/_tests/Service/AllTests.php | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaAlunoTest.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaCommon.php | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteSituacaoTest.php | 515 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteTest.php | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaGeralSituacaoTest.php | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaGeralTest.php | 269 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/FaltaSituacaoCommon.php | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/InicializacaoTest.php | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/NotaAlunoTest.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/NotaConceitualSituacaoTest.php | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/NotaNumericaSituacaoTest.php | 47 +++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/NotaRecuperacaoTest.php | 250 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/NotaSituacaoCommon.php | 436 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/NotaTest.php | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoAlunoTest.php | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoCommon.php | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteAnualTest.php | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteEtapaTest.php | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralAnualTest.php | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralEtapaTest.php | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/PromocaoAlunoTest.php | 531 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/SituacaoTest.php | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/TestCommon.php | 951 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 34 files changed, 6639 insertions(+), 2074 deletions(-) create mode 100644 ieducar/modules/Avaliacao/Views/ParecerController.php delete mode 100644 ieducar/modules/Avaliacao/_tests/Boletim/Common.php delete mode 100644 ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php delete mode 100644 ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaGeralTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/AllTests.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaAlunoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaCommon.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteSituacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaGeralSituacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaGeralTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/FaltaSituacaoCommon.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/InicializacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/NotaAlunoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/NotaConceitualSituacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/NotaNumericaSituacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/NotaRecuperacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/NotaSituacaoCommon.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/NotaTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoAlunoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoCommon.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteAnualTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteEtapaTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralAnualTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralEtapaTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/PromocaoAlunoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/SituacaoTest.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/TestCommon.php create mode 100644 ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php diff --git a/ieducar/lib/App/Model/Matricula.php b/ieducar/lib/App/Model/Matricula.php index 58a9d8a..fdc782d 100644 --- a/ieducar/lib/App/Model/Matricula.php +++ b/ieducar/lib/App/Model/Matricula.php @@ -59,7 +59,9 @@ class App_Model_Matricula $instance->cod_matricula = $matricula; $instance->ref_usuario_cad = $usuario; $instance->ref_usuario_exc = $usuario; - $instance->aprovado = ($aprovado == TRUE) ? 1 : 2; + $instance->aprovado = ($aprovado == TRUE) ? + App_Model_MatriculaSituacao::APROVADO : + App_Model_MatriculaSituacao::REPROVADO; return $instance->edita(); } diff --git a/ieducar/modules/Avaliacao/Model/ParecerDescritivoAbstract.php b/ieducar/modules/Avaliacao/Model/ParecerDescritivoAbstract.php index 00247b1..f8fbdfd 100644 --- a/ieducar/modules/Avaliacao/Model/ParecerDescritivoAbstract.php +++ b/ieducar/modules/Avaliacao/Model/ParecerDescritivoAbstract.php @@ -72,4 +72,14 @@ abstract class Avaliacao_Model_ParecerDescritivoAbstract extends Avaliacao_Model 'parecer' => new CoreExt_Validate_String() ); } + + /** + * Implementa método mágico __toString(). + * @link http://br.php.net/__toString + * @return string + */ + public function __toString() + { + return $this->parecer; + } } \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/Service/Boletim.php b/ieducar/modules/Avaliacao/Service/Boletim.php index 17d0868..283d1dd 100644 --- a/ieducar/modules/Avaliacao/Service/Boletim.php +++ b/ieducar/modules/Avaliacao/Service/Boletim.php @@ -47,6 +47,8 @@ require_once 'App/Model/MatriculaSituacao.php'; * @package Avaliacao * @subpackage Modules * @since Classe disponível desde a versão 1.1.0 + * @todo Substituir todos os usos literais de 'Rc' e 'An' por constantes + * ou por um novo CoreExt_Enum * @version @@package_version@@ */ class Avaliacao_Service_Boletim implements CoreExt_Configurable @@ -89,6 +91,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected $_faltaAlunoDataMapper = NULL; /** + * @var Avaliacao_Model_ParecerDescritivoAlunoDataMapper + */ + protected $_parecerDescritivoAlunoDataMapper = NULL; + + /** * @var Avaliacao_Model_NotaComponenteDataMapper */ protected $_notaComponenteDataMapper = NULL; @@ -104,6 +111,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected $_notaComponenteMediaDataMapper = NULL; /** + * @var Avaliacao_Model_ParecerDescritivoAbstractDataMapper + */ + protected $_parecerDescritivoAbstractDataMapper = NULL; + + /** * Uma instância de Avaliacao_Model_NotaAluno, que é a entrada que contém * o cruzamento de matrícula com as notas do aluno nos diversos componentes * cursados. @@ -122,6 +134,15 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected $_faltaAluno = NULL; /** + * Uma instância de Avaliacao_Model_ParecerDescritivoAluno, que é a entrada + * que contém o cruzamento de matrícula com os pareceres do aluno nos diversos + * componentes cursados ou no geral. + * + * @var Avaliacao_Model_ParecerDescritivoAluno + */ + protected $_parecerDescritivoAluno = NULL; + + /** * Componentes que o aluno cursa, indexado pelo id de * ComponenteCurricular_Model_Componente. * @var array @@ -165,13 +186,49 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected $_faltas = array(); /** + * Pareceres descritivos adicionados no boletim para inclusão ou edição. + * @var array + */ + protected $_pareceres = array(); + + /** + * Pareceres descritivos do aluno nos componentes cursados. + * @var array + */ + protected $_pareceresComponentes = array(); + + /** + * Pareceres descritivos do aluno no geral. + * @var array + */ + protected $_pareceresGerais = array(); + + /** + * Validadores para instâncias de Avaliacao_Model_FaltaAbstract e + * Avaliacao_Model_NotaComponente. + * + * @see Avaliacao_Service_Boletim#_addValidators() + * @var array + */ + protected $_validators = NULL; + + /** + * Validadores para uma instância de Avaliacao_Model_ParecerDescritivoAbstract + * adicionada no boletim. + * + * @see Avaliacao_Service_Boletim#_addParecerValidators() + * @var array + */ + protected $_parecerValidators = NULL; + + /** * Prioridade da situação da matrícula, usado para definir a situação * das notas e faltas. * @var array */ protected $_situacaoPrioridade = array( - App_Model_MatriculaSituacao::EM_EXAME => 1, - App_Model_MatriculaSituacao::EM_ANDAMENTO => 2, + App_Model_MatriculaSituacao::EM_ANDAMENTO => 1, + App_Model_MatriculaSituacao::EM_EXAME => 2, App_Model_MatriculaSituacao::REPROVADO => 3, App_Model_MatriculaSituacao::APROVADO_APOS_EXAME => 4, App_Model_MatriculaSituacao::APROVADO => 5 @@ -193,7 +250,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $this->setOptions($options) ->_setMatriculaInfo() ->_loadNotaComponenteCurricular() - ->_loadFalta(); + ->_loadFalta() + ->_loadParecerDescritivo(); } /** @@ -242,6 +300,16 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable unset($options['FaltaAbstractDataMapper']); } + if (isset($options['ParecerDescritivoAlunoDataMapper'])) { + $this->setParecerDescritivoAlunoDataMapper($options['ParecerDescritivoAlunoDataMapper']); + unset($options['ParecerDescritivoAlunoDataMapper']); + } + + if (isset($options['ParecerDescritivoAbstractDataMapper'])) { + $this->setParecerDescritivoAbstractDataMapper($options['ParecerDescritivoAbstractDataMapper']); + unset($options['ParecerDescritivoAbstractDataMapper']); + } + $defaultOptions = array_keys($this->getOptions()); $passedOptions = array_keys($options); @@ -465,6 +533,70 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Setter. + * @param Avaliacao_Model_ParecerDescritivoAlunoDataMapper $mapper + * @return App_Service_Boletim Provê interface fluída + */ + public function setParecerDescritivoAlunoDataMapper(Avaliacao_Model_ParecerDescritivoAlunoDataMapper $mapper) + { + $this->_parecerDescritivoAlunoDataMapper = $mapper; + return $this; + } + + /** + * Getter. + * @return Avaliacao_Model_ParecerDescritivoAlunoDataMapper + */ + public function getParecerDescritivoAlunoDataMapper() + { + if (is_null($this->_parecerDescritivoAlunoDataMapper)) { + require_once 'Avaliacao/Model/ParecerDescritivoAlunoDataMapper.php'; + $this->setParecerDescritivoAlunoDataMapper(new Avaliacao_Model_ParecerDescritivoAlunoDataMapper()); + } + return $this->_parecerDescritivoAlunoDataMapper; + } + + /** + * Setter. + * @param Avaliacao_Model_ParecerDescritivoAbstractDataMapper $mapper + * @return App_Service_Boletim Provê interface fluída + */ + public function setParecerDescritivoAbstractDataMapper(Avaliacao_Model_ParecerDescritivoAbstractDataMapper $mapper) + { + $this->_parecerDescritivoAbstractDataMapper = $mapper; + return $this; + } + + /** + * Getter. + * @return Avaliacao_Model_ParecerDescritivoAbstractDataMapper + */ + public function getParecerDescritivoAbstractDataMapper() + { + if (is_null($this->_parecerDescritivoAbstractDataMapper)) { + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + + switch($parecerDescritivo) { + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL: + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL: + $filename = 'Avaliacao/Model/ParecerDescritivoGeralDataMapper.php'; + $class = 'Avaliacao_Model_ParecerDescritivoGeralDataMapper'; + break; + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE: + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE: + $filename = 'Avaliacao/Model/ParecerDescritivoComponenteDataMapper.php'; + $class = 'Avaliacao_Model_ParecerDescritivoComponenteDataMapper'; + break; + } + + require_once $filename; + $this->setParecerDescritivoAbstractDataMapper(new $class()); + } + + return $this->_parecerDescritivoAbstractDataMapper; + } + + /** * Retorna as instâncias de Avaliacao_Model_NotaComponente do aluno. * @return array */ @@ -501,6 +633,25 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Retorna as instâncias de Avaliacao_Model_ParecerDescritivoComponente do + * aluno. + * @return array + */ + public function getPareceresComponentes() + { + return $this->_pareceresComponentes; + } + + /** + * Retorna as instâncias de Avaliacao_Model_ParecerDescritivoGeral do aluno. + * @return array + */ + public function getPareceresGerais() + { + return $this->_pareceresGerais; + } + + /** * Retorna uma instância de Avaliacao_Model_NotaComponente. * * @param int $id O identificador de ComponenteCurricular_Model_Componente @@ -557,6 +708,49 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable return NULL; } + /** + * Retorna uma instância de Avaliacao_Model_ParecerDescritivoAbstract. + * + * @param int $etapa A etapa para o qual o parecer foi lançado + * @param int $id O identificador de ComponenteCurricular_Model_Componente + * @return Avaliacao_Model_ParecerAbstract|NULL + */ + public function getParecerDescritivo($etapa = 1, $id = NULL) + { + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + + $gerais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL + ); + + $componentes = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE + ); + + if (in_array($parecerDescritivo, $gerais)) { + $pareceres = $this->getPareceresGerais(); + } + elseif (in_array($parecerDescritivo, $componentes)) { + $pareceres = $this->getPareceresComponentes(); + + if (!isset($pareceres[$id])) { + return NULL; + } + + $pareceres = $pareceres[$id]; + } + + foreach ($pareceres as $parecer) { + if ($parecer->etapa == $etapa) { + return $parecer; + } + } + + return NULL; + } + /** * Setter. @@ -576,6 +770,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable // Valores scalar de referência $matricula = App_Model_IedFinder::getMatricula($codMatricula); + $etapas = App_Model_IedFinder::getQuantidadeDeEtapasMatricula($codMatricula); $this->setOption('matriculaData', $matricula); $this->setOption('aprovado', $matricula['aprovado']); @@ -688,6 +883,55 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Carrega os pareceres do aluno, sejam gerais ou por componentes. + * @return App_Service_Boletim Provê interface fluída + */ + protected function _loadParecerDescritivo() + { + if (!$this->hasParecerDescritivoAluno()) { + $this->_createParecerDescritivoAluno(); + } + + $parecerDescritivoAluno = $this->_getParecerDescritivoAluno(); + + $pareceres = $this->getParecerDescritivoAbstractDataMapper()->findAll( + array(), array('parecerDescritivoAluno' => $parecerDescritivoAluno->id), array('etapa' => 'ASC') + ); + + $gerais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL + ); + + $componentes = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE + ); + + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + if (in_array($parecerDescritivo, $gerais)) { + $pareceresGerais = array(); + + foreach ($pareceres as $parecer) { + $pareceresGerais[$parecer->etapa] = $parecer; + } + + $this->_pareceresGerais = $pareceresGerais; + } + elseif (in_array($parecerDescritivo, $componentes)) { + $pareceresComponentes = array(); + + foreach ($pareceres as $parecer) { + $pareceresComponentes[$parecer->get('componenteCurricular')][] = $parecer; + } + + $this->_pareceresComponentes = $pareceresComponentes; + } + + return $this; + } + + /** * Setter. * @param RegraAvaliacao_Model_Regra $regra * @return App_Service_Boletim Provê interface fluída @@ -811,7 +1055,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $situacao->recuperacao = TRUE; break; case App_Model_MatriculaSituacao::REPROVADO: - $situacao->recuperacao = TRUE; $situacao->aprovado = FALSE; break; } @@ -909,7 +1152,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $this->hasRecuperacao()) { $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::EM_EXAME; } - elseif ($etapa == 'Rc' && $media < $this->getRegra()->media) { + elseif (($etapa == $this->getOption('etapas') || $etapa == 'Rc') && + $media < $this->getRegra()->media) { $situacao->componentesCurriculares[$id]->situacao = App_Model_MatriculaSituacao::REPROVADO; } elseif ($etapa == 'Rc' && $media >= $this->getRegra()->media && $this->hasRecuperacao()) { @@ -1007,6 +1251,9 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable // Faltas $faltasComponentes = array(); + // Etapa padrão + $etapa = 0; + // Faltas lançadas (persistidas) $this->_loadFalta(); @@ -1026,6 +1273,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable elseif ($presenca->tipoFalta == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { $faltas = $this->_faltasComponentes; $total = 0; + $etapasComponentes = array(); $faltasComponentes = array(); foreach ($faltas as $key => $falta) { @@ -1033,11 +1281,14 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $componenteTotal = array_sum(CoreExt_Entity::entityFilterAttr($falta, 'id', 'quantidade')); - // Pega o id de ComponenteCurricular_Model_Componente da primeira etapa do array + // Pega o id de ComponenteCurricular_Model_Componente da última etapa do array $componenteEtapa = array_pop($falta); $id = $componenteEtapa->get('componenteCurricular'); $etapa = $componenteEtapa->etapa; + // Etapas lançadas + $etapasComponentes[$etapa] = $etapa; + // Usa stdClass como interface de acesso $faltasComponentes[$id] = new stdClass(); $faltasComponentes[$id]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; @@ -1064,13 +1315,17 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable App_Model_MatriculaSituacao::APROVADO : App_Model_MatriculaSituacao::REPROVADO; } - if ($this->_situacaoPrioritaria($faltasComponentes[$id]->situacao, $situacaoGeral)) { - $situacaoGeral = $faltasComponentes[$id]->situacao; - } - // Adiciona a quantidade de falta do componente ao total geral de faltas $total += $componenteTotal; } + + if (0 == count($faltasComponentes) || + count($faltasComponentes) != count($this->getComponentes())) { + $etapa = 1; + } + else { + $etapa = min($etapasComponentes); + } } // Total de faltas @@ -1091,7 +1346,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable // Situação geral. Última verificação pois somente ao fim é possível saber // se está em andamento ou se pode estabelecer como aprovado ou reprovado - if ($etapa == $this->getOption('etapas') || $etapa == 'Rc') { + if ($etapa == $this->getOption('etapas') || $etapa === 'Rc') { $aprovado = ($presenca->porcentagemPresenca >= $this->getRegra()->porcentagemPresenca); $presenca->situacao = $aprovado ? App_Model_MatriculaSituacao::APROVADO : @@ -1270,7 +1525,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable protected function _hasFaltaGeral() { $faltasGerais = $this->getFaltasGerais(); - if (!isset($faltasGerais)) { + if (0 == count($faltasGerais)) { return FALSE; } return TRUE; @@ -1334,6 +1589,63 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Verifica se o aluno tem pareceres lançados. + * @return bool + */ + public function hasParecerDescritivoAluno() + { + if (!is_null($this->_getParecerDescritivoAluno())) { + return TRUE; + } + return FALSE; + } + + /** + * Setter. + * @param Avaliacao_Model_ParecerDescritivoAluno $parecerDescritivoAluno + * @return Avaliacao_Service_Boletim Provê interface fluída + */ + protected function _setParecerDescritivoAluno(Avaliacao_Model_ParecerDescritivoAluno $parecerDescritivoAluno) + { + $this->_parecerDescritivoAluno = $parecerDescritivoAluno; + return $this; + } + + /** + * Getter. + * @return Avaliacao_Model_ParecerDescritivoAluno|NULL + */ + protected function _getParecerDescritivoAluno() + { + if (!is_null($this->_parecerDescritivoAluno)) { + return $this->_parecerDescritivoAluno; + } + + $parecerDescritivoAluno = $this->getParecerDescritivoAlunoDataMapper()->findAll( + array(), array('matricula' => $this->getOption('matricula')) + ); + + if (0 == count($parecerDescritivoAluno)) { + return NULL; + } + + $this->_setParecerDescritivoAluno($parecerDescritivoAluno[0]); + return $this->_parecerDescritivoAluno; + } + + /** + * Cria e persiste uma instância de Avaliacao_Model_ParecerDescritivoAluno. + * @return bool + */ + protected function _createParecerDescritivoAluno() + { + $parecerDescritivoAluno = new Avaliacao_Model_ParecerDescritivoAluno(); + $parecerDescritivoAluno->matricula = $this->getOption('matricula'); + $parecerDescritivoAluno->parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + return $this->getParecerDescritivoAlunoDataMapper()->save($parecerDescritivoAluno); + } + + /** * Adiciona um array de instâncias Avaliacao_Model_NotaComponente. * * @param array $notas @@ -1348,6 +1660,79 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Verifica se existe alguma instância de Avaliacao_Model_ParecerDescritivoComponente + * persistida para o aluno. + * + * @param int $id Field identity de ComponenteCurricular_Model_Componente + * @return bool + */ + protected function _hasParecerComponente($id) + { + $pareceresComponentes = $this->getPareceresComponentes(); + if (!isset($pareceresComponentes[$id])) { + return FALSE; + } + return TRUE; + } + + /** + * Verifica se existe alguma instância de Avaliacao_Model_ParecerDescritivoGeral + * persistida para o aluno. + * @return bool + */ + protected function _hasParecerGeral() + { + if (0 == count($this->getPareceresGerais())) { + return FALSE; + } + return TRUE; + } + + /** + * Verifica se existe alguma instância de Avaliacao_Model_ParecerDescritivoAbstract + * persistida em uma determinada etapa e retorna o field identity. + * + * @param Avaliacao_Model_ParecerDescritivoAbstract $instance + * @return int|NULL + */ + protected function _getParecerIdEtapa(Avaliacao_Model_ParecerDescritivoAbstract $instance) + { + $gerais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL + ); + + $componentes = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE + ); + + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + + if (in_array($parecerDescritivo, $gerais)) { + if (!$this->_hasParecerGeral()) { + return NULL; + } + + $pareceres = $this->getPareceresGerais(); + } + elseif (in_array($parecerDescritivo, $componentes)) { + if (!$this->_hasParecerComponente($instance->get('componenteCurricular'))) { + return NULL; + } + + $pareceres = $this->getPareceresComponentes(); + $pareceres = $pareceres[$instance->get('componenteCurricular')]; + } + + foreach ($pareceres as $parecer) { + if ($instance->etapa == $parecer->etapa) { + return $parecer->id; + } + } + } + + /** * Adiciona notas no boletim. * @param Avaliacao_Model_NotaComponente $nota * @return Avaliacao_Service_Boletim Provê interface fluída @@ -1414,19 +1799,65 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Adiciona uma array de instâncias de Avaliacao_Model_ParecerDescritivoAbstract + * no boletim. + * + * @param array $pareceres + * @return Avaliacao_Service_Boletim Provê interface fluída + */ + public function addPareceres(array $pareceres) + { + foreach ($pareceres as $parecer) { + $this->addParecer($parecer); + } + return $this; + } + + /** + * Adiciona uma instância de Avaliacao_Model_ParecerDescritivoAbstract no + * boletim. + * + * @param Avaliacao_Model_ParecerDescritivoAbstract $parecer + * @return Avaliacao_Service_Boletim Provê interface fluída + */ + public function addParecer(Avaliacao_Model_ParecerDescritivoAbstract $parecer) + { + $key = 'p_' . spl_object_hash($parecer); + + $this->_pareceres[$key] = $parecer; + $this->_updateParecerEtapa($parecer); + $this->_addParecerValidators($parecer); + + return $this; + } + + /** + * Getter para as instâncias de Avaliacao_Model_ParecerDescritivoAbstract + * adicionadas no boletim (não persistidas). + * + * @return array + */ + public function getPareceres() + { + return $this->_pareceres; + } + + /** * Atualiza as opções de validação de uma instância de * CoreExt_Validate_Validatable, com os valores permitidos para os atributos * 'componenteCurricular' e 'etapa'. * * @param CoreExt_Validate_Validatable $nota * @return CoreExt_Validate_Validatable + * @todo Substituir variável estática por uma de instância {@see _updateParecerEtapa()} */ protected function _addValidators(CoreExt_Validate_Validatable $validatable) { - static $validators = NULL; + $validators = array(); // Como os componentes serão os mesmos, fazemos cache do validador - if (is_null($validators)) { + if (is_null($this->_validators)) { + $componentes = $this->getComponentes(); $componentes = CoreExt_Entity::entityFilterAttr($componentes, 'id', 'id'); @@ -1442,9 +1873,13 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable $validators['etapa'] = new CoreExt_Validate_Choice( array('choices' => $etapas )); + + $this->_validators = $validators; } - if (!($validatable instanceof Avaliacao_Model_FaltaGeral)) { + $validators = $this->_validators; + + if ($this->getRegra()->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { $validatable->setValidator('componenteCurricular', $validators['componenteCurricular']); } $validatable->setValidator('etapa', $validators['etapa']); @@ -1453,6 +1888,71 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Atualiza as opções de validação de uma instância de + * Avaliacao_Model_ParecerDescritivoAbstract, com os valores permitidos + * para os atributos 'componenteCurricular' e 'etapa'. + * + * @param Avaliacao_Model_ParecerDescritivoAbstract $instance + * @return Avaliacao_Model_ParecerDescritivoAbstract + */ + protected function _addParecerValidators(Avaliacao_Model_ParecerDescritivoAbstract $instance) + { + if (is_null($this->_parecerValidators)) { + $validators = array(); + + $anuais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE + ); + + $etapas = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE + ); + + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + + if (in_array($parecerDescritivo, $anuais)) { + $validators['etapa'] = new CoreExt_Validate_Choice(array( + 'choices' => array('An') + )); + } + elseif (in_array($parecerDescritivo, $etapas)) { + $etapas = $this->getOption('etapas'); + $etapas = array_merge(range(1, $etapas, 1), array('Rc')); + + $validators['etapa'] = new CoreExt_Validate_Choice(array( + 'choices' => $etapas + )); + } + + if ($instance instanceof Avaliacao_Model_ParecerDescritivoComponente) { + $componentes = $this->getComponentes(); + $componentes = CoreExt_Entity::entityFilterAttr($componentes, 'id', 'id'); + + $validators['componenteCurricular'] = new CoreExt_Validate_Choice(array( + 'choices' => $componentes + )); + } + + // Armazena os validadores na instância + $this->_parecerValidators = $validators; + } + + $validators = $this->_parecerValidators; + + // Etapas + $instance->setValidator('etapa', $validators['etapa']); + + // Componentes curriculares + if ($instance instanceof Avaliacao_Model_ParecerDescritivoComponente) { + $instance->setValidator('componenteCurricular', $validators['componenteCurricular']); + } + + return $instance; + } + + /** * Atualiza a etapa de uma instância de Avaliacao_Model_Etapa. * * @param Avaliacao_Model_Etapa $nota @@ -1505,17 +2005,91 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Atualiza a etapa de uma instância de Avaliacao_Model_ParecerDescritivoAbstract + * para a última etapa possível. + * + * @param Avaliacao_Model_ParecerDescritivoAbstract $instance + * @return Avaliacao_Model_ParecerDescritivoAbstract + */ + protected function _updateParecerEtapa(Avaliacao_Model_ParecerDescritivoAbstract $instance) + { + if (!is_null($instance->etapa)) { + return $instance; + } + + $proximaEtapa = 1; + + $anuais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE + ); + + $etapas = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE + ); + + $componentes = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE + ); + + $gerais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL + ); + + $parecerDescritivo = $this->getRegra()->get('parecerDescritivo'); + if (in_array($parecerDescritivo, $anuais)) { + $instance->etapa = 'An'; + return $instance; + } + elseif (in_array($parecerDescritivo, $etapas)) { + $attrValues = array(); + + if (in_array($parecerDescritivo, $gerais)) { + $attrValues = $this->getPareceresGerais(); + } + elseif (in_array($parecerDescritivo, $componentes)) { + $pareceresComponentes = $this->getPareceresComponentes(); + if (isset($pareceresComponentes[$instance->get('componenteCurricular')])) { + $attrValues = $pareceresComponentes[$instance->get('componenteCurricular')]; + } + } + + if (0 < count($attrValues)) { + $etapas = CoreExt_Entity::entityFilterAttr($attrValues, 'id', 'etapa'); + $proximaEtapa = max($etapas) + 1; + } + } + + if ($proximaEtapa <= $this->getOption('etapas')) { + $instance->etapa = $proximaEtapa; + } + elseif ($this->hasRecuperacao()) { + $instance->etapa = 'Rc'; + } + + return $instance; + } + + /** * Arredonda uma nota através da tabela de arredondamento da regra de avaliação. * @param Avaliacao_Model_NotaComponente|int $nota * @return mixed + * @throws CoreExt_Exception_InvalidArgumentException */ public function arredondaNota($nota) { if ($nota instanceof Avaliacao_Model_NotaComponente) { $nota = $nota->nota; } - elseif (!is_numeric($nota)) { - // @todo Exception? + + if (!is_numeric($nota)) { + require_once 'CoreExt/Exception/InvalidArgumentException.php'; + throw new CoreExt_Exception_InvalidArgumentException(sprintf( + 'O parâmetro $nota ("%s") não é um valor numérico.', $nota + )); } return $this->getRegra()->tabelaArredondamento->round($nota); @@ -1532,6 +2106,11 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable { $num1 = floatval($num1); $num2 = floatval($num2); + + if ($num1 == 0) { + return 0; + } + $perc = $num2 / $num1; return ($decimal == TRUE ? $perc : ($perc * 100)); } @@ -1569,6 +2148,7 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable try { $this->saveNotas() ->saveFaltas() + ->savePareceres() ->promover(); } catch (CoreExt_Service_Exception $e) { @@ -1582,7 +2162,6 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable /** * Insere ou atualiza as notas no boletim do aluno. * @return Avaliacao_Service_Boletim Provê interface fluída - * @todo Criar teste para verificar se _getNotaIdEtapa retorna o esperado */ public function saveNotas() { @@ -1602,62 +2181,8 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** - * Atualiza a média dos componentes curriculares. - */ - protected function _updateNotaComponenteMedia() - { - require_once 'Avaliacao/Model/NotaComponenteMedia.php'; - $this->_loadNotaComponenteCurricular(FALSE); - - foreach ($this->_notasComponentes as $id => $notasComponentes) { - // Cria um array onde o índice é a etapa - $etapasNotas = CoreExt_Entity::entityFilterAttr($notasComponentes, 'etapa', 'nota'); - $notas = array('Se' => 0, 'Et' => $this->getOption('etapas')); - - // Cria o array formatado para o cálculo da fórmula da média - foreach ($etapasNotas as $etapa => $nota) { - if (is_numeric($etapa)) { - $notas['E' . $etapa] = $nota; - $notas['Se'] += $nota; - continue; - } - $notas[$etapa] = $nota; - } - - // Calcula a média - $media = $this->_calculaMedia($notas); - - // Cria uma nova instância de média, já com a nota arredondada e a etapa - $notaComponenteCurricularMedia = new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => $this->_getNotaAluno()->id, - 'componenteCurricular' => $id, - 'media' => $media, - 'mediaArredondada' => $this->arredondaNota($media), - 'etapa' => $etapa - )); - - try { - // Se existir, marca como "old" para possibilitar a atualização - $this->getNotaComponenteMediaDataMapper()->find(array( - $notaComponenteCurricularMedia->get('notaAluno'), - $notaComponenteCurricularMedia->get('componenteCurricular'), - )); - - $notaComponenteCurricularMedia->markOld(); - } - catch (Exception $e) { - // Prossegue, sem problemas. - } - - // Salva a média - $this->getNotaComponenteMediaDataMapper()->save($notaComponenteCurricularMedia); - } - } - - /** * Insere ou atualiza as faltas no boletim. * @return Avaliacao_Service_Boletim Provê interface fluída - * @todo Criar teste para verificar se _getFaltaIdEtapa retorna o esperado */ public function saveFaltas() { @@ -1674,6 +2199,24 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Insere ou atualiza os pareceres no boletim. + * @return Avaliacao_Service_Boletim Provê interface fluída + */ + public function savePareceres() + { + $parecerAluno = $this->_getParecerDescritivoAluno(); + $pareceres = $this->getPareceres(); + + foreach ($pareceres as $parecer) { + $parecer->parecerDescritivoAluno = $parecerAluno->id; + $parecer->id = $this->_getParecerIdEtapa($parecer); + $this->getParecerDescritivoAbstractDataMapper()->save($parecer); + } + + return $this; + } + + /** * Promove o aluno de etapa escolar caso esteja aprovado de acordo com o * necessário estabelecido por tipoProgressao de * RegraAvaliacao_Model_Regra. @@ -1729,6 +2272,59 @@ class Avaliacao_Service_Boletim implements CoreExt_Configurable } /** + * Atualiza a média dos componentes curriculares. + */ + protected function _updateNotaComponenteMedia() + { + require_once 'Avaliacao/Model/NotaComponenteMedia.php'; + $this->_loadNotaComponenteCurricular(FALSE); + + foreach ($this->_notasComponentes as $id => $notasComponentes) { + // Cria um array onde o índice é a etapa + $etapasNotas = CoreExt_Entity::entityFilterAttr($notasComponentes, 'etapa', 'nota'); + $notas = array('Se' => 0, 'Et' => $this->getOption('etapas')); + + // Cria o array formatado para o cálculo da fórmula da média + foreach ($etapasNotas as $etapa => $nota) { + if (is_numeric($etapa)) { + $notas['E' . $etapa] = $nota; + $notas['Se'] += $nota; + continue; + } + $notas[$etapa] = $nota; + } + + // Calcula a média + $media = $this->_calculaMedia($notas); + + // Cria uma nova instância de média, já com a nota arredondada e a etapa + $notaComponenteCurricularMedia = new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $this->_getNotaAluno()->id, + 'componenteCurricular' => $id, + 'media' => $media, + 'mediaArredondada' => $this->arredondaNota($media), + 'etapa' => $etapa + )); + + try { + // Se existir, marca como "old" para possibilitar a atualização + $this->getNotaComponenteMediaDataMapper()->find(array( + $notaComponenteCurricularMedia->get('notaAluno'), + $notaComponenteCurricularMedia->get('componenteCurricular'), + )); + + $notaComponenteCurricularMedia->markOld(); + } + catch (Exception $e) { + // Prossegue, sem problemas. + } + + // Salva a média + $this->getNotaComponenteMediaDataMapper()->save($notaComponenteCurricularMedia); + } + } + + /** * Atualiza os dados da matrícula do aluno. * * @param int $matricula diff --git a/ieducar/modules/Avaliacao/Views/BoletimController.php b/ieducar/modules/Avaliacao/Views/BoletimController.php index 5e5155c..ebd636e 100644 --- a/ieducar/modules/Avaliacao/Views/BoletimController.php +++ b/ieducar/modules/Avaliacao/Views/BoletimController.php @@ -81,7 +81,7 @@ class BoletimController extends Core_Controller_Page_ViewController $this->_service = new Avaliacao_Service_Boletim(array( 'matricula' => $this->getRequest()->matricula, - 'usuario' => $usuario + 'usuario' => $usuario )); $this->_situacao = $this->_service->getSituacaoAluno(); @@ -106,6 +106,30 @@ class BoletimController extends Core_Controller_Page_ViewController } /** + * Verifica um array de situações de componentes curriculares e retorna TRUE + * quando ao menos um dos componentes estiver encerrado (aprovado ou reprovado). + * + * @param array $componentes + * @return bool + */ + protected function _componenteEncerrado(array $componentes) + { + foreach ($componentes as $situacao) { + switch ($situacao->situacao) { + case App_Model_MatriculaSituacao::APROVADO: + case App_Model_MatriculaSituacao::APROVADO_APOS_EXAME: + case App_Model_MatriculaSituacao::REPROVADO: + return TRUE; + break; + default: + break; + } + } + + return FALSE; + } + + /** * @see clsCadastro#Gerar() */ public function Gerar() @@ -148,13 +172,13 @@ class BoletimController extends Core_Controller_Page_ViewController $this->addDetalhe(array('Aluno', $nome)); $this->addDetalhe(array('Escola', $escola)); $this->addDetalhe(array('Curso', $curso)); - $this->addDetalhe(array('Série', $serie)); - $this->addDetalhe(array('Turma', $turma)); + $this->addDetalhe(array('Série/Turma', $serie . ' / ' . $turma)); $this->addDetalhe(array('Situação', $situacao)); // Dados da regra de avaliação $this->addDetalhe(array('Regra avaliação', $this->_service->getRegra())); $this->addDetalhe(array('Apuração de falta', $this->_service->getRegra()->tipoPresenca)); + $this->addDetalhe(array('Parecer descritivo', $this->_service->getRegra()->parecerDescritivo)); $this->addDetalhe(array('Progressão', $this->_service->getRegra()->tipoProgressao)); $this->addDetalhe(array('Média', $this->_service->getRegra()->media)); @@ -199,11 +223,32 @@ class BoletimController extends Core_Controller_Page_ViewController $labels[] = $data; } - $colspan = $porComponente && $sit->recuperacao ? 4 : 3; + // Flag para auxiliar na composição da tabela em casos onde o parecer + // descritivo é lançado anualmente e por componente + $parecerComponenteAnual = FALSE; + $colspan = 0; + + if ($this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE) { + if (TRUE == $this->_componenteEncerrado($sit->nota->componentesCurriculares)) { + $parecerComponenteAnual = TRUE; + $colspan++; + } + } + + // Colspan para tabela com labels e sublabels + $colspan += $porComponente && $sit->recuperacao ? 4 : 3; $labels[] = array('data' => $porComponente ? '' : 'Média final', 'attributes' => $attributes, 'colspan' => $porComponente ? $colspan : 1); // Inclui coluna para % de presença geral if (!$porComponente) { + if ($sit->recuperacao) { + $labels[] = array('data' => 'Exame', 'attributes' => $attributes); + } + + if ($parecerComponenteAnual) { + $labels[] = array('data' => 'Parecer', 'attributes' => $attributes); + } + $labels[] = array('data' => 'Presença', 'attributes' => $attributes); $labels[] = array('data' => 'Situação', 'attributes' => $attributes); } @@ -226,6 +271,10 @@ class BoletimController extends Core_Controller_Page_ViewController } if ($porComponente) { + if ($parecerComponenteAnual) { + $subLabels[] = array('data' => 'Parecer', 'attributes' => $attributes); + } + $subLabels[] = array('data' => 'Presença', 'attributes' => $attributes); $subLabels[] = array('data' => 'Situação', 'attributes' => $attributes); } @@ -268,6 +317,13 @@ class BoletimController extends Core_Controller_Page_ViewController $medias = $mediasComponentes[$id]; $faltas = $faltasComponentes[$id]; $faltaStats = $faltasStats->componentesCurriculares[$id]; + $parecer = NULL; + + // Caso os pareceres sejam por componente e anuais, recupera a instância + if ($parecerComponenteAnual) { + $parecer = $this->_service->getPareceresComponentes(); + $parecer = $parecer[$id]; + } if ($porComponente == TRUE) { $new = $url->l('Lançar nota', 'nota', @@ -324,6 +380,7 @@ class BoletimController extends Core_Controller_Page_ViewController } } + // Média no componente curricular $media = $medias[0]->mediaArredondada . ($medias[0]->etapa == 'Rc' ? ' (Rc)' : ''); $data[] = array('data' => $media, 'attributes' => $attributes); @@ -349,6 +406,36 @@ class BoletimController extends Core_Controller_Page_ViewController } } + // Adiciona uma coluna extra caso o parecer seja por componente ao final do ano + if ($parecerComponenteAnual) { + $link = array( + 'text' => '', + 'path' => 'parecer', + 'query' => array('matricula' => $this->getRequest()->matricula) + ); + + if (0 == count($parecer)) { + $text = 'Lançar'; + } + else { + $text = 'Editar'; + } + + $link['query']['componenteCurricular'] = $id; + + // @todo Constante ou CoreExt_Enum + $link['query']['etapa'] = 'An'; + + $link = $url->l($text, $link['path'], array('query' => $link['query'])); + + if (isset($mediaSituacao->situacao) && $mediaSituacao->situacao != App_Model_MatriculaSituacao::EM_ANDAMENTO) { + $data[] = array('data' => $link, 'attributes' => $attributes); + } + else { + $data[] = array('data' => '', 'attributes' => $attributes); + } + } + // Informações extras como porcentagem de presença e situação do aluno if ($porComponente) { $data[] = array('data' => sprintf('%.2f%%', $faltaStats->porcentagemPresenca), 'attributes' => $attributes); @@ -406,21 +493,85 @@ class BoletimController extends Core_Controller_Page_ViewController $data[] = array('data' => '', 'attributes' => $attributes); } + if ($parecerComponenteAnual) { + $data[] = array('data' => '', 'attributes' => $attributes); + } + $data[] = array('data' => sprintf('%.2f%%', $faltasStats->porcentagemPresenca), 'attributes' => $attributes); $data[] = array('data' => $situacao->getValue($sit->falta->situacao), 'attributes' => $attributes); $table->addFooterRow($data, $zebra[$class ^ 1]); + // Adiciona linha com links para lançamento de parecer descritivo geral por etapa + if ($this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL) { + $newLink = array( + 'text' => 'Lançar parecer', + 'path' => 'parecer', + 'query' => array('matricula' => $matricula['cod_matricula']) + ); + + $data = array(0 => array('data' => 'Pareceres', 'attributes' => array('style' => 'padding: 5px; text-align: left'))); + $pareceres = $this->_service->getPareceresGerais(); + + for ($i = 1, $loop = count($etapas); $i <= $loop; $i++) { + if (isset($pareceres[$i])) { + $link = $newLink; + $link['text'] = 'Editar parecer'; + $link['query']['etapa'] = $i; + $data[] = array('data' => $url->l($link['text'], $link['path'], array('query' => $link['query'])), 'attributes' => $attributes); + } + else { + if ('' == $newLink) { + $link = ''; + } + else { + $link = $url->l($newLink['text'], $newLink['path'], array('query' => $newLink['query'])); + } + $data[] = array('data' => $link, 'attributes' => $attributes); + $newLink = ''; + } + } + + if ($sit->recuperacao) { + $data[] = array('data' => '', 'attributes' => $attributes); + } + + $data[] = array('data' => '', 'attributes' => $attributes); + $data[] = array('data' => '', 'attributes' => $attributes); + + $table->addFooterRow($data); + } + // Adiciona tabela na página $this->addDetalhe(array('Disciplinas', '
' . $table . '
')); + // Adiciona link para lançamento de parecer descritivo anual geral + if ( + FALSE == $sit->andamento && + $this->_service->getRegra()->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL + ) { + if (0 == count($this->_service->getPareceresGerais())) { + $label = 'Lançar'; + } + else { + $label = 'Editar'; + } + + $link = array( + 'text' => $label . ' parecer descritivo do aluno', + 'path' => 'parecer', + 'query' => array('matricula' => $this->getRequest()->matricula) + ); + $this->addDetalhe(array('Parecer descritivo anual', $url->l($link['text'], $link['path'], array('query' => $link['query'])))); + } + // Caso o tipo de progressão seja manual, a situação das notas/faltas não // esteja mais em "andamento" e a matrícula esteja em andamento, exibe // botões de ação if ( $this->_service->getRegra()->get('tipoProgressao') == RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL && - FALSE == $sit->andamento && $matricula['aprovado'] == 3 + FALSE == $sit->andamento && $matricula['aprovado'] == App_Model_MatriculaSituacao::EM_ANDAMENTO ) { $link = array( 'text' => 'sim', diff --git a/ieducar/modules/Avaliacao/Views/NotaController.php b/ieducar/modules/Avaliacao/Views/NotaController.php index 360a7b1..341de98 100644 --- a/ieducar/modules/Avaliacao/Views/NotaController.php +++ b/ieducar/modules/Avaliacao/Views/NotaController.php @@ -91,6 +91,11 @@ class NotaController extends Core_Controller_Page_EditController protected $_falta = NULL; /** + * @var Avaliacao_Model_ParecerDescritivoAbstract + */ + protected $_parecer = NULL; + + /** * @see Core_Controller_Page_EditController#_preConstruct() */ protected function _preConstruct() @@ -107,7 +112,7 @@ class NotaController extends Core_Controller_Page_EditController $this->_service = new Avaliacao_Service_Boletim(array( 'matricula' => $this->getRequest()->matricula, - 'usuario' => $usuario + 'usuario' => $usuario )); $this->_regra = $this->_service->getRegra(); @@ -134,8 +139,9 @@ class NotaController extends Core_Controller_Page_EditController */ protected function _initEditar() { - $this->_nota = $this->_service->getNotaComponente($this->_componenteCurricular, $this->_etapa); - $this->_falta = $this->_service->getFalta($this->_componenteCurricular, $this->_etapa); + $this->_nota = $this->_service->getNotaComponente($this->_componenteCurricular, $this->_etapa); + $this->_falta = $this->_service->getFalta($this->_etapa, $this->_componenteCurricular); + $this->_parecer = $this->_service->getParecerDescritivo($this->_etapa, $this->_componenteCurricular); return TRUE; } @@ -177,6 +183,11 @@ class NotaController extends Core_Controller_Page_EditController if ($this->_regra->get('tipoPresenca') == RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE) { $this->campoLista('falta', 'Falta', range(0, 100, 1), $this->_falta->quantidade); } + + // Caso o parecer seja por etapa e por componente + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, TRUE); + } } /** @@ -202,6 +213,15 @@ class NotaController extends Core_Controller_Page_EditController $this->_service->addFalta($falta); } + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE) { + $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => $this->getRequest()->componenteCurricular, + 'parecer' => $this->getRequest()->parecer, + 'etapa' => $this->getRequest()->etapa + )); + $this->_service->addParecer($parecer); + } + try { $this->_service->save(); } diff --git a/ieducar/modules/Avaliacao/Views/ParecerController.php b/ieducar/modules/Avaliacao/Views/ParecerController.php new file mode 100644 index 0000000..f3c48dd --- /dev/null +++ b/ieducar/modules/Avaliacao/Views/ParecerController.php @@ -0,0 +1,205 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Modules + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Core/Controller/Page/EditController.php'; +require_once 'Avaliacao/Model/ParecerDescritivoComponenteDataMapper.php'; +require_once 'Avaliacao/Model/ParecerDescritivoGeralDataMapper.php'; +require_once 'Avaliacao/Service/Boletim.php'; + +/** + * ParecerController class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Modules + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class ParecerController extends Core_Controller_Page_EditController +{ + protected $_dataMapper = 'Avaliacao_Model_ParecerDescritivoGeralDataMapper'; + protected $_titulo = 'Avaliação do aluno | Parecer Descritivo'; + protected $_processoAp = 642; + protected $_nivelAcessoOption = App_Model_NivelAcesso::SOMENTE_ESCOLA; + protected $_saveOption = TRUE; + protected $_deleteOption = FALSE; + + /** + * @var Avaliacao_Service_Boletim + */ + protected $_service = NULL; + + /** + * @var RegraAvaliacao_Model_Regra + */ + protected $_regra = NULL; + + /** + * @var int + */ + protected $_matricula = NULL; + + /** + * @var int + */ + protected $_componenteCurricular = NULL; + + /** + * @var string + */ + protected $_etapa = NULL; + + /** + * @var Avaliacao_Model_ParecerDescritivoAbstract + */ + protected $_parecer = NULL; + + /** + * @see Core_Controller_Page_EditController#_preConstruct() + */ + protected function _preConstruct() + { + // Id do usuário na session + $usuario = $this->getSession()->id_pessoa; + + $this->_options = array( + 'new_success' => 'boletim', + 'new_success_params' => array('matricula' => $this->getRequest()->matricula), + 'edit_success' => 'boletim', + 'edit_success_params' => array('matricula' => $this->getRequest()->matricula), + ); + + $this->_service = new Avaliacao_Service_Boletim(array( + 'matricula' => $this->getRequest()->matricula, + 'usuario' => $usuario + )); + + $this->_regra = $this->_service->getRegra(); + } + + /** + * @see Core_Controller_Page_EditController#_initNovo() + */ + protected function _initNovo() + { + $this->_etapa = $this->getRequest()->etapa; + $this->_matricula = $this->getRequest()->matricula; + $this->_componenteCurricular = $this->getRequest()->componenteCurricular; + + if (isset($this->_etapa) && isset($this->_matricula)) { + return FALSE; + } + + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE && + !isset($this->_componenteCurricular)) { + return FALSE; + } + + return TRUE; + } + + /** + * @see Core_Controller_Page_EditController#_initEditar() + */ + protected function _initEditar() + { + $this->_parecer = $this->_service->getParecerDescritivo($this->_etapa, $this->_componenteCurricular); + return TRUE; + } + + /** + * @see clsCadastro#Gerar() + */ + public function Gerar() + { + $this->campoOculto('matricula', $this->_matricula); + $this->campoOculto('etapa', $this->_etapa); + $this->campoOculto('componenteCurricular', $this->_componenteCurricular); + + $matricula = $this->_service->getOption('matriculaData'); + + $this->campoRotulo('1nome', 'Nome', $matricula['nome']); + $this->campoRotulo('2curso', 'Curso', $matricula['curso_nome']); + $this->campoRotulo('3serie', 'Série', $matricula['serie_nome']); + + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL) { + $this->campoRotulo('4etapa', 'Etapa', $this->_etapa == 'Rc' ? 'Recuperação' : $this->_etapa); + } + else { + $this->campoRotulo('4etapa', 'Etapa', 'Anual'); + } + + if ($this->_componenteCurricular) { + $componentes = $this->_service->getComponentes(); + $this->campoRotulo('5componente_curricular', 'Componente curricular', $componentes[$this->_componenteCurricular]); + } + + $this->campoMemo('parecer', 'Parecer', $this->_parecer, 40, 10, TRUE); + } + + /** + * @see Core_Controller_Page_EditController#_save() + */ + protected function _save() + { + // Instancia o objeto correto e passa para o service + if ($this->_regra->get('parecerDescritivo') == RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE) { + $parecer = new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => $this->getRequest()->componenteCurricular, + 'parecer' => $this->getRequest()->parecer, + 'etapa' => $this->getRequest()->etapa + )); + } + else { + $parecer = new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => $this->getRequest()->parecer, + 'etapa' => $this->getRequest()->etapa + )); + } + + $this->_service->addParecer($parecer); + + try { + $this->_service->save(); + } + catch (CoreExt_Service_Exception $e) { + // Ok. Não pode promover por se tratar de progressão manual ou por estar em andamento + } + catch (Exception $e) { + $this->mensagem = 'Erro no preenchimento do formulário. '; + return FALSE; + } + + return TRUE; + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Boletim/Common.php b/ieducar/modules/Avaliacao/_tests/Boletim/Common.php deleted file mode 100644 index f81893d..0000000 --- a/ieducar/modules/Avaliacao/_tests/Boletim/Common.php +++ /dev/null @@ -1,387 +0,0 @@ - - * - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) - * qualquer versão posterior. - * - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral - * do GNU para mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto - * com este programa; se não, escreva para a Free Software Foundation, Inc., no - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. - * - * @author Eriksen Costa Paixão - * @category i-Educar - * @license @@license@@ - * @package Avaliacao - * @subpackage UnitTests - * @since Arquivo disponível desde a versão 1.1.0 - * @version $Id$ - */ - -// Dependências do próprio módulo -require_once 'Avaliacao/Service/Boletim.php'; -require_once 'Avaliacao/Model/NotaAlunoDataMapper.php'; -require_once 'Avaliacao/Model/NotaComponenteDataMapper.php'; -require_once 'Avaliacao/Model/NotaComponenteMediaDataMapper.php'; -require_once 'Avaliacao/Model/FaltaAlunoDataMapper.php'; -require_once 'Avaliacao/Model/FaltaComponenteDataMapper.php'; - -// Dependência de outros módulos -require_once 'AreaConhecimento/Model/AreaDataMapper.php'; -require_once 'ComponenteCurricular/Model/ComponenteDataMapper.php'; -require_once 'ComponenteCurricular/Model/AnoEscolarDataMapper.php'; -require_once 'FormulaMedia/Model/FormulaDataMapper.php'; -require_once 'TabelaArredondamento/Model/TabelaDataMapper.php'; -require_once 'TabelaArredondamento/Model/TabelaValorDataMapper.php'; -require_once 'RegraAvaliacao/Model/RegraDataMapper.php'; - -// Dependência de classes do namespace Ied_Pmieducar -require_once 'include/pmieducar/clsPmieducarSerie.inc.php'; -require_once 'include/pmieducar/clsPmieducarMatricula.inc.php'; - -/** - * BoletimTest class. - * - * Testa a API do service Avaliacao_Service_Boletim. Cria uma interface para - * a configuração de uma instância de RegraAvaliacao_Model_Regra, com o qual - * o service é bastante dependente. - * - * @author Eriksen Costa Paixão - * @category i-Educar - * @license @@license@@ - * @package Avaliacao - * @subpackage UnitTests - * @since Classe disponível desde a versão 1.1.0 - * @todo Todos os getters de DataMapper precisam de um teste para - * verificar se de fato retornam uma instância padrão - * @version @@package_version@@ - */ -abstract class Boletim_Common extends UnitBaseTest -{ - /** - * @var Avaliacao_Service_Boletim - */ - protected $_service = NULL; - - /** - * @var Avaliacao_Model_NotaAluno - */ - protected $_notaAlunoExpected = NULL; - - /** - * @var Avaliacao_Model_FaltaAluno - */ - protected $_faltaAlunoExpected = NULL; - - /** - * @var ComponenteCurricular_Model_ComponenteDataMapper - */ - protected $_componenteDataMapperMock = NULL; - - /** - * Configura todos os mocks de depenência de Avaliacao_Service_Boletim - */ - protected function setUp() - { - $this->_setUpLegacyMock(); - - // Instancia a classe Service - $this->_service = new Avaliacao_Service_Boletim(array( - 'matricula' => 1, - 'usuario' => 1, - 'RegraDataMapper' => $this->_setUpRegraAvaliacao(), - 'ComponenteDataMapper' => $this->_componenteDataMapperMock, - 'NotaAlunoDataMapper' => $this->_setUpNotaAlunoDataMapper(), - 'NotaComponenteDataMapper' => $this->_setUpNotaComponenteDataMapper(), - 'NotaComponenteMediaDataMapper' => $this->_setUpNotaComponenteMediaDataMapper(), - 'FaltaAlunoDataMapper' => $this->_setUpFaltaAlunoDataMapperMock(), - 'FaltaAbstractDataMapper' => $this->_setUpFaltaAbstractDataMapperMock(), - )); - } - - /** - * Configura um mock de RegraAvaliacao_Model_Regra. - * @return RegraAvaliacao_Model_Regra - */ - protected abstract function _setUpRegraAvaliacao(); - - /** - * Configura um mock de Avaliacao_Model_NotaAlunoDataMapper. - * - * @return Avaliacao_Model_NotaAlunoDataMapper - */ - protected abstract function _setUpNotaAlunoDataMapper(); - - /** - * Configura uma instância de Avaliacao_Model_NotaAluno e guarda no atributo - * $_notaAlunoExpected. - */ - protected abstract function _setUpNotaAluno(); - - /** - * Configura um mock de Avaliacao_Model_NotaComponenteDataMapper. - * @return Avaliacao_Model_NotaComponenteDataMapper - */ - protected abstract function _setUpNotaComponenteDataMapper(); - - /** - * Configura um mock de Avaliacao_Model_NotaMediaComponenteDataMapper. - * @return Avaliacao_Model_NotaComponenteMediaDataMapper - */ - protected abstract function _setUpNotaComponenteMediaDataMapper(); - - /** - * Configura um mock de Avaliacao_Model_FaltaAlunoDataMapper e guarda uma - * instância (a que for salva pelo mock) no atributo $_faltaAlunoExpected. - * - * @return Avaliacao_Model_FaltaAlunoDataMapper - */ - protected abstract function _setUpFaltaAlunoDataMapperMock(); - - protected abstract function _setUpFaltaAluno(); - - /** - * Configura um mock de Avaliacao_Model_FataAbstractDataMapper (Componente - * ou Geral). - * - * @return unknown_type - */ - protected abstract function _setUpFaltaAbstractDataMapperMock(); - - /** - * Configura mocks para as classes legadas (Ied_*). - */ - protected function _setUpLegacyMock() - { - $this->_configuraDadosMatricula() - ->_configuraDadosDisciplina() - ->_configuraDadosEtapasCursadas(); - } - - protected function _configuraDadosMatricula() - { - // Retorna para matrícula - $returnMatricula = array( - 'cod_matricula' => 1, - 'ref_ref_cod_escola' => 1, - 'ref_ref_cod_serie' => 1, - 'ref_cod_curso' => 1, - 'aprovado' => 1, - 'curso_carga_horaria' => (800 * 9), - 'curso_hora_falta' => (50 /60), - 'serie_carga_horaria' => 800 - ); - - // Mock para clsPmieducarMatricula - $matriculaMock = $this->getCleanMock('clsPmieducarMatricula'); - $matriculaMock->expects($this->any()) - ->method('detalhe') - ->will($this->returnValue($returnMatricula)); - - // Registra a instância no repositório de classes de CoreExt_Entity - CoreExt_Entity::addClassToStorage('clsPmieducarMatricula', - $matriculaMock, NULL, TRUE - ); - - // Retorno para clsPmieducarSerie - $returnSerie = array( - 'cod_serie' => 1, - 'regra_avaliacao_id' => 1, - 'carga_horaria' => 800 - ); - - // Mock para clsPmieducarMatricula - $serieMock = $this->getCleanMock('clsPmieducarSerie'); - $serieMock->expects($this->any()) - ->method('detalhe') - ->will($this->returnValue($returnSerie)); - - // Registra a instância no repositório de classes de CoreExt_Entity - CoreExt_Entity::addClassToStorage('clsPmieducarSerie', - $serieMock, NULL, TRUE - ); - - - // Retorno para clsPmieducarCurso - $returnCurso = array( - 'cod_curso' => 1, - 'carga_horaria' => (800 * 9), - 'hora_falta' => (50 / 60), - 'padrao_ano_escolar' => 1 - ); - - // Mock para clsPmieducarCurso - $cursoMock = $this->getCleanMock('clsPmieducarCurso'); - $cursoMock->expects($this->any()) - ->method('detalhe') - ->will($this->returnValue($returnCurso)); - - // Registra a instância no repositório de classes de CoreExt_Entity - CoreExt_Entity::addClassToStorage('clsPmieducarCurso', - $cursoMock, NULL, TRUE - ); - - return $this; - } - - protected function _configuraDadosDisciplina() - { - $componentes = array( - new ComponenteCurricular_Model_Componente( - array('id' => 1, 'nome' => 'Matemática', 'cargaHoraria' => 100) - ), - new ComponenteCurricular_Model_Componente( - array('id' => 2, 'nome' => 'Português', 'cargaHoraria' => 100) - ), - new ComponenteCurricular_Model_Componente( - array('id' => 3, 'nome' => 'Ciências', 'cargaHoraria' => 60) - ), - new ComponenteCurricular_Model_Componente( - array('id' => 4, 'nome' => 'Física', 'cargaHoraria' => 60) - ) - ); - - $expected = array( - $componentes[0], - $componentes[2] - ); - - // Retorna para clsPmieducarEscolaSerieDisciplina - $returnEscolaSerieDisciplina = array( - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 1, 'carga_horaria' => 100), - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 2, 'carga_horaria' => 100), - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 3, 'carga_horaria' => 70), - array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 4, 'carga_horaria' => 100), - ); - - // Mock para clsPmieducarEscolaSerieDisciplina - $escolaMock = $this->getCleanMock('clsPmieducarEscolaSerieDisciplina'); - $escolaMock->expects($this->any()) - ->method('lista') - ->will($this->returnValue($returnEscolaSerieDisciplina)); - - // Retorna para clsPmieducarDispensaDisciplina - $returnDispensa = array( - array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 2), - array('ref_cod_matricula' => 1, 'ref_cod_disciplina' => 4), - ); - - // Mock para clsPmieducarDispensaDisciplina - $dispensaMock = $this->getCleanMock('clsPmieducarDispensaDisciplina'); - $dispensaMock->expects($this->any()) - ->method('lista') - ->with(1, 1, 1) - ->will($this->returnValue($returnDispensa)); - - // Mock para ComponenteCurricular_Model_ComponenteDataMapper - $mapperMock = $this->getCleanMock('ComponenteCurricular_Model_ComponenteDataMapper'); - $mapperMock->expects($this->any()) - ->method('findComponenteCurricularAnoEscolar') - ->will($this->onConsecutiveCalls($expected[0], $expected[1])); - - // Guarda na instância, usado em setUp() - $this->_componenteDataMapperMock = $mapperMock; - - // Registra mocks - CoreExt_Entity::addClassToStorage('clsPmieducarEscolaSerieDisciplina', - $escolaMock, NULL, TRUE); - CoreExt_Entity::addClassToStorage('clsPmieducarDispensaDisciplina', - $dispensaMock, NULL, TRUE); - - return $this; - } - - /** - * É dependente do mock de clsPmieducarCurso de _configuraDadosMatricula - * (padrao_ano_escolar). - */ - protected function _configuraDadosEtapasCursadas() - { - $returnEscolaAno = array( - array('ref_cod_escola' => 1, 'ano' => 2009, 'andamento' => 1, 'ativo' => 1) - ); - - $returnAnoLetivo = array( - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 1), - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 2), - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 3), - array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 4) - ); - - // Mock para escola ano letivo (ano letivo em andamento) - $escolaAnoMock = $this->getCleanMock('clsPmieducarEscolaAnoLetivo'); - $escolaAnoMock->expects($this->any()) - ->method('lista') - ->with(1, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1) - ->will($this->returnValue($returnEscolaAno)); - - // Mock para o ano letivo (módulos do ano) - $anoLetivoMock = $this->getCleanMock('clsPmieducarAnoLetivoModulo'); - $anoLetivoMock->expects($this->any()) - ->method('lista') - ->with(2009, 1) - ->will($this->returnValue($returnAnoLetivo)); - - // Adiciona mocks ao repositório estático - CoreExt_Entity::addClassToStorage('clsPmieducarEscolaAnoLetivo', - $escolaAnoMock, NULL, TRUE); - CoreExt_Entity::addClassToStorage('clsPmieducarAnoLetivoModulo', - $anoLetivoMock, NULL, TRUE); - - return $this; - } - - /** - * @todo Refatorar método para uma classe stub, no diretório do módulo - * TabelaArredondamento - * @todo Está copiado em tests/Unit/App/Model/IedFinderTest.php - */ - protected function _getTabelaArredondamentoNumerica() - { - $data = array( - 'tabelaArredondamento' => 1, - 'nome' => NULL, - 'descricao' => NULL, - 'valorMinimo' => -1, - 'valorMaximo' => 0 - ); - - $tabelaValores = array(); - - for ($i = 0; $i <= 10; $i++) { - $data['nome'] = $i; - $data['valorMinimo'] += 1; - $data['valorMaximo'] += 1; - - if ($i == 10) { - $data['valorMinimo'] = 9; - $data['valorMaximo'] = 10; - } - - $tabelaValores[$i] = new TabelaArredondamento_Model_TabelaValor($data); - } - - $mapperMock = $this->getCleanMock('TabelaArredondamento_Model_TabelaValorDataMapper'); - $mapperMock->expects($this->any()) - ->method('findAll') - ->will($this->returnValue($tabelaValores)); - - $tabelaDataMapper = new TabelaArredondamento_Model_TabelaDataMapper(); - $tabelaDataMapper->setTabelaValorDataMapper($mapperMock); - - $tabela = new TabelaArredondamento_Model_Tabela(array('nome' => 'Numéricas')); - $tabela->setDataMapper($tabelaDataMapper); - return $tabela; - } -} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php b/ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php deleted file mode 100644 index aa2e2aa..0000000 --- a/ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php +++ /dev/null @@ -1,1192 +0,0 @@ - - * - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) - * qualquer versão posterior. - * - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral - * do GNU para mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto - * com este programa; se não, escreva para a Free Software Foundation, Inc., no - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. - * - * @author Eriksen Costa Paixão - * @category i-Educar - * @license @@license@@ - * @package Avaliacao - * @subpackage UnitTests - * @since Arquivo disponível desde a versão 1.1.0 - * @version $Id$ - */ - -require_once 'Avaliacao/_tests/Boletim/Common.php'; - -/** - * NotaNumerica_FaltaComponente class. - * - * Configura mocks para todas as dependências de Avaliacao_Service_Boletim. - * - * A configuração é baseada nos mocks criados para para App_Model_IedFinder, - * onde é retornado os componentes curriculares 1 (matemática) e 3 (ciências), - * já que o aluno estaria dispensado dos outros dois componentes. - * - * - RegraAvaliacao_Model_Regra: nota numérica, progressiva, falta - * contabilizada por componente curricular, média 6, tabela de arredondamento, - * fórmula de média (aritmética simples) - * - * - FormulaMedia_Model_Formula: aritmética simples (Se / Et) - * - * - ComponenteCurricular_Model_ComponenteDataMapper: retorna componentes - * em que o aluno estaria cursando, conforme retornado por - * App_Model_IedFinder::getComponentesPorMatricula - * - * - Avaliacao_Model_NotaAlunoDataMapper: retorna uma instância de - * Avaliacao_Model_NotaAluno, para testar inicialização do service - * - * - Avaliacao_Model_NotaComponenteDataMapper: retorna uma instância de - * Avaliacao_Model_NotaComponente, para testar inicialização do service - * - * - Avaliacao_Model_FaltaAlunoDataMapper: retorna uma instância de - * Avaliacao_Model_FaltaAluno, para testar inicialização do service - * - * - Avaliacao_Model_FaltaAbstractDataMapper: retorna uma instância de - * Avaliacao_Model_FaltaComponente, para testa inicialização do service - * e casos para o qual a regra de avaliação registre faltas por componentes - * curriculares - * - * @author Eriksen Costa Paixão - * @category i-Educar - * @license @@license@@ - * @package Avaliacao - * @subpackage UnitTests - * @since Classe disponível desde a versão 1.1.0 - * @version @@package_version@@ - */ -class Boletim_NotaNumerica_FaltaComponenteTest extends Boletim_Common -{ - /** - * @see Boletim_Common#_setUpRegraAvaliacao() - */ - protected function _setUpRegraAvaliacao() - { - $formulaMedia = new FormulaMedia_Model_Formula(array( - 'id' => 1, - 'nome' => 'Média aritmética', - 'formulaMedia' => 'Se / Et' - )); - - $formulaRecuperacao = new FormulaMedia_Model_Formula(array( - 'id' => 2, - 'nome' => 'Média Ponderada', - 'formulaMedia' => 'Rc * 0.4 + Se / Et * 0.6' - )); - - // Retorno para mock RegraAvaliacao - $expected = new RegraAvaliacao_Model_Regra(array( - 'id' => 1, - 'nome' => 'Regra geral', - 'tipoNota' => RegraAvaliacao_Model_Nota_TipoValor::NUMERICA, - 'tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::CONTINUADA, - 'tipoPresenca' => RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE, - 'media' => 6, - 'tabelaArredondamento' => $this->_getTabelaArredondamentoNumerica(), - 'formulaMedia' => $formulaMedia, - 'formulaRecuperacao' => $formulaRecuperacao, - 'porcentagemPresenca' => 75 - )); - - $regraMock = $this->getCleanMock('RegraAvaliacao_Model_RegraDataMapper'); - $regraMock->expects($this->once()) - ->method('find') - ->with(1) - ->will($this->returnValue($expected)); - - return $regraMock; - } - - /** - * @see Boletim_Common#_setUpNotaAlunoDataMapper() - */ - protected function _setUpNotaAlunoDataMapper() - { - $notaAluno = $this->_setUpNotaAluno(); - - // Configura expectativas do mock de NotaAluno, que irá retornar vazio - // (aluno ainda não possui notas lançadas) - $notaAlunoMock = $this->getCleanMock('Avaliacao_Model_NotaAlunoDataMapper'); - $notaAlunoMock->expects($this->any()) - ->method('findAll') - ->with(array(), array('matricula' => 1)) - ->will($this->onConsecutiveCalls(array(), array($notaAluno))); - - $notaAlunoMock->expects($this->any()) - ->method('save') - ->will($this->returnValue(TRUE)); - - return $notaAlunoMock; - } - - protected function _setUpNotaAluno() - { - $notaAluno = new Avaliacao_Model_NotaAluno(array('id' => 1, 'matricula' => 1)); - - // Guarda na instância - $this->_notaAlunoExpected = $notaAluno; - - return $notaAluno; - } - - /** - * @see Boletim_Common#_setUpNotaComponenteDataMapper() - */ - protected function _setUpNotaComponenteDataMapper() - { - $notaComponente = array(new Avaliacao_Model_NotaComponente(array( - 'id' => 1, - 'notaAluno' => 1, - 'componenteCurricular' => 1, - 'nota' => 7.5, - 'notaArredondada' => 7, - 'etapa' => 2 - ))); - - $notaComponenteMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); - $notaComponenteMock->expects($this->at(0)) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($notaComponente)); - - return $notaComponenteMock; - } - - /** - * @see Boletim_Common#_setUpNotaComponenteMediaDataMapper() - */ - protected function _setUpNotaComponenteMediaDataMapper() - { - $notaComponenteMedia = array(new Avaliacao_Model_NotaComponenteMedia(array( - 'id' => 1, - 'notaAluno' => 1, - 'componenteCurricular' => 1, - 'media' => (7.5 + 6.5) / 4, - 'mediaArredondada' => 3.5, - 'etapa' => 2 - ))); - - $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); - $mock->expects($this->once()) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($notaComponenteMedia)); - - return $mock; - } - - /** - * @see Boletim_Common#_setUpFaltaAlunoDataMapperMock() - */ - protected function _setUpFaltaAlunoDataMapperMock() - { - $faltaAluno = $this->_setUpFaltaAluno(); - - $faltaAlunoMock = $this->getCleanMock('Avaliacao_Model_FaltaAlunoDataMapper'); - $faltaAlunoMock->expects($this->any()) - ->method('findAll') - ->with(array(), array('matricula' => 1)) - ->will($this->onConsecutiveCalls(array(), array($faltaAluno))); - - $faltaAlunoMock->expects($this->any()) - ->method('save') - ->will($this->returnValue(TRUE)); - - return $faltaAlunoMock; - } - - /** - * @see Boletim_Common#_setUpFaltaAluno() - */ - protected function _setUpFaltaAluno() - { - $faltaAluno = new Avaliacao_Model_FaltaAluno(array( - 'id' => 1, - 'matricula' => 1, - 'tipoFalta' => RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE - )); - - // Guarda na instância - $this->_faltaAlunoExpected = $faltaAluno; - - return $faltaAluno; - } - - /** - * @see Boletim_Common#_setUpFaltaAbstractDataMapperMock() - */ - protected function _setUpFaltaAbstractDataMapperMock() - { - // Retorno para mock de falta componentes - $faltaComponente = array(new Avaliacao_Model_FaltaComponente(array( - 'id' => 1, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 4, - 'etapa' => 2 - ))); - - // Configura expectativas do mock - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); - $faltaComponenteMock->expects($this->at(0)) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltaComponente)); - - return $faltaComponenteMock; - } - - /** - * @expectedException CoreExt_Service_Exception - */ - public function testInstanciaLancaExcecaoCasoNumeroDeMatriculaNaoSejaInformado() - { - $service = new Avaliacao_Service_Boletim(); - } - - public function testInstanciaRegraDeAvaliacaoAtravesDeUmNumeroDeMatricula() - { - $this->assertType('RegraAvaliacao_Model_Regra', $this->_service->getRegra()); - } - - public function testInstanciaComponenteCurriculaAtravesDeUmNumeroDeMatricula() - { - $this->assertType('TabelaArredondamento_Model_Tabela', $this->_service->getTabelaArredondamento()); - } - - public function testInstanciaDeNotaEAdicionadaApenasUmaVez() - { - $data = array( - new Avaliacao_Model_NotaComponente( - array('componenteCurricular' => 1, 'nota' => 5) - ), - new Avaliacao_Model_NotaComponente( - array('componenteCurricular' => 3, 'nota' => 7.25) - ) - ); - - $this->_service->addNota($data[0]) - ->addNota($data[1]) - ->addNota($data[0]); - - $notas = $this->_service->getNotas(); - $notas = array( - array_shift($notas), - array_shift($notas) - ); - - $this->assertEquals(2, count($notas)); - $this->assertEquals($data[0], $notas[0]); - $this->assertEquals($data[1], $notas[1]); - - $data[0]->nota = 6; - $this->_service->addNota($data[0]); - - $this->assertEquals(2, count($this->_service->getNotas())); - } - - public function testValidacaoDeNotaNoBoletim() - { - // O aluno de matrícula "1" terá uma nota em matemática e nenhuma em ciências - $expected = array( - new Avaliacao_Model_NotaComponente(array('nota' => 6, 'componenteCurricular' => 1, 'etapa' => 1)) - ); - - // Não existe etapa 7, a máxima é 4 e Rc (recuperação). - $nota = new Avaliacao_Model_NotaComponente(array('componenteCurricular' => 1, 'nota' => 5.75, 'etapa' => 7)); - $this->_service->addNota($nota); - - // O aluno não cursa o componente 9 - $nota = new Avaliacao_Model_NotaComponente(array('componenteCurricular' => 9, 'nota' => 5.75, 'etapa' => 7)); - $this->_service->addNota($nota); - - // Notas validáveis - $validatable = $this->_service->getNotas(); - - // Inválido, irá atribuir a maior etapa possível - $nota = array_shift($validatable); - $this->assertEquals(3, $nota->etapa); - - - // Inválido, irá atribuir a maior etapa possível - $nota = array_shift($validatable); - $this->assertEquals(1, $nota->etapa); - } - - public function testValidacaoDeFaltaPorComponenteNoBoletim() - { - // Não existe etapa 7, a máxima é 4 e Rc (recuperação). - $falta = new Avaliacao_Model_FaltaComponente(array('componenteCurricular' => 1, 'quantidade' => 5, 'etapa' => 7)); - $this->_service->addFalta($falta); - - // O aluno não cursa o componente 9 - $falta = new Avaliacao_Model_FaltaComponente(array('componenteCurricular' => 9, 'quantidade' => 5, 'etapa' => 7)); - $this->_service->addFalta($falta); - - // Faltas validáveis - $validatable = $this->_service->getFaltas(); - - // Inválido, irá atribuir a maior etapa possível - $falta = array_shift($validatable); - $this->assertEquals(3, $falta->etapa); - - // Inválido, irá atribuir a maior etapa possível - $falta = array_shift($validatable); - $this->assertEquals(1, $falta->etapa); - } - - public function testArredondamentoDeNota() - { - $nota = new Avaliacao_Model_NotaComponente(array('nota' => 7.5)); - $this->assertEquals(7, $this->_service->arredondaNota($nota)); - - $nota = new Avaliacao_Model_NotaComponente(array('nota' => 8)); - $this->assertEquals(7, $this->_service->arredondaNota($nota)); - } - - public function testSalvaAsNotasNoBoletim() - { - $data = array( - new Avaliacao_Model_NotaComponente( - array('componenteCurricular' => 1, 'nota' => 5) - ), - new Avaliacao_Model_NotaComponente( - array('componenteCurricular' => 3, 'nota' => 7.25, 'etapa' => 1) - ) - ); - - // Adiciona mocks na instância - $this->_service->addNotas($data); - - // Configura o mock de NotaComponente, que irá persistir objetos - // Avaliacao_Model_NotaComponente - $notas = $this->_service->getNotas(); - $toSave[0] = array_shift($notas); - $toSave[1] = array_shift($notas); - $toSave[0]->notaAluno = $this->_notaAlunoExpected; - $toSave[1]->notaAluno = $this->_notaAlunoExpected; - - // Usa o mesmo mock que foi criado em setUp() - $notaComponenteMock = $this->_service->getNotaComponenteDataMapper(); - - // Depois de salvar as notas, retornaremos um conjunto completo, inclusive - // com a nota da primeira etapa que não tem em setUp(). - $notasComponentes = array( - new Avaliacao_Model_NotaComponente(array( - 'id' => 1, - 'notaAluno' => 1, - 'componenteCurricular' => 1, - 'nota' => 6.5, - 'notaArredondada' => 6, - 'etapa' => 1 - )), - new Avaliacao_Model_NotaComponente(array( - 'id' => 2, - 'notaAluno' => 1, - 'componenteCurricular' => 1, - 'nota' => 7.5, - 'notaArredondada' => 7, - 'etapa' => 2 - )), - new Avaliacao_Model_NotaComponente(array( - 'id' => 3, - 'notaAluno' => 1, - 'componenteCurricular' => 1, - 'nota' => 5, - 'notaArredondada' => 4, - 'etapa' => 3 - )), - new Avaliacao_Model_NotaComponente(array( - 'id' => 4, - 'notaAluno' => 1, - 'componenteCurricular' => 3, - 'nota' => 7.25, - 'notaArredondada' => 7, - 'etapa' => 1 - )) - ); - - $notaComponenteMock->expects($this->at(0)) - ->method('save') - ->with($toSave[0]); - - $notaComponenteMock->expects($this->at(1)) - ->method('save') - ->with($toSave[1]); - - $notaComponenteMock->expects($this->at(2)) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($notasComponentes)); - - // Valores de retorno para NotaComponenteMedia - $notasComponentesMedia = array( - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, - 'componenteCurricular' => 1, - 'media' => 3.5, - 'mediaArredondada' => 3 - )) - ); - - $notaComponenteMediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); - $notaComponenteMediaMock->expects($this->at(0)) - ->method('find') - ->with(array(1, 1)) - ->will($this->returnValue($notasComponentesMedia[0])); - - $notaComponenteMediaMock->expects($this->at(2)) - ->method('find') - ->with(array(1, 3)) - ->will($this->returnValue(NULL)); - - $notaComponenteMediaMock->expects($this->at(1)) - ->method('save'); - - $notaComponenteMediaMock->expects($this->at(3)) - ->method('save'); - - // Atribui mock a instância - $this->_service->setNotaComponenteDataMapper($notaComponenteMock); - $this->_service->setNotaComponenteMediaDataMapper($notaComponenteMediaMock); - - // Salva as notas - $this->_service->saveNotas(); - - // Verifica a etapa das notas - $notas = $this->_service->getNotas(); - - $nota1 = array_shift($notas); - $nota2 = array_shift($notas); - - // Quantidade de etapas - $this->assertEquals(3, $nota1->etapa); - $this->assertEquals(1, $nota2->etapa); - } - - public function testSalvaAsFaltasNoBoletim() - { - $data = array( - new Avaliacao_Model_FaltaComponente(array( - 'componenteCurricular' => 1, 'quantidade' => 1 - )), - new Avaliacao_Model_FaltaComponente(array( - 'componenteCurricular' => 3, 'quantidade' => 4 - )) - ); - - // Adiciona faltas - $this->_service->addFaltas($data); - - // Adiciona a instância de falta aluno - $faltas = $this->_service->getFaltas(); - $toSave = array(); - $toSave[0] = array_shift($faltas); - $toSave[1] = array_shift($faltas); - - $toSave[0]->faltaAluno = $this->_faltaAlunoExpected; - $toSave[1]->faltaAluno = $this->_faltaAlunoExpected; - - // Usa o mesmo mock que foi criado em setUp() - $faltaComponenteMock = $this->_service->getFaltaAbstractDataMapper(); - - $faltaComponenteMock->expects($this->at(0)) - ->method('save') - ->with($toSave[0]); - - $faltaComponenteMock->expects($this->at(1)) - ->method('save') - ->with($toSave[1]); - - // Salva as faltas - $this->_service->saveFaltas(); - } - - public function testSituacaoAlunoComponentesCurricularesEmExame() - { - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - $expected->componentesCurriculares[3] = new stdClass(); - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME; - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME; - - $returnValue = array( - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 5.65, 'mediaArredondada' => 5.5, 'etapa' => 4 - )), - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 6, 'mediaArredondada' => 6, 'etapa' => 'Rc' - )) - ); - - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); - $mediaMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($returnValue)); - - $this->_service->setNotaComponenteMediaDataMapper($mediaMock); - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares()); - } - - public function testSituacaoAlunoComponentesCurricularesReprovado() - { - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::REPROVADO; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - $expected->componentesCurriculares[3] = new stdClass(); - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO; - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::REPROVADO; - - $returnValue = array( - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 5.65, 'mediaArredondada' => 5.5, 'etapa' => 'Rc' - )), - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 5.5, 'mediaArredondada' => 5.5, 'etapa' => 'Rc' - )) - ); - - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); - $mediaMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($returnValue)); - - $this->_service->setNotaComponenteMediaDataMapper($mediaMock); - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares()); - } - - public function testSituacaoAlunoComponentesCurricularesEmAndamento() - { - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - $expected->componentesCurriculares[3] = new stdClass(); - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; - - $returnValue = array( - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 5.65, 'mediaArredondada' => 5.5, 'etapa' => 3 - )), - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 6, 'mediaArredondada' => 6, 'etapa' => 4 - )) - ); - - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); - $mediaMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($returnValue)); - - $this->_service->setNotaComponenteMediaDataMapper($mediaMock); - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares()); - } - - public function testSituacaoAlunoComponentesCurricularesAprovado() - { - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::APROVADO; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - $expected->componentesCurriculares[3] = new stdClass(); - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO; - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; - - $returnValue = array( - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 1, 'media' => 7.65, 'mediaArredondada' => 7.5, 'etapa' => 4 - )), - new Avaliacao_Model_NotaComponenteMedia(array( - 'notaAluno' => 1, 'componenteCurricular' => 3, 'media' => 6, 'mediaArredondada' => 6, 'etapa' => 4 - )) - ); - - $mediaMock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); - $mediaMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('notaAluno' => 1)) - ->will($this->returnValue($returnValue)); - - $this->_service->setNotaComponenteMediaDataMapper($mediaMock); - $this->assertEquals($expected, $this->_service->getSituacaoComponentesCurriculares()); - } - -/** - * @depends testSalvaAsFaltasNoBoletim - * @see Boletim_Common#_configuraDadosDisciplina():255 (carga horária do - * componente de id 3 - Ciências) - */ - public function testSituacaoAlunoFaltaComponenteCurricularEmAndamento() - { - $faltasComponentes = array( - new Avaliacao_Model_FaltaComponente(array( - 'id' => 1, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 0, - 'etapa' => 1 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 2, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 7, - 'etapa' => 2 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 3, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 1, - 'etapa' => 3 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 4, - 'faltaAluno' => 1, - 'componenteCurricular' => 3, - 'quantidade' => 4, - 'etapa' => 1 - )) - ); - - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); - $faltaComponenteMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltasComponentes)); - - $this->_service->setFaltaAbstractDataMapper($faltaComponenteMock); - - // Objeto de retorno esperado - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE; - $expected->cargaHoraria = 800; - $expected->cursoHoraFalta = (50 / 60); - $expected->totalFaltas = 12; - $expected->horasFaltas = (12 * $expected->cursoHoraFalta); - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100); - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; - $expected->porcentagemPresencaRegra = 75; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - $expected->componentesCurriculares[3] = new stdClass(); - - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - $expected->componentesCurriculares[1]->horasFaltas = (8 * $expected->cursoHoraFalta); - $expected->componentesCurriculares[1]->porcentagemFalta = ((8 * $expected->cursoHoraFalta) / 100) * 100; - $expected->componentesCurriculares[1]->porcentagemPresenca = 100 - (((8 * $expected->cursoHoraFalta) / 100) * 100); - - $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - $expected->componentesCurriculares[3]->horasFaltas = (4 * $expected->cursoHoraFalta); - $expected->componentesCurriculares[3]->porcentagemFalta = ((4 * $expected->cursoHoraFalta) / 70) * 100; - $expected->componentesCurriculares[3]->porcentagemPresenca = 100 - (((4 * $expected->cursoHoraFalta) / 70) * 100); - - $presenca = $this->_service->getSituacaoFaltas(); - $this->assertEquals($expected, $presenca); - } - - /** - * @depends testSalvaAsFaltasNoBoletim - * @see Boletim_Common#_configuraDadosDisciplina():255 (carga horária do - * componente de id 3 - Ciências) - */ - public function testSituacaoAlunoFaltaComponenteCurricularAprovado() - { - $faltasComponentes = array( - new Avaliacao_Model_FaltaComponente(array( - 'id' => 1, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 0, - 'etapa' => 1 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 2, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 7, - 'etapa' => 2 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 3, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 1, - 'etapa' => 3 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 4, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 4, - 'etapa' => 4 - )) - ); - - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); - $faltaComponenteMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltasComponentes)); - - $this->_service->setFaltaAbstractDataMapper($faltaComponenteMock); - - // Objeto de retorno esperado - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::APROVADO; - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE; - $expected->cargaHoraria = 800; - $expected->cursoHoraFalta = (50 / 60); - $expected->totalFaltas = 12; - $expected->horasFaltas = (12 * $expected->cursoHoraFalta); - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100); - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; - $expected->porcentagemPresencaRegra = 75; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO; - $expected->componentesCurriculares[1]->horasFaltas = (12 * $expected->cursoHoraFalta); - $expected->componentesCurriculares[1]->porcentagemFalta = ((12 * $expected->cursoHoraFalta) / 100) * 100; - $expected->componentesCurriculares[1]->porcentagemPresenca = 100 - (((12 * $expected->cursoHoraFalta) / 100) * 100); - - $presenca = $this->_service->getSituacaoFaltas(); - $this->assertEquals($expected, $presenca); - } - -/** - * @depends testSalvaAsFaltasNoBoletim - * @see Boletim_Common#_configuraDadosDisciplina():255 (carga horária do - * componente de id 3 - Ciências) - */ - public function testSituacaoAlunoFaltaComponenteCurricularReprovado() - { - $faltasComponentes = array( - new Avaliacao_Model_FaltaComponente(array( - 'id' => 1, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 125, - 'etapa' => 1 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 2, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 125, - 'etapa' => 2 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 3, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 125, - 'etapa' => 3 - )), - new Avaliacao_Model_FaltaComponente(array( - 'id' => 4, - 'faltaAluno' => 1, - 'componenteCurricular' => 1, - 'quantidade' => 125, - 'etapa' => 4 - )) - ); - - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); - $faltaComponenteMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltasComponentes)); - - $this->_service->setFaltaAbstractDataMapper($faltaComponenteMock); - - // Objeto de retorno esperado - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::REPROVADO; - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE; - $expected->cargaHoraria = 800; - $expected->cursoHoraFalta = (50 / 60); - $expected->totalFaltas = 500; - $expected->horasFaltas = (500 * $expected->cursoHoraFalta); - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100); - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; - $expected->porcentagemPresencaRegra = 75; - $expected->componentesCurriculares = array(); - $expected->componentesCurriculares[1] = new stdClass(); - - $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO; - $expected->componentesCurriculares[1]->horasFaltas = (500 * $expected->cursoHoraFalta); - $expected->componentesCurriculares[1]->porcentagemFalta = ((500 * $expected->cursoHoraFalta) / 100) * 100; - $expected->componentesCurriculares[1]->porcentagemPresenca = 100 - (((500 * $expected->cursoHoraFalta) / 100) * 100); - - $presenca = $this->_service->getSituacaoFaltas(); - $this->assertEquals($expected, $presenca); - } - - public function testSituacaoAluno() - { - $notaSituacoes = array( - 1 => App_Model_MatriculaSituacao::APROVADO, - 2 => App_Model_MatriculaSituacao::APROVADO_APOS_EXAME, - 3 => App_Model_MatriculaSituacao::EM_ANDAMENTO, - 4 => App_Model_MatriculaSituacao::EM_EXAME, - 5 => App_Model_MatriculaSituacao::REPROVADO - ); - - $faltaSituacoes = array( - 1 => App_Model_MatriculaSituacao::EM_ANDAMENTO, - 2 => App_Model_MatriculaSituacao::APROVADO, - 3 => App_Model_MatriculaSituacao::REPROVADO - ); - - // Possibilidades - $expected = array( - 1 => array( - 1 => array(FALSE, TRUE, FALSE, FALSE), - 2 => array(TRUE, FALSE, FALSE, FALSE), - 3 => array(FALSE, FALSE, TRUE, FALSE) - ), - 2 => array( - 1 => array(FALSE, TRUE, FALSE, TRUE), - 2 => array(TRUE, FALSE, FALSE, TRUE), - 3 => array(FALSE, FALSE, TRUE, TRUE) - ), - 3 => array( - 1 => array(FALSE, TRUE, FALSE, FALSE), - 2 => array(FALSE, TRUE, FALSE, FALSE), - 3 => array(FALSE, TRUE, TRUE, FALSE) - ), - 4 => array( - 1 => array(FALSE, TRUE, FALSE, TRUE), - 2 => array(FALSE, TRUE, FALSE, TRUE), - 3 => array(FALSE, TRUE, TRUE, TRUE) - ), - 5 => array( - 1 => array(FALSE, TRUE, FALSE, TRUE), - 2 => array(FALSE, FALSE, FALSE, TRUE), - 3 => array(FALSE, FALSE, TRUE, TRUE) - ) - ); - - foreach ($notaSituacoes as $i => $notaSituacao) { - $nota = new stdClass(); - $nota->situacao = $notaSituacao; - - foreach ($faltaSituacoes as $ii => $faltaSituacao) { - $service = $this->setExcludedMethods(array('getSituacaoAluno')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $falta = new stdClass(); - $falta->situacao = $faltaSituacao; - - $service->expects($this->once()) - ->method('getSituacaoComponentesCurriculares') - ->will($this->returnValue($nota)); - - $service->expects($this->once()) - ->method('getSituacaoFaltas') - ->will($this->returnValue($falta)); - - // Testa - $situacao = $service->getSituacaoAluno(); - - $this->assertEquals($expected[$i][$ii][0], $situacao->aprovado, "Aprovado, caso $i - $ii"); - $this->assertEquals($expected[$i][$ii][1], $situacao->andamento, "Andamento, caso $i - $ii"); - $this->assertEquals($expected[$i][$ii][2], $situacao->retidoFalta, "Retido por falta, caso $i - $ii"); - $this->assertEquals($expected[$i][$ii][3], $situacao->recuperacao, "Recuperação, caso $i - $ii"); - } - } - } - - /** - * @expectedException CoreExt_Service_Exception - */ - public function testPromoverLancaExcecaoComSituacaoEmAndamento() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = TRUE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->promover(); - } - - /** - * @expectedException CoreExt_Service_Exception - */ - public function testPromoverMatriculaJaPromovidaLancaExcecao() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->once()) - ->method('getOption') - ->with('aprovado') - ->will($this->returnValue(1)); - - $service->promover(); - } - - public function testPromoverComProgressaoContinuada() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = TRUE; - $situacao->recuperacao = TRUE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::CONTINUADA) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->any()) - ->method('getOption') - ->will($this->onConsecutiveCalls(3, 1, 1)); - - $service->expects($this->once()) - ->method('_updateMatricula') - ->with(1, 1, TRUE); - - $service->promover(); - } - - public function testPromoverComProgressaoNaoContinuadaMediaPresencaAprovado() - { - $situacao = new stdClass(); - $situacao->aprovado = TRUE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = FALSE; - $situacao->recuperacao = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->any()) - ->method('getOption') - ->will($this->onConsecutiveCalls(3, 1, 1)); - - $service->expects($this->once()) - ->method('_updateMatricula') - ->with(1, 1, TRUE); - - $service->promover(); - } - - public function testPromoverComProgressaoNaoContinuadaMediaPresencaReprovado() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = TRUE; - $situacao->recuperacao = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->any()) - ->method('getOption') - ->will($this->onConsecutiveCalls(3, 1, 1)); - - $service->expects($this->once()) - ->method('_updateMatricula') - ->with(1, 1, FALSE); - - $service->promover(); - } - - public function testPromoverComProgressaoNaoContinuadaMediaAprovado() - { - $situacao = new stdClass(); - $situacao->aprovado = TRUE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = TRUE; - $situacao->recuperacao = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->any()) - ->method('getOption') - ->will($this->onConsecutiveCalls(3, 1, 1)); - - $service->expects($this->once()) - ->method('_updateMatricula') - ->with(1, 1, TRUE); - - $service->promover(); - } - - public function testPromoverComProgressaoNaoContinuadaMediaReprovado() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = FALSE; - $situacao->recuperacao = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->any()) - ->method('getOption') - ->will($this->onConsecutiveCalls(3, 1, 1)); - - $service->expects($this->once()) - ->method('_updateMatricula') - ->with(1, 1, FALSE); - - $service->promover(); - } - - /** - * @expectedException CoreExt_Service_Exception - */ - public function testPromoverComProgressaoNaoContinuadaManualNaoConfirmadaLancaExcecao() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = FALSE; - $situacao->recuperacao = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->once()) - ->method('getOption') - ->with('aprovado') - ->will($this->returnValue(3)); - - $service->promover(); - } - - public function testPromoverComProgressaoNaoContinuadaManualConfirmada() - { - $situacao = new stdClass(); - $situacao->aprovado = FALSE; - $situacao->andamento = FALSE; - $situacao->retidoFalta = FALSE; - $situacao->recuperacao = FALSE; - - $service = $this->setExcludedMethods(array('promover')) - ->getCleanMock('Avaliacao_Service_Boletim'); - - $service->expects($this->once()) - ->method('getRegra') - ->will($this->returnValue(new RegraAvaliacao_Model_Regra( - array('tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL) - ))); - - $service->expects($this->once()) - ->method('getSituacaoAluno') - ->will($this->returnValue($situacao)); - - $service->expects($this->any()) - ->method('getOption') - ->will($this->onConsecutiveCalls(3, 1, 1)); - - $service->expects($this->once()) - ->method('_updateMatricula') - ->with(1, 1, TRUE); - - $service->promover(TRUE); - } -} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaGeralTest.php b/ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaGeralTest.php deleted file mode 100644 index e8bd27e..0000000 --- a/ieducar/modules/Avaliacao/_tests/Boletim/NotaNumerica_FaltaGeralTest.php +++ /dev/null @@ -1,414 +0,0 @@ - - * - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) - * qualquer versão posterior. - * - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral - * do GNU para mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto - * com este programa; se não, escreva para a Free Software Foundation, Inc., no - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. - * - * @author Eriksen Costa Paixão - * @category i-Educar - * @license @@license@@ - * @package Avaliacao - * @subpackage UnitTests - * @since Arquivo disponível desde a versão 1.1.0 - * @version $Id$ - */ - -require_once 'Avaliacao/_tests/Boletim/NotaNumerica_FaltaComponenteTest.php'; -require_once 'Avaliacao/Model/FaltaGeralDataMapper.php'; - -/** - * NotaNumerica_FaltaGeral class. - * - * Realiza testes no service Avaliacao_Service_Boletim para casos onde a regra - * de avaliação contabiliza faltas no geral. - * - * Subclassifica classe de teste para casos de faltas por componentes, - * desativando ou modificando o comportamento por herança. - * - * @author Eriksen Costa Paixão - * @category i-Educar - * @license @@license@@ - * @package Avaliacao - * @subpackage UnitTests - * @since Classe disponível desde a versão 1.1.0 - * @version @@package_version@@ - */ -class Boletim_NotaNumerica_FaltaGeralTest extends Boletim_NotaNumerica_FaltaComponenteTest -{ - /** - * @see Boletim_NotaNumerica_FaltaComponenteTest#_setUpFaltaAluno() - */ - protected function _setUpFaltaAluno() - { - $faltaAluno = new Avaliacao_Model_FaltaAluno(array( - 'id' => 1, - 'matricula' => 1, - 'tipoFalta' => RegraAvaliacao_Model_TipoPresenca::GERAL - )); - - // Guarda na instância - $this->_faltaAlunoExpected = $faltaAluno; - - return $faltaAluno; - } - - /** - * @see Boletim_Common#_setUpFaltaAbstractDataMapperMock() - */ - protected function _setUpFaltaAbstractDataMapperMock() - { - // Retorno para mock de falta componentes - $faltaComponente = array(new Avaliacao_Model_FaltaGeral(array( - 'id' => 1, - 'faltaAluno' => 1, - 'quantidade' => 4, - 'etapa' => 2 - ))); - - // Configura expectativas do mock - $faltaComponenteMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); - $faltaComponenteMock->expects($this->at(0)) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltaComponente)); - - return $faltaComponenteMock; - } - - public function testInstanciaLancaExcecaoCasoNumeroDeMatriculaNaoSejaInformado() - { - } - - public function testInstanciaRegraDeAvaliacaoAtravesDeUmNumeroDeMatricula() - { - } - - public function testInstanciaComponenteCurriculaAtravesDeUmNumeroDeMatricula() - { - } - - public function testInstanciaDeNotaEAdicionadaApenasUmaVez() - { - } - - public function testValidacaoDeNotaNoBoletim() - { - } - - public function testValidacaoDeFaltaPorComponenteNoBoletim() - { - } - - public function testValidacaoDeFaltaGeralNoBoletim() - { - // Não existe etapa 7, a máxima é 4 e Rc (recuperação). - $falta = new Avaliacao_Model_FaltaGeral(array('quantidade' => 5, 'etapa' => 7)); - $this->_service->addFalta($falta); - - // O aluno não cursa o componente 9 - $falta = new Avaliacao_Model_FaltaGeral(array('quantidade' => 5, 'etapa' => 7)); - $this->_service->addFalta($falta); - - // Faltas validáveis - $validatable = $this->_service->getFaltas(); - - // Inválido, irá atribuir a maior etapa possível - $falta = array_shift($validatable); - $this->assertEquals(3, $falta->etapa); - - // Inválido, irá atribuir a maior etapa possível - $falta = array_shift($validatable); - $this->assertEquals(3, $falta->etapa, 'Segunda'); - } - - public function testArredondamentoDeNota() - { - } - - public function testSalvaAsNotasNoBoletim() - { - } - - public function testSalvaAsFaltasNoBoletim() - { - $data = array( - new Avaliacao_Model_FaltaGeral(array( - 'quantidade' => 1 - )), - new Avaliacao_Model_FaltaGeral(array( - 'quantidade' => 4 - )) - ); - - // Adiciona faltas - $this->_service->addFaltas($data); - - // Adiciona a instância de falta aluno - $faltas = $this->_service->getFaltas(); - $toSave = array(); - $toSave[0] = array_shift($faltas); - $toSave[1] = array_shift($faltas); - - $toSave[0]->faltaAluno = $this->_faltaAlunoExpected; - $toSave[1]->faltaAluno = $this->_faltaAlunoExpected; - - // Usa o mesmo mock que foi criado em setUp() - $faltaComponenteMock = $this->_service->getFaltaAbstractDataMapper(); - - $faltaComponenteMock->expects($this->at(0)) - ->method('save') - ->with($toSave[0]); - - $faltaComponenteMock->expects($this->at(1)) - ->method('save') - ->with($toSave[1]); - - // Salva as faltas - $this->_service->saveFaltas(); - } - - public function testSituacaoAlunoComponentesCurricularesEmExame() - { - } - - public function testSituacaoAlunoComponentesCurricularesReprovado() - { - } - - public function testSituacaoAlunoComponentesCurricularesEmAndamento() - { - } - - public function testSituacaoAlunoComponentesCurricularesAprovado() - { - } - - public function testSituacaoAlunoFaltaComponenteCurricularReprovado() - { - } - - public function testSituacaoAlunoFaltaComponenteCurricularEmAndamento() - { - } - - public function testSituacaoAlunoFaltaComponenteCurricularAprovado() - { - } - - /** - * @depends testSalvaAsFaltasNoBoletim - */ - public function testSituacaoAlunoFaltaGeralEmAndamento() - { - $faltasGerais = array( - new Avaliacao_Model_FaltaGeral(array( - 'id' => 1, - 'faltaAluno' => 1, - 'quantidade' => 1, - 'etapa' => 1 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 2, - 'faltaAluno' => 1, - 'quantidade' => 4, - 'etapa' => 2 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 3, - 'faltaAluno' => 1, - 'quantidade' => 5, - 'etapa' => 3 - )) - ); - - $faltaGeralMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); - $faltaGeralMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltasGerais)); - - $this->_service->setFaltaAbstractDataMapper($faltaGeralMock); - - // Objeto de retorno esperado - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::GERAL; - $expected->cargaHoraria = 800; - $expected->cursoHoraFalta = (50 / 60); - $expected->totalFaltas = 10; - $expected->horasFaltas = (10 * $expected->cursoHoraFalta); - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100); - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; - $expected->porcentagemPresencaRegra = 75; - $expected->componentesCurriculares = array(); - - $presenca = $this->_service->getSituacaoFaltas(); - $this->assertEquals($expected, $presenca); - } - - /** - * @depends testSalvaAsFaltasNoBoletim - */ - public function testSituacaoAlunoFaltaGeralReprovado() - { - $faltasGerais = array( - new Avaliacao_Model_FaltaGeral(array( - 'id' => 1, - 'faltaAluno' => 1, - 'quantidade' => 125, - 'etapa' => 1 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 2, - 'faltaAluno' => 1, - 'quantidade' => 125, - 'etapa' => 2 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 3, - 'faltaAluno' => 1, - 'quantidade' => 125, - 'etapa' => 3 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 4, - 'faltaAluno' => 1, - 'quantidade' => 125, - 'etapa' => 4 - )) - ); - - $faltaGeralMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); - $faltaGeralMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltasGerais)); - - $this->_service->setFaltaAbstractDataMapper($faltaGeralMock); - - // Objeto de retorno esperado - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::REPROVADO; - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::GERAL; - $expected->cargaHoraria = 800; - $expected->cursoHoraFalta = (50 / 60); - $expected->totalFaltas = 500; - $expected->horasFaltas = (500 * $expected->cursoHoraFalta); - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100); - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; - $expected->porcentagemPresencaRegra = 75; - $expected->componentesCurriculares = array(); - - $presenca = $this->_service->getSituacaoFaltas(); - $this->assertEquals($expected, $presenca); - } - - /** - * @depends testSalvaAsFaltasNoBoletim - */ - public function testSituacaoAlunoFaltaGeralAprovado() - { - $faltasGerais = array( - new Avaliacao_Model_FaltaGeral(array( - 'id' => 1, - 'faltaAluno' => 1, - 'quantidade' => 1, - 'etapa' => 1 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 2, - 'faltaAluno' => 1, - 'quantidade' => 4, - 'etapa' => 2 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 3, - 'faltaAluno' => 1, - 'quantidade' => 5, - 'etapa' => 3 - )), - new Avaliacao_Model_FaltaGeral(array( - 'id' => 4, - 'faltaAluno' => 1, - 'quantidade' => 0, - 'etapa' => 4 - )) - ); - - $faltaGeralMock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); - $faltaGeralMock->expects($this->once()) - ->method('findAll') - ->with(array(), array('faltaAluno' => 1)) - ->will($this->returnValue($faltasGerais)); - - $this->_service->setFaltaAbstractDataMapper($faltaGeralMock); - - // Objeto de retorno esperado - $expected = new stdClass(); - $expected->situacao = App_Model_MatriculaSituacao::APROVADO; - $expected->tipoFalta = RegraAvaliacao_Model_TipoPresenca::GERAL; - $expected->cargaHoraria = 800; - $expected->cursoHoraFalta = (50 / 60); - $expected->totalFaltas = 10; - $expected->horasFaltas = (10 * $expected->cursoHoraFalta); - $expected->porcentagemFalta = (($expected->horasFaltas / $expected->cargaHoraria) * 100); - $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; - $expected->porcentagemPresencaRegra = 75; - $expected->componentesCurriculares = array(); - - $presenca = $this->_service->getSituacaoFaltas(); - $this->assertEquals($expected, $presenca); - } - - public function testSituacaoAluno() - { - } - - public function testPromoverLancaExcecaoComSituacaoEmAndamento() - { - } - - public function testPromoverComProgressaoContinuada() - { - } - - public function testPromoverComProgressaoNaoContinuadaMediaPresencaAprovado() - { - } - - public function testPromoverComProgressaoNaoContinuadaMediaPresencaReprovado() - { - } - - public function testPromoverComProgressaoNaoContinuadaMediaAprovado() - { - } - - public function testPromoverComProgressaoNaoContinuadaMediaReprovado() - { - } - - public function testPromoverComProgressaoNaoContinuadaManualNaoConfirmadaLancaExcecao() - { - } - - public function testPromoverComProgressaoNaoContinuadaManualConfirmada() - { - } -} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/AllTests.php b/ieducar/modules/Avaliacao/_tests/Service/AllTests.php new file mode 100644 index 0000000..875db1b --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/AllTests.php @@ -0,0 +1,55 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Tests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +/** + * Avaliacao_AllTests class. + * + * Arquivo de definição de suíte para o módulo. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage Tests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_AllTests extends TestCollector +{ + protected $_name = 'Suíte de testes do service Avaliacao_Service_Boletim do módulo Avaliacao'; + protected $_file = __FILE__; + + public static function suite() + { + $instance = new self; + return $instance->addDirectoryTests(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaAlunoTest.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaAlunoTest.php new file mode 100644 index 0000000..64f166b --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaAlunoTest.php @@ -0,0 +1,75 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_FaltaAlunoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_FaltaAlunoTest extends Avaliacao_Service_TestCommon +{ + public function testCriaNovaInstanciaDeFaltaAluno() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltaSave = clone $faltaAluno; + $faltaSave->id = NULL; + + // Configura mock para Avaliacao_Model_FaltaAlunoDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAlunoDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltaSave) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array($faltaAluno))); + + $this->_setFaltaAlunoDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaCommon.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaCommon.php new file mode 100644 index 0000000..6550ff8 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaCommon.php @@ -0,0 +1,110 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_FaltaCommon abstract class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +abstract class Avaliacao_Service_FaltaCommon extends Avaliacao_Service_TestCommon +{ + /** + * @return Avaliacao_Model_FaltaComponente + */ + protected abstract function _getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim(); + + /** + * @return Avaliacao_Model_FaltaComponente + */ + protected abstract function _getFaltaTestAdicionaFaltaNoBoletim(); + + /** + * Realiza asserções específicas para os validadores de uma instância de + * Avaliacao_Model_FaltaAbstract + */ + protected abstract function _testAdicionaFaltaNoBoletimVerificaValidadores(Avaliacao_Model_FaltaAbstract $falta); + + /** + * @see Avaliacao_Service_FaltaCommon#_getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim() + */ + public function testInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim() + { + $service = $this->_getServiceInstance(); + + $falta = $this->_getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim(); + + // Atribuição simples + $service->addFalta($falta) + ->addFalta($falta); + + $this->assertEquals(1, count($service->getFaltas())); + + // Via atribuição em lote + $falta = clone $falta; + $service->addFaltas(array($falta, $falta, $falta)); + + $this->assertEquals(2, count($service->getFaltas())); + } + + /** + * @see Avaliacao_Service_FaltaCommon#_getFaltaTestAdicionaFaltaNoBoletim() + * @see Avaliacao_Service_FaltaCommon#_testAdicionaFaltaNoBoletimVerificaValidadores() + */ + public function testAdicionaFaltaNoBoletim() + { + $service = $this->_getServiceInstance(); + + $falta = $this->_getFaltaTestAdicionaFaltaNoBoletim(); + + $faltaOriginal = clone $falta; + $service->addFalta($falta); + + $faltas = $service->getFaltas(); + $serviceFalta = array_shift($faltas); + + // Valores declarados explicitamente, verificação explícita + $this->assertEquals($faltaOriginal->quantidade, $serviceFalta->quantidade); + + // Valores populados pelo service + $this->assertNotEquals($faltaOriginal->etapa, $serviceFalta->etapa); + + // Validadores injetados no objeto + $this->_testAdicionaFaltaNoBoletimVerificaValidadores($serviceFalta); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteSituacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteSituacaoTest.php new file mode 100644 index 0000000..8c79897 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteSituacaoTest.php @@ -0,0 +1,515 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/FaltaSituacaoCommon.php'; + +/** + * Avaliacao_Service_FaltaComponenteSituacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_FaltaComponenteSituacaoTest extends Avaliacao_Service_FaltaSituacaoCommon +{ + protected function setUp() + { + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE); + parent::setUp(); + } + + public function testSituacaoFaltasEmAndamento() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, array()); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + $expected->porcentagemPresenca = 100; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } + + public function testSituacaoFaltasEmAndamentoUmComponenteAprovadoDeQuatroTotais() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + $componentes = $this->_getConfigOptions('escolaSerieDisciplina'); + + $faltas = array( + new Avaliacao_Model_FaltaComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 2, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 3, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 4, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 4 + )), + ); + + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta'); + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100); + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; + + // Configura expectativa para o componente de id '1' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[0]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[1]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[1]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[1]->porcentagemPresenca = $componentePorcentagemPresenca; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } + + public function testSituacaoFaltasAprovado() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + $componentes = $this->_getConfigOptions('escolaSerieDisciplina'); + + $faltas = array( + // Matemática + new Avaliacao_Model_FaltaComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 2, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 3, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 4, + 'componenteCurricular' => 1, + 'quantidade' => 5, + 'etapa' => 4 + )), + // Português + new Avaliacao_Model_FaltaComponente(array( + 'id' => 5, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 6, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 7, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 8, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 4 + )), + // Ciências + new Avaliacao_Model_FaltaComponente(array( + 'id' => 9, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 10, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 11, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 12, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 4 + )), + // Fisica + new Avaliacao_Model_FaltaComponente(array( + 'id' => 13, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 14, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 15, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 16, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 4 + )), + ); + + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta'); + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100); + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; + + // Configura expectativa para o componente de id '1' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 0, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[0]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[1]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[1]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[1]->porcentagemPresenca = $componentePorcentagemPresenca; + + // Configura expectativa para o componente de id '2' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 4, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[1]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[2]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[2]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[2]->porcentagemPresenca = $componentePorcentagemPresenca; + + // Configura expectativa para o componente de id '3' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 8, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[2]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[3]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[3]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[3]->porcentagemPresenca = $componentePorcentagemPresenca; + + // Configura expectativa para o componente de id '4' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 12, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[3]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[4]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[4]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[4]->porcentagemPresenca = $componentePorcentagemPresenca; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } + + /** + * Faltas para componentes funcionam usam os mesmos critérios das faltas + * gerais para a definição de aprovado ou reprovado: presença geral. + */ + public function testSituacaoFaltasReprovado() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + $componentes = $this->_getConfigOptions('escolaSerieDisciplina'); + + $faltas = array( + // Matemática + new Avaliacao_Model_FaltaComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'quantidade' => 60, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 2, + 'componenteCurricular' => 1, + 'quantidade' => 60, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 3, + 'componenteCurricular' => 1, + 'quantidade' => 60, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 4, + 'componenteCurricular' => 1, + 'quantidade' => 55, + 'etapa' => 4 + )), + // Português + new Avaliacao_Model_FaltaComponente(array( + 'id' => 5, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 6, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 7, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 8, + 'componenteCurricular' => 2, + 'quantidade' => 5, + 'etapa' => 4 + )), + // Ciências + new Avaliacao_Model_FaltaComponente(array( + 'id' => 9, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 10, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 11, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 12, + 'componenteCurricular' => 3, + 'quantidade' => 5, + 'etapa' => 4 + )), + // Fisica + new Avaliacao_Model_FaltaComponente(array( + 'id' => 13, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 14, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 15, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 16, + 'componenteCurricular' => 4, + 'quantidade' => 5, + 'etapa' => 4 + )), + ); + + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::REPROVADO; + + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta'); + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100); + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; + + // Configura expectativa para o componente de id '1' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 0, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[0]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO; + $expected->componentesCurriculares[1]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[1]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[1]->porcentagemPresenca = $componentePorcentagemPresenca; + + // Configura expectativa para o componente de id '2' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 4, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[1]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[2]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[2]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[2]->porcentagemPresenca = $componentePorcentagemPresenca; + + // Configura expectativa para o componente de id '3' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 8, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[2]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[3]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[3]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[3]->porcentagemPresenca = $componentePorcentagemPresenca; + + // Configura expectativa para o componente de id '4' + $componenteHoraFalta = + array_sum(CoreExt_Entity::entityFilterAttr(array_slice($faltas, 12, 4), 'id', 'quantidade')) * + $this->_getConfigOption('curso', 'hora_falta'); + + $componentePorcentagemFalta = + ($componenteHoraFalta / $componentes[3]['carga_horaria']) * 100; + + $componentePorcentagemPresenca = 100 - $componentePorcentagemFalta; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + $expected->componentesCurriculares[4]->horasFaltas = $componenteHoraFalta; + $expected->componentesCurriculares[4]->porcentagemFalta = $componentePorcentagemFalta; + $expected->componentesCurriculares[4]->porcentagemPresenca = $componentePorcentagemPresenca; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteTest.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteTest.php new file mode 100644 index 0000000..7440e9b --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaComponenteTest.php @@ -0,0 +1,291 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/FaltaCommon.php'; + +/** + * Avaliacao_Service_FaltaComponenteTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_FaltaComponenteTest extends Avaliacao_Service_FaltaCommon +{ + protected function setUp() + { + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE); + parent::setUp(); + } + + protected function _getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim() + { + return new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 5 + )); + } + + protected function _getFaltaTestAdicionaFaltaNoBoletim() + { + return new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 10 + )); + } + + protected function _testAdicionaFaltaNoBoletimVerificaValidadores(Avaliacao_Model_FaltaAbstract $falta) + { + $this->assertEquals(1, $falta->get('componenteCurricular')); + $this->assertEquals(1, $falta->etapa); + $this->assertEquals(10, $falta->quantidade); + + $validators = $falta->getValidatorCollection(); + $this->assertType('CoreExt_Validate_Choice', $validators['componenteCurricular']); + $this->assertType('CoreExt_Validate_Choice', $validators['etapa']); + + // Opções dos validadores + + // Componentes curriculares existentes para o aluno + $this->assertEquals( + array_keys($this->_getConfigOptions('componenteCurricular')), + array_values($validators['componenteCurricular']->getOption('choices')) + ); + + // Etapas possíveis para o lançamento de nota + $this->assertEquals( + array_merge(range(1, count($this->_getConfigOptions('anoLetivoModulo'))), array('Rc')), + $validators['etapa']->getOption('choices') + ); + } + + /** + * Testa o service adicionando faltas de apenas um componente curricular, + * para todas as etapas regulares (1 a 4). + */ + public function testSalvarFaltasDeUmComponenteCurricularNoBoletim() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 7, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 9, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 8, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 8, + 'etapa' => 4 + )), + ); + + // Configura mock para Avaliacao_Model_FaltaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($faltas[1]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(3)) + ->method('save') + ->with($faltas[2]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(4)) + ->method('save') + ->with($faltas[3]) + ->will($this->returnValue(TRUE)); + + $this->_setFaltaAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + + $service->addFaltas($faltas); + $service->saveFaltas(); + } + + /** + * Testa o service adicionando novas faltas para um componente curricular, + * que inclusive já tem a falta lançada para a segunda etapa. + */ + public function testSalvasFaltasDeUmComponenteComEtapasLancadas() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 7, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 9, + 'etapa' => 3 + )) + ); + + $faltasPersistidas = array( + new Avaliacao_Model_FaltaComponente(array( + 'id' => 1, + 'faltaAluno' => $faltaAluno->id, + 'componenteCurricular' => 1, + 'quantidade' => 8, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'id' => 2, + 'faltaAluno' => $faltaAluno->id, + 'componenteCurricular' => 1, + 'quantidade' => 11, + 'etapa' => 2 + )) + ); + + // Configura mock para Avaliacao_Model_FaltaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($faltasPersistidas)); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($faltas[1]) + ->will($this->returnValue(TRUE)); + + $this->_setFaltaAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addFaltas($faltas); + $service->saveFaltas(); + } + + public function testSalvasFaltasDeUmComponenteEAtualizadaEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 7, + 'etapa' => 2 + )), + // Etapa omitida, será atribuída a etapa '3' + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'quantidade' => 9 + )) + ); + + $faltasPersistidas = array( + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'id' => 1, + 'faltaAluno' => $faltaAluno->id, + 'quantidade' => 8, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaComponente(array( + 'componenteCurricular' => 1, + 'id' => 2, + 'faltaAluno' => $faltaAluno->id, + 'quantidade' => 11, + 'etapa' => 2 + )) + ); + + // Configura mock para Avaliacao_Model_FaltaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($faltasPersistidas)); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($faltas[1]) + ->will($this->returnValue(TRUE)); + + $this->_setFaltaAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addFaltas($faltas); + $service->saveFaltas(); + + $faltas = $service->getFaltas(); + + $falta = array_shift($faltas); + $this->assertEquals(2, $falta->etapa); + + // Etapa atribuída automaticamente + $falta = array_shift($faltas); + $this->assertEquals(3, $falta->etapa); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaGeralSituacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaGeralSituacaoTest.php new file mode 100644 index 0000000..d2f14f1 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaGeralSituacaoTest.php @@ -0,0 +1,156 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/FaltaSituacaoCommon.php'; + +/** + * Avaliacao_Service_FaltaGeralSituacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_FaltaGeralSituacaoTest extends Avaliacao_Service_FaltaSituacaoCommon +{ + protected function setUp() + { + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::GERAL); + parent::setUp(); + } + + public function testSituacaoFaltasEmAndamento() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, array()); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + $expected->porcentagemPresenca = 100; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } + + public function testSituacaoFaltasAprovado() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaGeral(array( + 'id' => 1, + 'quantidade' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 2, + 'quantidade' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 3, + 'quantidade' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 4, + 'quantidade' => 5, + 'etapa' => 4 + )), + ); + + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta'); + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100); + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } + + public function testSituacaoFaltasReprovado() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaGeral(array( + 'id' => 1, + 'quantidade' => 180, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 2, + 'quantidade' => 180, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 3, + 'quantidade' => 180, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 4, + 'quantidade' => 180, + 'etapa' => 4 + )), + ); + + $this->_setUpFaltaAbstractDataMapperMock($faltaAluno, $faltas); + + $expected = $this->_getExpectedSituacaoFaltas(); + + // Configura a expectativa + $expected->situacao = App_Model_MatriculaSituacao::REPROVADO; + + $expected->totalFaltas = array_sum(CoreExt_Entity::entityFilterAttr($faltas, 'id', 'quantidade')); + $expected->horasFaltas = $expected->totalFaltas * $this->_getConfigOption('curso', 'hora_falta'); + $expected->porcentagemFalta = ($expected->horasFaltas / $this->_getConfigOption('serie', 'carga_horaria') * 100); + $expected->porcentagemPresenca = 100 - $expected->porcentagemFalta; + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoFaltas()); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaGeralTest.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaGeralTest.php new file mode 100644 index 0000000..154d76d --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaGeralTest.php @@ -0,0 +1,269 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/FaltaCommon.php'; + +/** + * Avaliacao_Service_FaltaGeralTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_FaltaGeralTest extends Avaliacao_Service_FaltaCommon +{ + protected function setUp() + { + $this->_setRegraOption('tipoPresenca', RegraAvaliacao_Model_TipoPresenca::GERAL); + parent::setUp(); + } + + protected function _getFaltaTestInstanciaDeFaltaERegistradaApenasUmaVezNoBoletim() + { + return new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 10 + )); + } + + protected function _getFaltaTestAdicionaFaltaNoBoletim() + { + return new Avaliacao_Model_FaltaComponente(array( + 'quantidade' => 10 + )); + } + + protected function _testAdicionaFaltaNoBoletimVerificaValidadores(Avaliacao_Model_FaltaAbstract $falta) + { + $this->assertEquals(1, $falta->etapa); + $this->assertEquals(10, $falta->quantidade); + + $validators = $falta->getValidatorCollection(); + $this->assertType('CoreExt_Validate_Choice', $validators['etapa']); + $this->assertFalse(isset($validators['componenteCurricular'])); + + // Opções dos validadores + + // Etapas possíveis para o lançamento de nota + $this->assertEquals( + array_merge(range(1, count($this->_getConfigOptions('anoLetivoModulo'))), array('Rc')), + $validators['etapa']->getOption('choices') + ); + } + + /** + * Testa o service adicionando faltas de apenas um componente curricular, + * para todas as etapas regulares (1 a 4). + */ + public function testSalvarFaltasNoBoletim() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 7, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 11, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 8, + 'etapa' => 3 + )), + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 8, + 'etapa' => 4 + )), + ); + + // Configura mock para Avaliacao_Model_FaltaGeralDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($faltas[1]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(3)) + ->method('save') + ->with($faltas[2]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(4)) + ->method('save') + ->with($faltas[3]) + ->will($this->returnValue(TRUE)); + + $this->_setFaltaAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addFaltas($faltas); + $service->saveFaltas(); + } + + /** + * Testa o service adicionando novas faltas para um componente curricular, + * que inclusive já tem a falta lançada para a segunda etapa. + */ + public function testSalvasFaltasNoBoletimComEtapasLancadas() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 7, + 'etapa' => 2 + )), + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 9, + 'etapa' => 3 + )) + ); + + $faltasPersistidas = array( + new Avaliacao_Model_FaltaGeral(array( + 'id' => 1, + 'faltaAluno' => $faltaAluno->id, + 'quantidade' => 8, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 2, + 'faltaAluno' => $faltaAluno->id, + 'quantidade' => 11, + 'etapa' => 2 + )) + ); + + // Configura mock para Avaliacao_Model_FaltaGeralDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($faltasPersistidas)); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($faltas[1]) + ->will($this->returnValue(TRUE)); + + $this->_setFaltaAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addFaltas($faltas); + $service->saveFaltas(); + } + + public function testSalvasFaltasAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $faltas = array( + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 7, + 'etapa' => 2 + )), + // Etapa omitida, será atribuída a etapa '3' + new Avaliacao_Model_FaltaGeral(array( + 'quantidade' => 9 + )) + ); + + $faltasPersistidas = array( + new Avaliacao_Model_FaltaGeral(array( + 'id' => 1, + 'faltaAluno' => $faltaAluno->id, + 'quantidade' => 8, + 'etapa' => 1 + )), + new Avaliacao_Model_FaltaGeral(array( + 'id' => 2, + 'faltaAluno' => $faltaAluno->id, + 'quantidade' => 11, + 'etapa' => 2 + )) + ); + + // Configura mock para Avaliacao_Model_FaltaGeralDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_FaltaGeralDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($faltasPersistidas)); + + $mock->expects($this->at(1)) + ->method('save') + ->with($faltas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($faltas[1]) + ->will($this->returnValue(TRUE)); + + $this->_setFaltaAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addFaltas($faltas); + $service->saveFaltas(); + + $faltas = $service->getFaltas(); + + $falta = array_shift($faltas); + $this->assertEquals(2, $falta->etapa); + + // Etapa atribuída automaticamente + $falta = array_shift($faltas); + $this->assertEquals(3, $falta->etapa); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/FaltaSituacaoCommon.php b/ieducar/modules/Avaliacao/_tests/Service/FaltaSituacaoCommon.php new file mode 100644 index 0000000..767d790 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/FaltaSituacaoCommon.php @@ -0,0 +1,91 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_FaltaSituacaoCommon class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_FaltaSituacaoCommon extends Avaliacao_Service_TestCommon +{ + protected function _setUpFaltaAbstractDataMapperMock( + Avaliacao_Model_FaltaAluno $faltaAluno, array $faltas) + { + // Configura mock para notas + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAbstractDataMapper'); + + $mock->expects($this->any()) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($faltas)); + + $this->_setFaltaAbstractDataMapperMock($mock); + } + + protected function _getExpectedSituacaoFaltas() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + // Valores retornados pelas instâncias de classes legadas + $cursoHoraFalta = $this->_getConfigOption('curso', 'hora_falta'); + $serieCargaHoraria = $this->_getConfigOption('serie', 'carga_horaria'); + + // Porcentagem configurada na regra + $porcentagemPresenca = $this->_getRegraOption('porcentagemPresenca'); + + $expected = new stdClass(); + $expected->situacao = 0; + $expected->tipoFalta = 0; + $expected->cargaHoraria = 0; + $expected->cursoHoraFalta = 0; + $expected->totalFaltas = 0; + $expected->horasFaltas = 0; + $expected->porcentagemFalta = 0; + $expected->porcentagemPresenca = 0; + $expected->porcentagemPresencaRegra = 0; + $expected->componentesCurriculares = array(); + + $expected->tipoFalta = $faltaAluno->get('tipoFalta'); + $expected->cursoHoraFalta = $cursoHoraFalta; + $expected->porcentagemPresencaRegra = $porcentagemPresenca; + $expected->cargaHoraria = $serieCargaHoraria; + + return $expected; + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/InicializacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/InicializacaoTest.php new file mode 100644 index 0000000..3adccc1 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/InicializacaoTest.php @@ -0,0 +1,99 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_InicializacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_InicializacaoTest extends Avaliacao_Service_TestCommon +{ + /** + * @expectedException CoreExt_Service_Exception + */ + public function testInstanciaLancaExcecaoCasoCodigoDeMatriculaNaoSejaInformado() + { + new Avaliacao_Service_Boletim(); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testInstanciaLancaExcecaoComOpcaoNaoAceitaPelaClasse() + { + new Avaliacao_Service_Boletim(array('matricula' => 1, 'foo' => 'bar')); + } + + public function testDadosDeMatriculaInicializados() + { + $service = $this->_getServiceInstance(); + $options = $service->getOptions(); + + $this->assertEquals($this->_getConfigOption('usuario', 'cod_usuario'), + $options['usuario']); + + $this->assertEquals($this->_getConfigOption('matricula', 'aprovado'), + $options['aprovado']); + + $this->assertEquals($this->_getConfigOption('curso', 'hora_falta'), + $options['cursoHoraFalta']); + + $this->assertEquals($this->_getConfigOption('curso', 'carga_horaria'), + $options['cursoCargaHoraria']); + + $this->assertEquals($this->_getConfigOption('serie', 'carga_horaria'), + $options['serieCargaHoraria']); + + $this->assertEquals(count($this->_getConfigOptions('anoLetivoModulo')), + $options['etapas']); + + $this->assertEquals($this->_getConfigOptions('componenteCurricular'), + $service->getComponentes()); + } + + public function testInstanciaRegraDeAvaliacaoAtravesDeUmNumeroDeMatricula() + { + $service = $this->_getServiceInstance(); + $this->assertType('RegraAvaliacao_Model_Regra', $service->getRegra()); + + // TabelaArredondamento_Model_Tabela é recuperada através da instância de + // RegraAvaliacao_Model_Regra + $this->assertType('TabelaArredondamento_Model_Tabela', $service->getTabelaArredondamento()); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/NotaAlunoTest.php b/ieducar/modules/Avaliacao/_tests/Service/NotaAlunoTest.php new file mode 100644 index 0000000..cdad93e --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/NotaAlunoTest.php @@ -0,0 +1,75 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; +require_once 'Avaliacao/Model/NotaComponente.php'; + +/** + * Avaliacao_Service_NotaAlunoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_NotaAlunoTest extends Avaliacao_Service_TestCommon +{ + public function testCriaNovaInstanciaDeNotaAluno() + { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + $notaSave = clone $notaAluno; + $notaSave->id = NULL; + + // Configura mock para Avaliacao_Model_NotaAlunoDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaAlunoDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($notaSave) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array($notaAluno))); + + $this->_setNotaAlunoDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/NotaConceitualSituacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/NotaConceitualSituacaoTest.php new file mode 100644 index 0000000..d352c77 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/NotaConceitualSituacaoTest.php @@ -0,0 +1,52 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/NotaSituacaoCommon.php'; + +/** + * Avaliacao_Service_NotaConceitualSituacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_NotaConceitualSituacaoTest extends Avaliacao_Service_NotaSituacaoCommon +{ + protected function setUp() + { + $this->_setRegraOption('tipoNota', RegraAvaliacao_Model_Nota_TipoValor::CONCEITUAL); + parent::setUp(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/NotaNumericaSituacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/NotaNumericaSituacaoTest.php new file mode 100644 index 0000000..73a2481 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/NotaNumericaSituacaoTest.php @@ -0,0 +1,47 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/NotaSituacaoCommon.php'; + +/** + * Avaliacao_Service_NotaNumericaSituacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_NotaNumericaSituacaoTest extends Avaliacao_Service_NotaSituacaoCommon +{ +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/NotaRecuperacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/NotaRecuperacaoTest.php new file mode 100644 index 0000000..cf2da10 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/NotaRecuperacaoTest.php @@ -0,0 +1,250 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_NotaRecuperacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_NotaRecuperacaoTest extends Avaliacao_Service_TestCommon +{ + public function testSalvarNotasDeUmComponenteCurricularNoBoletimEmRecuperacao() + { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $notas = array( + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 5, + 'etapa' => 1 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 5, + 'etapa' => 2 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 6, + 'etapa' => 3 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 6, + 'etapa' => 'Rc' + )), + ); + + $media = new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5.7, + 'mediaArredondada' => 5, + 'etapa' => 'Rc' + )); + + $media->markOld(); + + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($notas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($notas[1]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(3)) + ->method('save') + ->with($notas[2]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(4)) + ->method('save') + ->with($notas[3]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(5)) + ->method('save') + ->with($notas[4]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(6)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($notas)); + + $this->_setNotaComponenteDataMapperMock($mock); + + // Configura mock para Avaliacao_Model_NotaComponenteMediaDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id)) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('find') + ->with(array($notaAluno->id, $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array())); + + $mock->expects($this->at(2)) + ->method('save') + ->with($media) + ->will($this->returnValue(TRUE)); + + $this->_setNotaComponenteMediaDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addNotas($notas); + $service->saveNotas(); + + $notasSalvas = $service->getNotas(); + + $etapas = array_merge( + range(1, count($this->_getConfigOptions('anoLetivoModulo'))), + array('Rc') + ); + + foreach ($notasSalvas as $notaSalva) { + $key = array_search($notaSalva->etapa, $etapas, FALSE); + $this->assertTrue($key !== FALSE); + unset($etapas[$key]); + } + } + + public function testSalvarNotasDeUmComponenteCurricularNoBoletimEmRecuperacaoComNotasLancadas() + { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $notas = array( + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 5, + )) + ); + + $notasPersistidas = array( + new Avaliacao_Model_NotaComponente(array( + 'id' => 1, + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'nota' => 6, + 'notaArredondada' => 6, + 'etapa' => 1 + )), + new Avaliacao_Model_NotaComponente(array( + 'id' => 2, + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'nota' => 6, + 'notaArredondada' => 6, + 'etapa' => 2 + )), + new Avaliacao_Model_NotaComponente(array( + 'id' => 3, + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'nota' => 6, + 'notaArredondada' => 6, + 'etapa' => 3 + )), + new Avaliacao_Model_NotaComponente(array( + 'id' => 4, + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'nota' => 6, + 'notaArredondada' => 6, + 'etapa' => 4 + )) + ); + + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($notasPersistidas)); + + $mock->expects($this->at(1)) + ->method('save') + ->with($notas[0]) + ->will($this->returnValue(TRUE)); + + $notasSalvas = array_merge($notasPersistidas, $notas); + + $mock->expects($this->at(2)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($notasSalvas)); + + $this->_setNotaComponenteDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addNotas($notas); + $service->saveNotas(); + + $etapas = array_merge( + range(1, count($this->_getConfigOptions('anoLetivoModulo'))), + array('Rc') + ); + + foreach ($notasSalvas as $notaSalva) { + $key = array_search($notaSalva->etapa, $etapas, FALSE); + $this->assertTrue($key !== FALSE); + unset($etapas[$key]); + } + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/NotaSituacaoCommon.php b/ieducar/modules/Avaliacao/_tests/Service/NotaSituacaoCommon.php new file mode 100644 index 0000000..8a3f8f5 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/NotaSituacaoCommon.php @@ -0,0 +1,436 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_NotaSituacaoCommon abstract class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +abstract class Avaliacao_Service_NotaSituacaoCommon extends Avaliacao_Service_TestCommon +{ + protected function _setUpNotaComponenteMediaDataMapperMock( + Avaliacao_Model_NotaAluno $notaAluno, array $medias) + { + // Configura mock para notas + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); + + $mock->expects($this->any()) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id)) + ->will($this->returnValue($medias)); + + $this->_setNotaComponenteMediaDataMapperMock($mock); + } + + /** + * Nenhuma média lançada, óbvio que está em andamento. + */ + public function testSituacaoComponentesCurricularesEmAndamento() + { + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + $expected->componentesCurriculares = array(); + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, array()); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } + + /** + * Um componente em exame, já que por padrão a regra de avaliação define uma + * fórmula de recuperação. + */ + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotais() + { + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + $expected->componentesCurriculares = array(); + + // Matemática estará em exame + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME; + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $medias = array( + 1 => new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 4 + )) + ); + + // Configura mock para notas + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } + + /** + * Um componente em exame, já que por padrão a regra de avaliação define uma + * fórmula de recuperação. Quatro médias lançadas, 3 aprovadas. + */ + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosAprovados() + { + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME; + $expected->componentesCurriculares = array(); + + // Matemática estará em exame + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $medias = array( + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 2, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 3, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 4, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )) + ); + + // Configura mock para notas + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } + + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosDoisAprovadosUmAndamento() + { + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + $expected->componentesCurriculares = array(); + + // Matemática estará em exame + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::EM_ANDAMENTO; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $medias = array( + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 2, + 'media' => 5.75, + 'mediaArredondada' => 5, + 'etapa' => 3 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 3, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 4, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )) + ); + + // Configura mock para notas + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } + + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosUmAprovadoAposExameEDoisAprovados() + { + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME; + $expected->componentesCurriculares = array(); + + // Matemática estará em exame + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $medias = array( + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 2, + 'media' => 6.5, + 'mediaArredondada' => 6, + 'etapa' => 'Rc' + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 3, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 4, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )) + ); + + // Configura mock para notas + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } + + public function testSituacaoComponentesCurricularesUmComponenteLancadoEmExameDeQuatroComponentesTotaisLancadosUmAprovadoAposExameUmReprovadoEOutroAprovado() + { + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::EM_EXAME; + $expected->componentesCurriculares = array(); + + // Matemática estará em exame + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::EM_EXAME; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO_APOS_EXAME; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::REPROVADO; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $medias = array( + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 2, + 'media' => 6.5, + 'mediaArredondada' => 6, + 'etapa' => 'Rc' + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 3, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 'Rc' + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 4, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )) + ); + + // Configura mock para notas + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } + +/** + * Um componente reprovado, com uma regra sem recuperação. Quatro médias + * lançadas, 3 aprovadas. + */ + public function testSituacaoComponentesCurricularesUmComponenteLancadoReprovadoUmComponenteAbaixoDaMedia() + { + $this->_setRegraOption('formulaRecuperacao', NULL); + + // Expectativa + $expected = new stdClass(); + $expected->situacao = App_Model_MatriculaSituacao::REPROVADO; + $expected->componentesCurriculares = array(); + + // Matemática estará em exame + $expected->componentesCurriculares[1] = new stdClass(); + $expected->componentesCurriculares[1]->situacao = App_Model_MatriculaSituacao::REPROVADO; + + $expected->componentesCurriculares[2] = new stdClass(); + $expected->componentesCurriculares[2]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->componentesCurriculares[3] = new stdClass(); + $expected->componentesCurriculares[3]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $expected->componentesCurriculares[4] = new stdClass(); + $expected->componentesCurriculares[4]->situacao = App_Model_MatriculaSituacao::APROVADO; + + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + // Nenhuma média lançada + $medias = array( + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 5, + 'mediaArredondada' => 5, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 2, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 3, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )), + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 4, + 'media' => 6, + 'mediaArredondada' => 6, + 'etapa' => 4 + )) + ); + + // Configura mock para notas + $this->_setUpNotaComponenteMediaDataMapperMock($notaAluno, $medias); + + $service = $this->_getServiceInstance(); + + $this->assertEquals($expected, $service->getSituacaoComponentesCurriculares()); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/NotaTest.php b/ieducar/modules/Avaliacao/_tests/Service/NotaTest.php new file mode 100644 index 0000000..c388f25 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/NotaTest.php @@ -0,0 +1,323 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; +require_once 'Avaliacao/Model/NotaComponente.php'; + +/** + * Avaliacao_Service_NotaTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_NotaTest extends Avaliacao_Service_TestCommon +{ + public function testInstanciaDeNotaComponenteERegistradaApenasUmaVezNoBoletiom() + { + $service = $this->_getServiceInstance(); + + $nota = new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 5 + )); + + // Atribuição simples + $service->addNota($nota) + ->addNota($nota); + + $this->assertEquals(1, count($service->getNotas())); + + // Via atribuição em lote + $nota = clone $nota; + $service->addNotas(array($nota, $nota, $nota)); + + $this->assertEquals(2, count($service->getNotas())); + } + + public function testAdicionaNotaNoBoletim() + { + $service = $this->_getServiceInstance(); + + $nota = new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 5.72 + )); + + $notaOriginal = clone $nota; + $service->addNota($nota); + + $notas = $service->getNotas(); + $serviceNota = array_shift($notas); + + // Valores declarados explicitamente, verificação explícita + $this->assertEquals($notaOriginal->nota, $serviceNota->nota); + $this->assertEquals($notaOriginal->get('componenteCurricular'), $serviceNota->get('componenteCurricular')); + + // Valores populados pelo service + $this->assertNotEquals($notaOriginal->etapa, $serviceNota->etapa); + $this->assertEquals(1, $serviceNota->etapa); + $this->assertEquals(5, $serviceNota->notaArredondada); + + // Validadores injetados no objeto + $validators = $serviceNota->getValidatorCollection(); + $this->assertType('CoreExt_Validate_Choice', $validators['componenteCurricular']); + $this->assertType('CoreExt_Validate_Choice', $validators['etapa']); + + // Opções dos validadores + + // Componentes curriculares existentes para o aluno + $this->assertEquals( + array_keys($this->_getConfigOptions('componenteCurricular')), + array_values($validators['componenteCurricular']->getOption('choices')) + ); + + // Etapas possíveis para o lançamento de nota + $this->assertEquals( + array_merge(range(1, count($this->_getConfigOptions('anoLetivoModulo'))), array('Rc')), + $validators['etapa']->getOption('choices') + ); + } + + /** + * Testa o service adicionando notas de apenas um componente curricular, + * para todas as etapas regulares (1 a 4). + */ + public function testSalvarNotasDeUmComponenteCurricularNoBoletim() + { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $notas = array( + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 7.25, + 'etapa' => 1 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 9.25, + 'etapa' => 2 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 8, + 'etapa' => 3 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 8.5, + 'etapa' => 4 + )), + ); + + $media = new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 8.25, + 'mediaArredondada' => 8, + 'etapa' => 4 + )); + + $media->markOld(); + + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($notas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($notas[1]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(3)) + ->method('save') + ->with($notas[2]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(4)) + ->method('save') + ->with($notas[3]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(5)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($notas)); + + $this->_setNotaComponenteDataMapperMock($mock); + + // Configura mock para Avaliacao_Model_NotaComponenteMediaDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id)) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('find') + ->with(array($notaAluno->id, $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(NULL)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($media) + ->will($this->returnValue(TRUE)); + + $this->_setNotaComponenteMediaDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + + $service->addNotas($notas); + $service->saveNotas(); + } + + /** + * Testa o service adicionando novas notas para um componente curricular, + * que inclusive já tem a nota lançada para a segunda etapa. + */ + public function testSalvasNotasDeUmComponenteComEtapasLancadas() + { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $notas = array( + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 7.25, + 'etapa' => 2 + )), + new Avaliacao_Model_NotaComponente(array( + 'componenteCurricular' => 1, + 'nota' => 9.25, + 'etapa' => 3 + )) + ); + + $notasPersistidas = array( + new Avaliacao_Model_NotaComponente(array( + 'id' => 1, + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'nota' => 8.25, + 'notaArredondada' => 8, + 'etapa' => 1 + )), + new Avaliacao_Model_NotaComponente(array( + 'id' => 2, + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'nota' => 9.5, + 'notaArredondada' => 9, + 'etapa' => 2 + )) + ); + + $mediasPersistidas = array( + new Avaliacao_Model_NotaComponenteMedia(array( + 'notaAluno' => $notaAluno->id, + 'componenteCurricular' => 1, + 'media' => 4.4375, + 'mediaArredondada' => 4, + 'etapa' => 2 + )) + ); + + $mediasPersistidas[0]->markOld(); + + // Configura mock para Avaliacao_Model_NotaComponenteDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($notasPersistidas)); + + $mock->expects($this->at(1)) + ->method('save') + ->with($notas[0]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('save') + ->with($notas[1]) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(3)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array($notasPersistidas[0], $notas[0], $notas[1]))); + + $this->_setNotaComponenteDataMapperMock($mock); + + // Configura mock para Avaliacao_Model_NotaComponenteMediaDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id)) + ->will($this->returnValue($mediasPersistidas)); + + $mock->expects($this->at(1)) + ->method('find') + ->with(array($notaAluno->id, $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue($mediasPersistidas[0])); + + // Valores de média esperados + $media = clone $mediasPersistidas[0]; + $media->etapa = 3; + $media->media = 6.1875; + $media->mediaArredondada = 6; + + $mock->expects($this->at(2)) + ->method('save') + ->with($media) + ->will($this->returnValue(TRUE)); + + $this->_setNotaComponenteMediaDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addNotas($notas); + $service->saveNotas(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoAlunoTest.php b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoAlunoTest.php new file mode 100644 index 0000000..677e4d6 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoAlunoTest.php @@ -0,0 +1,75 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_ParecerDescritivoAlunoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_ParecerDescritivoAlunoTest extends Avaliacao_Service_TestCommon +{ + public function testCriaNovaInstanciaDeParecerDescritivoAluno() + { + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance'); + + $parecerSave = clone $parecerAluno; + $parecerSave->id = NULL; + + // Configura mock para Avaliacao_Model_ParecerDescritivoAlunoDataMapper + $mock = $this->getCleanMock('Avaliacao_Model_ParecerDescritivoAlunoDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array())); + + $mock->expects($this->at(1)) + ->method('save') + ->with($parecerSave) + ->will($this->returnValue(TRUE)); + + $mock->expects($this->at(2)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array($parecerAluno))); + + $this->_setParecerDescritivoAlunoDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoCommon.php b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoCommon.php new file mode 100644 index 0000000..d549bd7 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoCommon.php @@ -0,0 +1,277 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_ParecerDescritivoCommon abstract class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +abstract class Avaliacao_Service_ParecerDescritivoCommon extends Avaliacao_Service_TestCommon +{ + /** + * Retorna as etapas possíveis para a instância do parecer. + * @return array + */ + protected function _getEtapasPossiveisParecer() + { + $parecerDescritivo = $this->_getRegraOption('parecerDescritivo'); + + $anuais = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE + ); + + $etapas = array( + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL, + RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE + ); + + if (in_array($parecerDescritivo, $anuais)) { + return array('An'); + } + + return $this->_getEtapasPossiveis(); + } + + /** + * Retorna o nome da classe CoreExt_DataMapper correta de acordo com a + * configuração da regra. Método auxiliar para criação de mocks. + * + * @return string + */ + protected function _getParecerDescritivoDataMapper() + { + $parecerDescritivo = $this->_getRegraOption('parecerDescritivo'); + + switch($parecerDescritivo) { + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_GERAL: + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL: + $mapper = 'Avaliacao_Model_ParecerDescritivoGeralDataMapper'; + break; + case RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE: + case RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE: + $mapper = 'Avaliacao_Model_ParecerDescritivoComponenteDataMapper'; + break; + } + + return $mapper; + } + + /** + * @return Avaliacao_Model_ParecerDescritivoAbstract + * @see Avaliacao_Service_ParecerDescritivoCommon#testInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + */ + protected abstract function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim(); + + /** + * @return Avaliacao_Model_ParecerDescritivoAbstract + * @see Avaliacao_Service_ParecerDescritivoCommon#testAdicionaParecerNoBoletim() + */ + protected abstract function _getTestAdicionaParecerNoBoletim(); + + /** + * @param Avaliacao_Model_ParecerDescritivoAbstract $parecer + * @see Avaliacao_Service_ParecerDescritivoCommon#testAdicionaParecerNoBoletim() + */ + protected abstract function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer); + + /** + * @return array + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvarPareceresNoBoletim() + */ + protected abstract function _getTestSalvarPareceresNoBoletimInstanciasDePareceres(); + + /** + * @return array + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvarPareceresNoBoletimComEtapasJaLancadas() + */ + protected abstract function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias(); + + /** + * @return array + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvarPareceresNoBoletimComEtapasJaLancadas() + */ + protected abstract function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas(); + + /** + * @return array + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas() + */ + protected abstract function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias(); + + /** + * @return array + * @see Avaliacao_Service_ParecerDescritivoCommon#testSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas() + */ + protected abstract function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas(); + + /** + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + */ + public function testInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + { + $service = $this->_getServiceInstance(); + + $parecer = $this->_getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim(); + + $service->addParecer($parecer) + ->addParecer($parecer); + + $this->assertEquals(1, count($service->getPareceres())); + + $parecer = clone $parecer; + $service->addPareceres(array($parecer, $parecer, $parecer)); + + $this->assertEquals(2, count($service->getPareceres())); + } + + /** + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestAdicionaParecerNoBoletim() + * @see Avaliacao_Service_ParecerDescritivoCommon#_testAdicionaParecerNoBoletimVerificaValidadores() + */ + public function testAdicionaParecerNoBoletim() + { + $service = $this->_getServiceInstance(); + + $parecer = $this->_getTestAdicionaParecerNoBoletim(); + + $parecerOriginal = clone $parecer; + $service->addParecer($parecer); + + $pareceres = $service->getPareceres(); + $serviceParecer = array_shift($pareceres); + + $this->_testAdicionaParecerNoBoletimVerificaValidadores($serviceParecer); + } + + /** + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvarPareceresNoBoletimInstanciasDePareceres() + */ + public function testSalvarPareceresNoBoletim() + { + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance'); + + $pareceres = $this->_getTestSalvarPareceresNoBoletimInstanciasDePareceres(); + + // Configura mock para Avaliacao_Model_Parecer + $mock = $this->getCleanMock($this->_getParecerDescritivoDataMapper()); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + foreach ($pareceres as $i => $parecer) { + $mock->expects($this->at($i + 1)) + ->method('save') + ->with($parecer) + ->will($this->returnValue(TRUE)); + } + + $this->_setParecerDescritivoAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addPareceres($pareceres); + $service->savePareceres(); + } + + /** + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias() + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas() + */ + public function testSalvarPareceresNoBoletimComEtapasJaLancadas() + { + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance'); + + $pareceres = $this->_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias(); + + // Configura mock para Avaliacao_Model_Parecer + $mock = $this->getCleanMock($this->_getParecerDescritivoDataMapper()); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($this->_getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas())); + + foreach ($pareceres as $i => $parecer) { + $mock->expects($this->at($i + 1)) + ->method('save') + ->with($parecer) + ->will($this->returnValue(TRUE)); + } + + $this->_setParecerDescritivoAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addPareceres($pareceres); + $service->savePareceres(); + } + + /** + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias() + * @see Avaliacao_Service_ParecerDescritivoCommon#_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas() + */ + public function testSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadas() + { + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance'); + + $pareceres = $this->_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias(); + + // Configura mock para Avaliacao_Model_Parecer + $mock = $this->getCleanMock($this->_getParecerDescritivoDataMapper()); + + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue($this->_getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas())); + + foreach ($pareceres as $i => $parecer) { + $mock->expects($this->at($i + 1)) + ->method('save') + ->with($parecer) + ->will($this->returnValue(TRUE)); + } + + $this->_setParecerDescritivoAbstractDataMapperMock($mock); + + $service = $this->_getServiceInstance(); + $service->addPareceres($pareceres); + $service->savePareceres(); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteAnualTest.php b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteAnualTest.php new file mode 100644 index 0000000..1ff028c --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteAnualTest.php @@ -0,0 +1,165 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php'; + +/** + * Avaliacao_Service_ParecerDescritivoComponenteAnualTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_ParecerDescritivoComponenteAnualTest extends Avaliacao_Service_ParecerDescritivoCommon +{ + protected function setUp() + { + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ANUAL_COMPONENTE); + parent::setUp(); + } + + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'Ok.' + )); + } + + protected function _getTestAdicionaParecerNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.' + )); + } + + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 2, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 3, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 4, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 2, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 2, + 'parecer' => 'N/D.', + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )), + ); + } + + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer) + { + $this->assertEquals(1, $parecer->get('componenteCurricular')); + $this->assertEquals('An', $parecer->etapa); + $this->assertEquals('N/D.', $parecer->parecer); + + $validators = $parecer->getValidatorCollection(); + + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices')); + + $this->assertEquals( + $this->_getComponentesCursados(), + array_values($validators['componenteCurricular']->getOption('choices')) + ); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteEtapaTest.php b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteEtapaTest.php new file mode 100644 index 0000000..cb62e52 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoComponenteEtapaTest.php @@ -0,0 +1,189 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php'; + +/** + * Avaliacao_Service_ParecerDescritivoComponenteEtapaTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_ParecerDescritivoComponenteEtapaTest extends Avaliacao_Service_ParecerDescritivoCommon +{ + protected function setUp() + { + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_COMPONENTE); + parent::setUp(); + } + + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'Ok.' + )); + } + + protected function _getTestAdicionaParecerNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.' + )); + } + + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 1 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 2 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 3 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 4 + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 1 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 2, + 'parecer' => 'N/D.', + 'etapa' => 1 + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 1 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 2, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 1 + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/A.', + 'etapa' => 4 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'componenteCurricular' => 1, + 'parecer' => 'N/D.' + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 1, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 1 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 2, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 2 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 3, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 3 + )), + new Avaliacao_Model_ParecerDescritivoComponente(array( + 'id' => 4, + 'componenteCurricular' => 1, + 'parecer' => 'N/D.', + 'etapa' => 4 + )), + ); + } + + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer) + { + $this->assertEquals(1, $parecer->get('componenteCurricular')); + $this->assertEquals(1, $parecer->etapa); + $this->assertEquals('N/D.', $parecer->parecer); + + $validators = $parecer->getValidatorCollection(); + + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices')); + + $this->assertEquals( + $this->_getComponentesCursados(), + array_values($validators['componenteCurricular']->getOption('choices')) + ); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralAnualTest.php b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralAnualTest.php new file mode 100644 index 0000000..dc94cbb --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralAnualTest.php @@ -0,0 +1,128 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php'; + +/** + * Avaliacao_Service_ParecerDescritivoGeralAnualTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_ParecerDescritivoGeralAnualTest extends Avaliacao_Service_ParecerDescritivoCommon +{ + protected function setUp() + { + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL); + parent::setUp(); + } + + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'Ok.' + )); + } + + protected function _getTestAdicionaParecerNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.' + )); + } + + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.' + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 1, + 'parecer' => 'N/D.', + 'etapa' => 'An' + )) + ); + } + + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer) + { + $this->assertEquals(1, $parecer->etapa); + $this->assertEquals('N/D.', $parecer->parecer); + + $validators = $parecer->getValidatorCollection(); + + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices')); + $this->assertFalse(isset($validators['componenteCurricular'])); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralEtapaTest.php b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralEtapaTest.php new file mode 100644 index 0000000..28cd9fe --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/ParecerDescritivoGeralEtapaTest.php @@ -0,0 +1,168 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/ParecerDescritivoCommon.php'; + +/** + * Avaliacao_Service_ParecerDescritivoGeralEtapaTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_ParecerDescritivoGeralEtapaTest extends Avaliacao_Service_ParecerDescritivoCommon +{ + protected function setUp() + { + $this->_setRegraOption('parecerDescritivo', RegraAvaliacao_Model_TipoParecerDescritivo::ETAPA_GERAL); + parent::setUp(); + } + + protected function _getTestInstanciaDeParecerERegistradaApenasUmaVezNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'Ok.' + )); + } + + protected function _getTestAdicionaParecerNoBoletim() + { + return new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.' + )); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.', + 'etapa' => 2 + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.', + 'etapa' => 3 + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimComEtapasJaLancadasInstanciasJaLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 1, + 'parecer' => 'N/D.', + 'etapa' => 1 + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 1, + 'parecer' => 'N/D.', + 'etapa' => 2 + )) + ); + } + + protected function _getTestSalvarPareceresNoBoletimInstanciasDePareceres() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'etapa' => 1, + 'parecer' => 'N/D.' + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'etapa' => 2, + 'parecer' => 'N/D.' + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'etapa' => 3, + 'parecer' => 'N/D.' + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'etapa' => 4, + 'parecer' => 'N/D.' + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstancias() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.', + 'etapa' => 4 + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'parecer' => 'N/D.', + )) + ); + } + + protected function _getTestSalvasPareceresAtualizandoEtapaDaUltimaInstanciaAdicionadaNoBoletimComEtapasLancadasInstanciasLancadas() + { + return array( + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 1, + 'parecer' => 'N/D.', + 'etapa' => 2 + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 2, + 'parecer' => 'N/D.', + 'etapa' => 2 + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 3, + 'parecer' => 'N/D.', + 'etapa' => 3 + )), + new Avaliacao_Model_ParecerDescritivoGeral(array( + 'id' => 4, + 'parecer' => 'N/D.', + 'etapa' => 4 + )), + ); + } + + protected function _testAdicionaParecerNoBoletimVerificaValidadores(Avaliacao_Model_ParecerDescritivoAbstract $parecer) + { + $this->assertEquals(1, $parecer->etapa); + $this->assertEquals('N/D.', $parecer->parecer); + + $validators = $parecer->getValidatorCollection(); + + $this->assertEquals($this->_getEtapasPossiveisParecer(), $validators['etapa']->getOption('choices')); + $this->assertFalse(isset($validators['componenteCurricular'])); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/PromocaoAlunoTest.php b/ieducar/modules/Avaliacao/_tests/Service/PromocaoAlunoTest.php new file mode 100644 index 0000000..48eec22 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/PromocaoAlunoTest.php @@ -0,0 +1,531 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_PromocaoAlunoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_PromocaoAlunoTest extends Avaliacao_Service_TestCommon +{ + protected function _setUpRegraAvaliacaoMock($tipoProgressao) + { + $mock = $this->getCleanMock('RegraAvaliacao_Model_Regra'); + $mock->expects($this->at(0)) + ->method('get') + ->with('tipoProgressao') + ->will($this->returnValue($tipoProgressao)); + + return $mock; + } + + /** + * @expectedException CoreExt_Service_Exception + */ + public function testPromoverAlunoLancaExcecaoCasoSituacaoEstejaEmAndamento() + { + $situacao = new stdClass(); + $situacao->aprovado = FALSE; + $situacao->andamento = TRUE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->promover(); + } + + /** + * @expectedException CoreExt_Service_Exception + */ + public function testPromoverAlunoLancaExcecaoCasoMatriculaDoAlunoJaEstejaAprovadaOuReprovada() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::APROVADO)); + + $service->promover(); + } + + public function testPromoverAlunoAutomaticamenteProgressaoContinuada() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::CONTINUADA); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + $service->expects($this->at(5)) + ->method('_updateMatricula') + ->with($codMatricula, $codUsuario, TRUE) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($service->promover()); + } + + public function testPromoverAlunoAutomaticamenteProgressaoNaoContinuadaAutoMediaPresenca() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + $service->expects($this->at(5)) + ->method('_updateMatricula') + ->with($codMatricula, $codUsuario, TRUE) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($service->promover()); + } + + public function testReprovarAlunoAutomaticamenteProgressaoNaoContinuadaAutoMediaPresenca() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = TRUE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_MEDIA_PRESENCA); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + $service->expects($this->at(5)) + ->method('_updateMatricula') + ->with($codMatricula, $codUsuario, FALSE) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($service->promover()); + } + + public function testPromoverAlunoAutomaticamenteProgressaoNaoContinuadaAutoMedia() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = TRUE; // Não considera retenção por falta + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_AUTO_SOMENTE_MEDIA); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + $service->expects($this->at(5)) + ->method('_updateMatricula') + ->with($codMatricula, $codUsuario, TRUE) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($service->promover()); + } + + public function testPromoverAlunoManualmenteProgressaoNaoContinuadaLancaExcecaoSeNaoConfirmada() + { + $situacao = new stdClass(); + $situacao->aprovado = FALSE; // Reprovado por nota + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + try { + $service->promover(); + $this->fail('Invocar o método "->promover()" sem uma confirmação booleana ' + . 'explícita (TRUE ou FALSE) em uma progressão "NAO_CONTINUADA_MANUAL" ' + . 'causa exceção.'); + } + catch (CoreExt_Service_Exception $e) + { + } + } + + public function testPromoverAlunoManualmenteProgressaoNaoContinuada() + { + $situacao = new stdClass(); + $situacao->aprovado = FALSE; // Reprovado por nota + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + $service->expects($this->at(5)) + ->method('_updateMatricula') + ->with($codMatricula, $codUsuario, TRUE) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($service->promover(TRUE)); + } + + public function testReprovarAlunoManualmenteProgressaoNaoContinuada() + { + $situacao = new stdClass(); + $situacao->aprovado = FALSE; // Reprovado por nota + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::NAO_CONTINUADA_MANUAL); + + $service = $this->setExcludedMethods(array('promover')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + $service->expects($this->at(5)) + ->method('_updateMatricula') + ->with($codMatricula, $codUsuario, FALSE) + ->will($this->returnValue(TRUE)); + + $this->assertTrue($service->promover(FALSE)); + } + + public function testSaveBoletim() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + $service = $this->setExcludedMethods(array('save')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('saveNotas') + ->will($this->returnValue($service)); + + $service->expects($this->at(1)) + ->method('saveFaltas') + ->will($this->returnValue($service)); + + $service->expects($this->at(2)) + ->method('savePareceres') + ->will($this->returnValue($service)); + + $service->expects($this->at(3)) + ->method('promover') + ->will($this->returnValue(TRUE)); + + try { + $service->save(); + } + catch (Exception $e) { + $this->fail('O método "->save()" não deveria ter lançado exceção com o ' + . 'cenário de teste configurado.'); + } + } + + public function testIntegracaoMatriculaPromoverAluno() + { + $situacao = new stdClass(); + $situacao->aprovado = TRUE; + $situacao->andamento = FALSE; + $situacao->recuperacao = FALSE; + $situacao->retidoFalta = FALSE; + + $codMatricula = $this->_getConfigOption('matricula', 'cod_matricula'); + $codUsuario = $this->_getConfigOption('usuario', 'cod_usuario'); + + // Mock para RegraAvaliacao_Model_Regra + $regra = $this->_setUpRegraAvaliacaoMock(RegraAvaliacao_Model_TipoProgressao::CONTINUADA); + + $service = $this->setExcludedMethods(array('promover', '_updateMatricula')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $service->expects($this->at(0)) + ->method('getSituacaoAluno') + ->will($this->returnValue($situacao)); + + $service->expects($this->at(1)) + ->method('getOption') + ->with('aprovado') + ->will($this->returnValue(App_Model_MatriculaSituacao::EM_ANDAMENTO)); + + $service->expects($this->at(2)) + ->method('getRegra') + ->will($this->returnValue($regra)); + + $service->expects($this->at(3)) + ->method('getOption') + ->with('matricula') + ->will($this->returnValue($codMatricula)); + + $service->expects($this->at(4)) + ->method('getOption') + ->with('usuario') + ->will($this->returnValue($codUsuario)); + + // Configura mock de instância de classe legada + $matricula = $this->getCleanMock('clsPmieducarMatricula'); + + $matricula->expects($this->at(0)) + ->method('edita') + ->will($this->returnValue(TRUE)); + + CoreExt_Entity::addClassToStorage('clsPmieducarMatricula', $matricula, + 'include/pmieducar/clsPmieducarMatricula.inc.php', TRUE); + + $this->assertTrue($service->promover()); + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/SituacaoTest.php b/ieducar/modules/Avaliacao/_tests/Service/SituacaoTest.php new file mode 100644 index 0000000..e408d6c --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/SituacaoTest.php @@ -0,0 +1,121 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_SituacaoTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_SituacaoTest extends Avaliacao_Service_TestCommon +{ + public function testSituacaoAluno() + { + $notaSituacoes = array( + 1 => App_Model_MatriculaSituacao::APROVADO, + 2 => App_Model_MatriculaSituacao::APROVADO_APOS_EXAME, + 3 => App_Model_MatriculaSituacao::EM_ANDAMENTO, + 4 => App_Model_MatriculaSituacao::EM_EXAME, + 5 => App_Model_MatriculaSituacao::REPROVADO + ); + + $faltaSituacoes = array( + 1 => App_Model_MatriculaSituacao::EM_ANDAMENTO, + 2 => App_Model_MatriculaSituacao::APROVADO, + 3 => App_Model_MatriculaSituacao::REPROVADO + ); + + // Possibilidades + $expected = array( + 1 => array( + 1 => array(FALSE, TRUE, FALSE, FALSE), + 2 => array(TRUE, FALSE, FALSE, FALSE), + 3 => array(FALSE, FALSE, TRUE, FALSE) + ), + 2 => array( + 1 => array(FALSE, TRUE, FALSE, TRUE), + 2 => array(TRUE, FALSE, FALSE, TRUE), + 3 => array(FALSE, FALSE, TRUE, TRUE) + ), + 3 => array( + 1 => array(FALSE, TRUE, FALSE, FALSE), + 2 => array(FALSE, TRUE, FALSE, FALSE), + 3 => array(FALSE, TRUE, TRUE, FALSE) + ), + 4 => array( + 1 => array(FALSE, TRUE, FALSE, TRUE), + 2 => array(FALSE, TRUE, FALSE, TRUE), + 3 => array(FALSE, TRUE, TRUE, TRUE) + ), + 5 => array( + 1 => array(FALSE, TRUE, FALSE, FALSE), + 2 => array(FALSE, FALSE, FALSE, FALSE), + 3 => array(FALSE, FALSE, TRUE, FALSE) + ) + ); + + foreach ($notaSituacoes as $i => $notaSituacao) { + $nota = new stdClass(); + $nota->situacao = $notaSituacao; + + foreach ($faltaSituacoes as $ii => $faltaSituacao) { + $service = $this->setExcludedMethods(array('getSituacaoAluno')) + ->getCleanMock('Avaliacao_Service_Boletim'); + + $falta = new stdClass(); + $falta->situacao = $faltaSituacao; + + $service->expects($this->once()) + ->method('getSituacaoComponentesCurriculares') + ->will($this->returnValue($nota)); + + $service->expects($this->once()) + ->method('getSituacaoFaltas') + ->will($this->returnValue($falta)); + + // Testa + $situacao = $service->getSituacaoAluno(); + + $this->assertEquals($expected[$i][$ii][0], $situacao->aprovado, "Aprovado, caso $i - $ii"); + $this->assertEquals($expected[$i][$ii][1], $situacao->andamento, "Andamento, caso $i - $ii"); + $this->assertEquals($expected[$i][$ii][2], $situacao->retidoFalta, "Retido por falta, caso $i - $ii"); + $this->assertEquals($expected[$i][$ii][3], $situacao->recuperacao, "Recuperação, caso $i - $ii"); + } + } + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php b/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php new file mode 100644 index 0000000..8bdbc9c --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/TestCommon.php @@ -0,0 +1,951 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'include/pmieducar/clsPmieducarMatricula.inc.php'; +require_once 'include/pmieducar/clsPmieducarSerie.inc.php'; +require_once 'include/pmieducar/clsPmieducarCurso.inc.php'; +require_once 'include/pmieducar/clsPmieducarEscolaSerieDisciplina.inc.php'; +require_once 'include/pmieducar/clsPmieducarDispensaDisciplina.inc.php'; + +require_once 'AreaConhecimento/Model/AreaDataMapper.php'; + +require_once 'FormulaMedia/Model/Formula.php'; +require_once 'FormulaMedia/Model/FormulaDataMapper.php'; + +require_once 'TabelaArredondamento/Model/TabelaValor.php'; +require_once 'TabelaArredondamento/Model/TabelaValorDataMapper.php'; + +require_once 'TabelaArredondamento/Model/Tabela.php'; +require_once 'TabelaArredondamento/Model/TabelaDataMapper.php'; + +require_once 'RegraAvaliacao/Model/Regra.php'; +require_once 'RegraAvaliacao/Model/RegraDataMapper.php'; + +require_once 'Avaliacao/Model/NotaAlunoDataMapper.php'; +require_once 'Avaliacao/Model/NotaComponenteDataMapper.php'; +require_once 'Avaliacao/Model/NotaComponenteMediaDataMapper.php'; + +require_once 'Avaliacao/Model/FaltaAlunoDataMapper.php'; +require_once 'Avaliacao/Model/FaltaGeralDataMapper.php'; +require_once 'Avaliacao/Model/FaltaComponenteDataMapper.php'; + +require_once 'Avaliacao/Model/ParecerDescritivoAlunoDataMapper.php'; +require_once 'Avaliacao/Model/ParecerDescritivoAbstractDataMapper.php'; +require_once 'Avaliacao/Model/ParecerDescritivoComponenteDataMapper.php'; +require_once 'Avaliacao/Model/ParecerDescritivoGeralDataMapper.php'; + +require_once 'Avaliacao/Service/Boletim.php'; + +/** + * Avaliacao_Service_TestCommon abstract class. + * + * Configura o service Avaliacao_Service_Boletim com mocks de suas dependências + * para que seja mais simples o processo de teste dos diversos comportamentos. + * A configuração básica segue o melhor cenário: as instâncias de + * Avaliacao_Model_NotaAluno e Avaliacao_Model_FaltaAluno existirão. Nenhuma + * nota, média ou falta terá sido lançada. + * + * Alguns métodos podem ser sobrescritos para que os mocks retornem o + * comportamento desejado para a sessão de testes (como os métodos + * _getMatricula(), _getSerie()) ou, pode-se usar o setter _setConfigOption() + * para alterar apenas um dos valores default da classe. + * + * A configuração padrão do service é constituída de: + * - Código do usuário: 1 + * - Código de matrícula: 1 + * - RegraAvaliacao_Model_RegraDataMapper: configuração ampla. Ver o array + * $_regraOptions e o método _setRegraOption para entender a configuração + * da instância + * - ComponenteCurricular_Model_ComponenteDataMapper: mock que retorna + * diferentes instâncias de ComponenteCurricular_Model_Componente em cada + * chamada. Essas instâncias são definidas na opção 'componenteCurricular' + * do array $_config. Esses componentes correspondem com os valores + * retornados pelos mocks de classes legadas (configuradas nos métodos + * _setUp*Mock() + * - Avaliacao_Model_NotaAlunoDataMapper: mock que retorna uma instância + * de Avaliacao_Model_NotaAluno com as configurações padrão + * - Avaliacao_Model_NotaComponenteDataMapper: mock que retorna um array + * vazio. Não existem notas lançadas para o aluno + * - Avaliacao_Model_NotaComponenteMediaDataMapper: mock que retorna um array + * vazio. Não existem médias lançadas para o aluno + * - Avaliacao_Model_FaltaAlunoDataMapper: mock que retorna uma instância + * de Avaliacao_Model_FaltaAluno com as configurações padrão + * - Avaliacao_Model_FaltaAbstractDataMapper: mock que retorna um array + * vazio. Não existem faltas lançadas para o aluno. + * OBSERVAÇÃO: métodos que sobrescreverem este, devem estar conscientes de + * que é necessário configurar o mock para retornar objeto(s) de acordo + * com o 'tipoPresenca' da instância de 'RegraAvaliacao_Model_Regra'. Ver o + * array $_regraOptions para mais informações. + * + * Outro ponto fundamental é entender que boa parte da inicialização do service + * constitui a chamadas de instâncias das classes legadas, encapsuladas nos + * métodos de App_Model_IedFinder. Estes são configurados nos métodos + * _setUp*Mock(). Para alterar o comportamento desses métodos, existem duas + * opções: + * + * - Chamar o método _setConfigOptions() ou setConfigOption em uma sobrescrição + * de setUp() + * - Sobrescrever o método + * + * Recomenda-se usar os métodos _setConfigOption e _setRegraOption a + * sobrescrever os métodos já que proporcionam mais possibilidade de + * configuração para cada método de teste. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +abstract class Avaliacao_Service_TestCommon extends UnitBaseTest +{ + /** + * Array com as diretrizes de configuração para uso nas dependências de + * Avaliacao_Service_Boletim. + * @var array + */ + protected $_config = array(); + + /** + * @var RegraAvaliacao_Model_RegraDataMapper + */ + protected $_regraDataMapperMock = NULL; + + /** + * Opções de configuração para RegraAvaliacao_Model_RegraDataMapper. Por + * padrão, a regra terá: + * + * - Identificador "1" + * - Nome "Regra geral" + * - Tipo de nota numérica + * - Progressão continuada + * - Presença por componente + * - Nenhum parecer descritivo + * - Média para promoção de "6" + * - Tabela de arredondamento com valores de 0 a 10 + * - Fórmula de média aritmética simples (Soma etapas / Qtde etapas) + * - Fórmula de recuperação ponderada (Soma etapas x 0.6 + Recuperação x 0.4) + * - Porcentagem de presença mínima de "75%" + * + * Para alterar algum desses valores, basta usar o método + * _setRegraOption($key, $value) onde $key é a chave do array e $value o valor + * a ser usado. + * + * @var array + */ + protected $_regraOptions = array( + 'id' => 1, + 'nome' => 'Regra geral', + 'tipoNota' => RegraAvaliacao_Model_Nota_TipoValor::NUMERICA, + 'tipoProgressao' => RegraAvaliacao_Model_TipoProgressao::CONTINUADA, + 'tipoPresenca' => RegraAvaliacao_Model_TipoPresenca::POR_COMPONENTE, + 'parecerDescritivo' => RegraAvaliacao_Model_TipoParecerDescritivo::NENHUM, + 'media' => 6, + 'tabelaArredondamento' => NULL, + 'formulaMedia' => NULL, + 'formulaRecuperacao' => NULL, + 'porcentagemPresenca' => 75 + ); + + protected $_componenteDataMapperMock = NULL; + + protected $_notaAlunoDataMapperMock = NULL; + + protected $_notaComponenteDataMapperMock = NULL; + + protected $_notaComponenteMediaDataMapperMock = NULL; + + protected $_faltaAlunoDataMapperMock = NULL; + + protected $_faltaAbstractDataMapperMock = NULL; + + protected $_parecerDescritivoAlunoDataMapperMock = NULL; + + protected $_parecerDescritivoAbstractDataMapperMock = NULL; + + protected function setUp() + { + // Armazena valores de configuração para serem usados nas diferentes + // instâncias de objetos legados e novos + $this->_setConfigOptions('usuario', array('cod_usuario' => 1)) + ->_setConfigOptions('matricula', $this->_getMatricula()) + ->_setConfigOptions('serie', $this->_getSerie()) + ->_setConfigOptions('curso', $this->_getCurso()) + ->_setConfigOptions('escolaAnoLetivo', $this->_getEscolaAnoLetivo()) + ->_setConfigOptions('anoLetivoModulo', $this->_getAnoLetivoModulo()) + ->_setConfigOptions('escolaSerieDisciplina', $this->_getEscolaSerieDisciplina()) + ->_setConfigOptions('dispensaDisciplina', $this->_getDispensaDisciplina()) + ->_setConfigOptions('componenteCurricular', $this->_getComponenteCurricular()) + ->_setConfigOptions('notaAluno', $this->_getNotaAluno()) + ->_setConfigOptions('faltaAluno', $this->_getFaltaAluno()) + ->_setConfigOptions('parecerDescritivoAluno', $this->_getParecerDescritivoAluno()); + + // Configura atributos de RegraAvaliacao_Model_Regra + $this->_setRegraOption('formulaMedia', $this->_setUpFormulaMedia()) + ->_setRegraOption('formulaRecuperacao', $this->_setUpFormulaRecuperacao()) + ->_setRegraOption('tabelaArredondamento', $this->_setUpTabelaArredondamento()); + } + + protected function _getServiceInstance() + { + // Configura mappers das dependências de Avalilacao_Service_Boletim + $mappers = array( + 'RegraDataMapper' => $this->_getRegraDataMapperMock(), + 'ComponenteDataMapper' => $this->_getComponenteDataMapperMock(), + 'NotaAlunoDataMapper' => $this->_getNotaAlunoDataMapperMock(), + 'NotaComponenteDataMapper' => $this->_getNotaComponenteDataMapperMock(), + 'NotaComponenteMediaDataMapper' => $this->_getNotaComponenteMediaDataMapperMock(), + 'FaltaAlunoDataMapper' => $this->_getFaltaAlunoDataMapperMock(), + 'FaltaAbstractDataMapper' => $this->_getFaltaAbstractDataMapperMock(), + 'ParecerDescritivoAlunoDataMapper' => $this->_getParecerDescritivoAlunoDataMapperMock(), + 'ParecerDescritivoAbstractDataMapper' => $this->_getParecerDescritivoAbstractDataMapperMock(), + ); + + $this->_setConfigOptions('mappers', $mappers); + + // Cria os mocks das classes legadas + $this->_setUpMatriculaMock() + ->_setUpCursoMock() + ->_setUpSerieMock() + ->_setUpEscolaAnoLetivo() + ->_setUpAnoLetivoModulo() + ->_setUpEscolaSerieDisciplinaMock() + ->_setUpDispensaDisciplinaMock(); + + // Instancia o service + return new Avaliacao_Service_Boletim($this->_getServiceOptions()); + } + + /** + * Getter. Retorna o array de opções para a inicialização do service. + * @return array + */ + protected function _getServiceOptions() + { + return array( + 'matricula' => $this->_getConfigOption('matricula', 'cod_matricula'), + 'usuario' => $this->_getConfigOption('usuario', 'cod_usuario'), + 'RegraDataMapper' => $this->_getConfigOption('mappers', 'RegraDataMapper'), + 'ComponenteDataMapper' => $this->_getConfigOption('mappers', 'ComponenteDataMapper'), + 'NotaAlunoDataMapper' => $this->_getConfigOption('mappers', 'NotaAlunoDataMapper'), + 'NotaComponenteDataMapper' => $this->_getConfigOption('mappers', 'NotaComponenteDataMapper'), + 'NotaComponenteMediaDataMapper' => $this->_getConfigOption('mappers', 'NotaComponenteMediaDataMapper'), + 'FaltaAlunoDataMapper' => $this->_getConfigOption('mappers', 'FaltaAlunoDataMapper'), + 'FaltaAbstractDataMapper' => $this->_getConfigOption('mappers', 'FaltaAbstractDataMapper'), + 'ParecerDescritivoAlunoDataMapper' => $this->_getConfigOption('mappers', 'ParecerDescritivoAlunoDataMapper'), + 'ParecerDescritivoAbstractDataMapper' => $this->_getConfigOption('mappers', 'ParecerDescritivoAbstractDataMapper'), + ); + } + + /** + * Setter. + * + * @param string $namespace + * @param array $data + * @return Avaliacao_Service_TestCommon + */ + protected function _setConfigOptions($namespace, array $data) + { + $namespace = strtolower($namespace); + + $this->_config[$namespace] = array(); + + // Chama _setConfigOption() para não sobrescrever opções já configuradas + foreach ($data as $key => $value) { + $this->_setConfigOption($namespace, $key, $value); + } + + return $this; + } + + /** + * Getter. + * + * @param string $namespace + * @return mixed + */ + protected function _getConfigOptions($namespace) + { + $namespace = strtolower($namespace); + + if (!isset($this->_config[$namespace])) { + throw new Exception('_getConfigOption namespace'); + } + + return $this->_config[$namespace]; + } + + /** + * Setter. + * + * @param string $namespace + * @param string $key + * @param mixed $value + * @return Avaliacao_Service_TestCommon + */ + protected function _setConfigOption($namespace, $key, $value) + { + $namespace = strtolower($namespace); + + if (!isset($this->_config[$namespace])) { + $this->_config[$namespace] = array(); + } + + $this->_config[$namespace][$key] = $value; + return $this; + } + + /** + * Getter. + * + * @param string $namespace + * @param string $key + * @return mixed + */ + protected function _getConfigOption($namespace, $key) + { + $namespace = strtolower($namespace); + + if (!isset($this->_config[$namespace])) { + throw new Exception('_getConfigOption namespace'); + } + + if (!isset($this->_config[$namespace][$key])) { + throw new Exception('_getConfigOption option name: ' . $key); + } + + return $this->_config[$namespace][$key]; + } + + /** + * @return array + */ + protected function _getMatricula() + { + return array( + 'cod_matricula' => 1, + 'ref_cod_curso' => 1, + 'ref_ref_cod_serie' => 1, + 'ref_ref_cod_escola' => 1, + 'aprovado' => 1 + ); + } + + /** + * @return array + */ + protected function _getSerie() + { + return array( + 'regra_avaliacao_id' => 1, + 'carga_horaria' => 800 + ); + } + + /** + * @return array + */ + protected function _getCurso() + { + return array( + 'carga_horaria' => 800 * 9, + 'hora_falta' => (50 / 60), + 'padrao_ano_escolar' => 1 + ); + } + + /** + * @return array + */ + protected function _getEscolaAnoLetivo() + { + return array(array( + 'ref_cod_escola' => 1, + 'ano' => 2009, + 'andamento' => 1, + 'ativo' => 1 + )); + } + + /** + * @return array + */ + protected function _getAnoLetivoModulo() + { + return array( + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 1), + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 2), + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 3), + array('ref_ano' => 2009, 'ref_ref_cod_escola' => 1, 'sequencial' => 4) + ); + } + + /** + * Retorna um array com as possíveis etapas a serem cursadas. + * @return array + * @todo Condicionar o retorno de 'Rc' caso exista recuperação na Regra + */ + protected function _getEtapasPossiveis() + { + $etapas = count($this->_getConfigOptions('anoLetivoModulo')); + return array_merge(range(1, $etapas, 1), array('Rc')); + } + + /** + * @return array + */ + protected function _getEscolaSerieDisciplina() + { + return array( + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 1, 'carga_horaria' => 250), + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 2, 'carga_horaria' => 250), + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 3, 'carga_horaria' => 150), + array('ref_cod_serie' => 1, 'ref_cod_disciplina' => 4, 'carga_horaria' => 150), + ); + } + + /** + * @return array + */ + protected function _getDispensaDisciplina() + { + return array(); + } + + /** + * @return array + */ + protected function _getComponenteCurricular() + { + return array( + 1 => new ComponenteCurricular_Model_Componente( + array('id' => 1, 'nome' => 'Matemática', 'cargaHoraria' => 100) + ), + 2 => new ComponenteCurricular_Model_Componente( + array('id' => 2, 'nome' => 'Português', 'cargaHoraria' => 100) + ), + 3 => new ComponenteCurricular_Model_Componente( + array('id' => 3, 'nome' => 'Ciências', 'cargaHoraria' => 60) + ), + 4 => new ComponenteCurricular_Model_Componente( + array('id' => 4, 'nome' => 'Física', 'cargaHoraria' => 60) + ) + ); + } + + /** + * Retorna os componentes cursados pelo aluno. + * @return array + */ + protected function _getComponentesCursados() + { + return array_diff( + array_keys($this->_getComponenteCurricular()), + array_keys($this->_getDispensaDisciplina()) + ); + } + + /** + * @return Avaliacao_Model_NotaAluno + */ + protected function _getNotaAluno() + { + $matricula = $this->_getConfigOption('matricula', 'cod_matricula'); + + return array('instance' => new Avaliacao_Model_NotaAluno(array( + 'id' => 1, + 'matricula' => $matricula + ))); + } + + /** + * @return array + */ + protected function _getFaltaAluno() + { + $matricula = $this->_getConfigOption('matricula', 'cod_matricula'); + + return array('instance' => new Avaliacao_Model_FaltaAluno(array( + 'id' => 1, + 'matricula' => $matricula, + 'tipoFalta' => $this->_getRegraOption('tipoPresenca') + ))); + } + + /** + * @return array + */ + protected function _getParecerDescritivoAluno() + { + $matricula = $this->_getConfigOption('matricula', 'cod_matricula'); + + return array('instance' => new Avaliacao_Model_ParecerDescritivoAluno(array( + 'id' => 1, + 'matricula' => $matricula, + 'parecerDescritivo' => $this->_getRegraOption('parecerDescritivo') + ))); + } + + /** + * @return clsPmieducarMatricula + */ + protected function _setUpMatriculaMock() + { + $mock = $this->getCleanMock('clsPmieducarMatricula'); + + $mock->expects($this->any()) + ->method('detalhe') + ->will($this->returnValue($this->_getConfigOptions('matricula'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarMatricula', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * @return clsPmieducarSerie + */ + protected function _setUpSerieMock() + { + $mock = $this->getCleanMock('clsPmieducarSerie'); + + $mock->expects($this->any()) + ->method('detalhe') + ->will($this->returnValue($this->_getConfigOptions('serie'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarSerie', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * @return clsPmieducarCurso + */ + protected function _setUpCursoMock() + { + $mock = $this->getCleanMock('clsPmieducarCurso'); + + $mock->expects($this->any()) + ->method('detalhe') + ->will($this->returnValue($this->_getConfigOptions('curso'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarCurso', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * @return clsPmieducarEscolaAnoLetivo + */ + protected function _setUpEscolaAnoLetivo() + { + $mock = $this->getCleanMock('clsPmieducarEscolaAnoLetivo'); + + $mock->expects($this->any()) + ->method('lista') + ->with(1, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, 1) + ->will($this->returnValue($this->_getConfigOptions('escolaAnoLetivo'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarEscolaAnoLetivo', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * @return clsPmieducarAnoLetivoModulo + */ + protected function _setUpAnoLetivoModulo() + { + $mock = $this->getCleanMock('clsPmieducarAnoLetivoModulo'); + + $mock->expects($this->any()) + ->method('lista') + ->with(2009, 1) + ->will($this->returnValue($this->_getConfigOptions('anoLetivoModulo'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarAnoLetivoModulo', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * @return clsPmieducarEscolaSerieDisciplina + */ + protected function _setUpEscolaSerieDisciplinaMock() + { + $mock = $this->getCleanMock('clsPmieducarEscolaSerieDisciplina'); + + $mock->expects($this->any()) + ->method('lista') + ->will($this->returnValue($this->_getConfigOptions('escolaSerieDisciplina'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarEscolaSerieDisciplina', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * @return clsPmieducarDispensaDisciplina + */ + protected function _setUpDispensaDisciplinaMock() + { + $mock = $this->getCleanMock('clsPmieducarDispensaDisciplina'); + + $mock->expects($this->any()) + ->method('lista') + ->will($this->returnValue($this->_getConfigOptions('dispensaDisciplina'))); + + CoreExt_Entity::addClassToStorage('clsPmieducarDispensaDisciplina', + $mock, NULL, TRUE + ); + + return $this; + } + + /** + * Configura e retorna um mock de RegraAvaliacaoDataMapper que retorna uma + * instância de RegraAvaliacao_Model_Regra configurada de acordo com as + * opções do array $_regraOptions. + * + * @return RegraAvaliacao_Model_RegraDataMapper + */ + protected function _getRegraDataMapperMock() + { + $regraAvaliacao = new RegraAvaliacao_Model_Regra($this->_regraOptions); + + $mock = $this->getCleanMock('RegraAvaliacao_Model_RegraDataMapper'); + $mock->expects($this->any()) + ->method('find') + ->with(1) + ->will($this->returnValue($regraAvaliacao)); + + return $mock; + } + + /** + * Configura uma das opções a serem passadas durante a instanciação de + * RegraAvaliacao_Model_Regra. + * + * @param string $key + * @param mixed $value + */ + protected function _setRegraOption($key, $value) + { + if (!array_key_exists($key, $this->_regraOptions)) { + require_once 'CoreExt/Exception/InvalidArgumentException.php'; + throw new CoreExt_Exception_InvalidArgumentException('regraOption:' . $key); + } + + $this->_regraOptions[$key] = $value; + return $this; + } + + /** + * Getter. + * + * @param string $key + * @return mixed + */ + protected function _getRegraOption($key) + { + if (!array_key_exists($key, $this->_regraOptions)) { + require_once 'CoreExt/Exception/InvalidArgumentException.php'; + throw new CoreExt_Exception_InvalidArgumentException('regraOption: ' . $key); + } + + return $this->_regraOptions[$key]; + } + + /** + * @return FormulaMedia_Model_Formula + */ + protected function _setUpFormulaMedia() + { + return new FormulaMedia_Model_Formula(array( + 'id' => 1, + 'nome' => 'Média aritmética', + 'formulaMedia' => 'Se / Et', + 'tipoFormula' => FormulaMedia_Model_TipoFormula::MEDIA_FINAL + )); + } + + /** + * @return FormulaMedia_Model_Formula + */ + protected function _setUpFormulaRecuperacao() + { + return new FormulaMedia_Model_Formula(array( + 'id' => 1, + 'nome' => 'Média ponderada', + 'formulaMedia' => '(Se / Et * 0.6) + (Rc * 0.4)', + 'tipoFormula' => FormulaMedia_Model_TipoFormula::MEDIA_RECUPERACAO + )); + } + + /** + * @return TabelaArredondamento_Model_Tabela + */ + protected function _setUpTabelaArredondamento() + { + // Valores padrão dos atributos de TabelaArredondamento_Model_TabelaValor + $data = array( + 'tabelaArredondamento' => 1, + 'nome' => NULL, + 'descricao' => NULL, + 'valorMinimo' => -1, + 'valorMaximo' => 0 + ); + + $tabelaValores = array(); + + for ($i = 0; $i <= 10; $i++) { + $data['nome'] = $i; + $data['valorMinimo'] += 1; + $data['valorMaximo'] += 1; + + if ($i == 10) { + $data['valorMinimo'] = 9; + $data['valorMaximo'] = 10; + } + + $tabelaValores[$i] = new TabelaArredondamento_Model_TabelaValor($data); + } + + $mock = $this->getCleanMock('TabelaArredondamento_Model_TabelaValorDataMapper'); + $mock->expects($this->any()) + ->method('findAll') + ->will($this->returnValue($tabelaValores)); + + $tabelaDataMapper = new TabelaArredondamento_Model_TabelaDataMapper(); + $tabelaDataMapper->setTabelaValorDataMapper($mock); + + $tabela = new TabelaArredondamento_Model_Tabela(array('nome' => 'Numéricas')); + $tabela->setDataMapper($tabelaDataMapper); + + return $tabela; + } + + protected function _setComponenteDataMapperMock(ComponenteCurricular_Model_ComponenteDataMapper $mapper) + { + $this->_componenteDataMapperMock = $mapper; + return $this; + } + + protected function _getComponenteDataMapperMock() + { + if (is_null($this->_componenteDataMapperMock)) { + $componentes = $this->_getConfigOptions('componenteCurricular'); + + // Mock para ComponenteCurricular_Model_ComponenteDataMapper + $mock = $this->getCleanMock('ComponenteCurricular_Model_ComponenteDataMapper'); + $mock->expects($this->any()) + ->method('findComponenteCurricularAnoEscolar') + ->will(new PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls($componentes)); + + $this->_setComponenteDataMapperMock($mock); + } + + return $this->_componenteDataMapperMock; + } + + protected function _setNotaAlunoDataMapperMock(Avaliacao_Model_NotaAlunoDataMapper $mapper = NULL) + { + $this->_notaAlunoDataMapperMock = $mapper; + return $this; + } + + protected function _getNotaAlunoDataMapperMock() + { + if (is_null($this->_notaAlunoDataMapperMock)) { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $mock = $this->getCleanMock('Avaliacao_Model_NotaAlunoDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('matricula' => $notaAluno->matricula)) + ->will($this->returnValue(array($notaAluno))); + + $this->_setNotaAlunoDataMapperMock($mock); + } + + return $this->_notaAlunoDataMapperMock; + } + + protected function _setNotaComponenteDataMapperMock(Avaliacao_Model_NotaComponenteDataMapper $mapper) + { + $this->_notaComponenteDataMapperMock = $mapper; + return $this; + } + + protected function _getNotaComponenteDataMapperMock() + { + if (is_null($this->_notaComponenteDataMapperMock)) { + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $this->_getConfigOption('matricula', 'cod_matricula')), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $this->_setNotaComponenteDataMapperMock($mock); + } + + return $this->_notaComponenteDataMapperMock; + } + + protected function _setNotaComponenteMediaDataMapperMock(Avaliacao_Model_NotaComponenteMediaDataMapper $mapper) + { + $this->_notaComponenteMediaDataMapperMock = $mapper; + return $this; + } + + protected function _getNotaComponenteMediaDataMapperMock() + { + if (is_null($this->_notaComponenteMediaDataMapperMock)) { + $notaAluno = $this->_getConfigOption('notaAluno', 'instance'); + + $mock = $this->getCleanMock('Avaliacao_Model_NotaComponenteMediaDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('notaAluno' => $notaAluno->id)) + ->will($this->returnValue(array())); + + $this->_setNotaComponenteMediaDataMapperMock($mock); + } + + return $this->_notaComponenteMediaDataMapperMock; + } + + protected function _setFaltaAlunoDataMapperMock(Avaliacao_Model_FaltaAlunoDataMapper $mapper = NULL) + { + $this->_faltaAlunoDataMapperMock = $mapper; + return $this; + } + + protected function _getFaltaAlunoDataMapperMock() + { + if (is_null($this->_faltaAlunoDataMapperMock)) { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAlunoDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array($faltaAluno))); + + $this->_setFaltaAlunoDataMapperMock($mock); + } + + return $this->_faltaAlunoDataMapperMock; + } + + protected function _setFaltaAbstractDataMapperMock(Avaliacao_Model_FaltaAbstractDataMapper $mapper) + { + $this->_faltaAbstractDataMapperMock = $mapper; + return $this; + } + + protected function _getFaltaAbstractDataMapperMock() + { + $faltaAluno = $this->_getConfigOption('faltaAluno', 'instance'); + + if (is_null($this->_faltaAbstractDataMapperMock)) { + $mock = $this->getCleanMock('Avaliacao_Model_FaltaAbstractDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('faltaAluno' => $faltaAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $this->_setFaltaAbstractDataMapperMock($mock); + } + + return $this->_faltaAbstractDataMapperMock; + } + + protected function _setParecerDescritivoAlunoDataMapperMock(Avaliacao_Model_ParecerDescritivoAlunoDataMapper $mapper) + { + $this->_parecerDescritivoAlunoDataMapperMock = $mapper; + return $this; + } + + protected function _getParecerDescritivoAlunoDataMapperMock() + { + if (is_null($this->_parecerDescritivoAlunoDataMapperMock)) { + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance'); + + $mock = $this->getCleanMock('Avaliacao_Model_ParecerDescritivoAlunoDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('matricula' => $this->_getConfigOption('matricula', 'cod_matricula'))) + ->will($this->returnValue(array($parecerAluno))); + + $this->_setParecerDescritivoAlunoDataMapperMock($mock); + } + + return $this->_parecerDescritivoAlunoDataMapperMock; + } + + protected function _setParecerDescritivoAbstractDataMapperMock(Avaliacao_Model_ParecerDescritivoAbstractDataMapper $mapper) + { + $this->_parecerDescritivoAbstractDataMapperMock = $mapper; + return $this; + } + + protected function _getParecerDescritivoAbstractDataMapperMock() + { + if (is_null($this->_parecerDescritivoAbstractDataMapperMock)) { + $parecerAluno = $this->_getConfigOption('parecerDescritivoAluno', 'instance'); + + $mock = $this->getCleanMock('Avaliacao_Model_ParecerDescritivoAbstractDataMapper'); + $mock->expects($this->at(0)) + ->method('findAll') + ->with(array(), array('parecerDescritivoAluno' => $parecerAluno->id), array('etapa' => 'ASC')) + ->will($this->returnValue(array())); + + $this->_setParecerDescritivoAbstractDataMapperMock($mock); + } + + return $this->_parecerDescritivoAbstractDataMapperMock; + } +} \ No newline at end of file diff --git a/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php b/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php new file mode 100644 index 0000000..543b265 --- /dev/null +++ b/ieducar/modules/Avaliacao/_tests/Service/UtilityTest.php @@ -0,0 +1,125 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Arquivo disponível desde a versão 1.1.0 + * @version $Id$ + */ + +require_once 'Avaliacao/_tests/Service/TestCommon.php'; + +/** + * Avaliacao_Service_UtilityTest class. + * + * @author Eriksen Costa Paixão + * @category i-Educar + * @license @@license@@ + * @package Avaliacao + * @subpackage UnitTests + * @since Classe disponível desde a versão 1.1.0 + * @version @@package_version@@ + */ +class Avaliacao_Service_UtilityTest extends Avaliacao_Service_TestCommon +{ + public function testArredondaNotaLancaExcecaoSeParametroNaoForInstanciaDeAvaliacaomodelnotacomponenteOuNumerico() + { + $service = $this->_getServiceInstance(); + + try { + $service->arredondaNota(new Avaliacao_Model_NotaComponente()); + $this->fail('O valor "instância Avaliacao_Model_NotaComponente()" deveria ' + . 'ter causado um exceção pois o atributo "nota" é NULL por padrão.'); + } + catch (CoreExt_Exception_InvalidArgumentException $e) { + } + + try { + $service->arredondaNota('abc 7.5'); + $this->fail('O valor "abc 7.5" deveria ter causado um exceção.'); + } + catch (CoreExt_Exception_InvalidArgumentException $e) { + } + } + + public function testArredondaNotaNumerica() + { + $service = $this->_getServiceInstance(); + $this->assertEquals(5, $service->arredondaNota(5.5)); + } + + public function testArredondaNotaConceitual() + { + // Valores padrão dos atributos de TabelaArredondamento_Model_TabelaValor + $data = array( + 'tabelaArredondamento' => 1, + 'nome' => NULL, + 'descricao' => NULL, + 'valorMinimo' => -1, + 'valorMaximo' => 0 + ); + + $tabelaValores = array(); + + // I + $tabelaValores[0] = new TabelaArredondamento_Model_TabelaValor($data); + $tabelaValores[0]->nome = 'I'; + $tabelaValores[0]->descricao = 'Incompleto'; + $tabelaValores[0]->valorMinimo = 0; + $tabelaValores[0]->valorMaximo = 5.50; + + // S + $tabelaValores[1] = new TabelaArredondamento_Model_TabelaValor($data); + $tabelaValores[1]->nome = 'S'; + $tabelaValores[1]->descricao = 'Suficiente'; + $tabelaValores[1]->valorMinimo = 5.51; + $tabelaValores[1]->valorMaximo = 8; + + // O + $tabelaValores[2] = new TabelaArredondamento_Model_TabelaValor($data); + $tabelaValores[2]->nome = 'O'; + $tabelaValores[2]->descricao = 'Ótimo'; + $tabelaValores[2]->valorMinimo = 8.01; + $tabelaValores[2]->valorMaximo = 10.0; + + $mock = $this->getCleanMock('TabelaArredondamento_Model_TabelaValorDataMapper'); + $mock->expects($this->any()) + ->method('findAll') + ->will($this->returnValue($tabelaValores)); + + $tabelaDataMapper = new TabelaArredondamento_Model_TabelaDataMapper(); + $tabelaDataMapper->setTabelaValorDataMapper($mock); + + $tabela = new TabelaArredondamento_Model_Tabela(array('nome' => 'Conceituais')); + $tabela->setDataMapper($tabelaDataMapper); + + $this->_setRegraOption('tabelaArredondamento', $tabela); + + $service = $this->_getServiceInstance(); + $this->assertEquals('I', $service->arredondaNota(5.49)); + $this->assertEquals('S', $service->arredondaNota(6.50)); + $this->assertEquals('O', $service->arredondaNota(9.15)); + } +} \ No newline at end of file -- libgit2 0.21.2