From 59544d02b5d83d40b2bb5ca64de524458ab127a7 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Mon, 31 Aug 2015 20:51:30 -0300 Subject: [PATCH 01/18] testewz --- teste1wz.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 teste1wz.txt diff --git a/teste1wz.txt b/teste1wz.txt new file mode 100644 index 0000000..e69de29 From f4aed51cee2a3daa191e0d95d5f935d763955779 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Wed, 16 Sep 2015 20:07:38 -0300 Subject: [PATCH 02/18] Testedado Adicionado testedado.c --- GENERICO.H | 588 +++++++++++++++++++++++++++++++++++++++++++++++++++++ LERPARM.H | 463 +++++++++++++++++++++++++++++++++++++++++ TESTDADO.c | 123 +++++++++++ TST_ESPC.H | 320 +++++++++++++++++++++++++++++ 4 files changed, 1494 insertions(+) create mode 100644 GENERICO.H create mode 100644 LERPARM.H create mode 100644 TESTDADO.c create mode 100644 TST_ESPC.H diff --git a/GENERICO.H b/GENERICO.H new file mode 100644 index 0000000..c9d2692 --- /dev/null +++ b/GENERICO.H @@ -0,0 +1,588 @@ +#if ! defined( GENERICO_ ) +#define GENERICO_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTG Controlador de teste genérico +* +* Arquivo gerado: GENERICO.h +* Letras identificadoras: TST +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* O módulo de teste genérico contém um conjunto de funções de +* coordenação, apoio e controle da execução de testes de módulos +* quaisquer. +* +* Embora na prática a função de teste específica seja uma extensão da +* função de teste genérica, a função de teste específica encontra-se em +* outro módulo. Desta forma as alterações necessárias para cada +* módulo a testar concentram-se exclusivamente naquele módulo. +* +* $EIU Interface com o usuário pessoa +* Os seguintes comandos genéricos estão definidos: +* +* linha em branco - faz nada +* +* // - comentário, é impresso no LOG +* +* == - título de caso de teste, o título é impresso no LOG +* +* =recuperar +* - Caso o comando imediatamente anterior ao comando +* =recuperar retorne TST_CondRetOK, obviemanete o comando +* executou corretamente, portanto o comando =recuperar +* reportará uma falha no script de teste, uma vez que não +* foi encontrada a falha esperada ao executar o comando. +* - Caso o comando antecessor retorne TST_CondRetErro, +* ou TST_CondRetParm (erro de parâmetros do comando) +* a falha reportada será desconsiderada, uma vez que +* era esperada. O comando =recuperar destina-se a +* apoiar o teste da corretude dos validadores de +* parâmetros dos comandos e das funções por eles +* ativadas. +* - caso o comando antecessor retorne outras condições, o +* comando =recuperar será tratado como falha. +* +* =bkpt - permite interagir com o depurador utilizado para +* desenvolver os módulos sob teste. O comando =bkpt +* executa um código "dummy" no qual pode ser inserido +* um "breakpoint" do depurador. Desta forma o teste pode +* prosseguir sem interrupção até o comando =bkpt. +* Para isto +* - apague ou desative todos os breakpoints do depurador +* - insira o comando =bkpt no script pouco antes do ponto +* de interrupção desejado +* - usando o depurador, estabeleça um breakpoint na linha de +* código: "Dummy = 0 ;" contida no módulo de teste +* genérico. Esta linha pode ser encontrada +* procurando por "BKPT_CMD" +* - dê partida no programa e espere até chegar ao breakpoint +* associado ao comando "dummy". Agora reative ou instale +* os breakpoints requeridos pela a sessão de depuração. +* e continue depurando +* +* =cancelar +* - termina a interpretação dos comandos de teste. +* Sempre sinaliza falha. +* +* =AceitaFalhasAcumuladas numFalhas +* - caso o contador de falhas registre numFalhas, ele será +* tornado zero. Este comando é similar a =recuperar. +* Difere deste por ser executado desde que o comando +* anterior não tenha reportado erro, tal como acontece +* com todos os comandos, exceto =recuperar. +* O comando permite recuperar falhas sinalizadas por +* módulos de apoio, tais como, leitor de parâmetros, +* contador de passagens e controle de espaço dinâmico. +* Caso o contador de número de falhas contenha um valor +* diferente de numFalhas, será reportado um erro e +* o contador é incrementado de 1. +* +* Os demais comandos são passados para as funções de teste específico. +* Primeiro para as do arcabouço, depois para a específica do módulo +* a testar. A última função de teste específico deve retornar a condição +* TST_CondRetNaoConhec caso não consiga interpretar a diretiva. +* +* $EIM Interface com outros módulos +* A primeira função do arcabouço ("framework") a ser chamada deve a +* sempre ser TST_InicializarTeste. Caso não o seja, ocorrerão erros +* de execução (assert). +* +* Após abra o arquivo de script executando a função +* TST_AbrirArquivoScript. Se for desejado gerar um log abra +* o arquivo corresponente com a função TST_AbrirArquivoLog. +* +* Depois de abrir os arquivos, execute os testes chamando a função +* TST_RealizarTeste. A função de teste genérico lerá todo o arquivo +* de script, retornando após concluir o teste. +* +* Após, termine o teste através da função TST_TerminarTeste. +* Esta função exibe as estatísticas do teste e, caso solicitado, +* acumula essas estatísticas em um arquivo acumulador (ver +* parâmetro /a do programa principal. +* +* As funções "TST_ObterXXX" podem ser utilizadas antes de fechar o +* módulo de teste para exibir o resumo do teste no módulo cliente do +* módulo de controle genérico. +* +* O programa cliente do módulo controle de teste genérico pode +* efetuar as operações acima repetidas vezes, permitindo, assim o +* teste envolvendo diversos arquivos scripts de teste. A saída +* de cada teste deve ser dirigida para um log específico, ou para +* stdout, uma vez que, ao abrir um arquivo log, o seu conteúdo será +* sempre destruído. +* +* O módulo de teste genérico também implementa diversas funções +* de comparação "TST_CompararXXX" use-as no módulo de controle de +* teste específico. Desta forma será assegurado o tratamento uniforme +* de todas as falhas possivelmente encontradas. +* +* O módulo disponibiliza ainda a função TST_ExibirPrefixo +* que gera uma linha de saída obedecendo aos padrões de interface +* estabelecidos. Sendo desejado pode-se adicionar textos à linha +* usando a funcao fprintf( TST_ObterArqLog( ) , ... ). Um exemplo da +* utilidade disso é quando se deseja imprimir informação complementar +* ao interpretar uma determinada diretiva. A função TST_ObterArqLog( ) +* retorna a referência ao arquivo log em uso no momento. +* +* Finalmente, o módulo disponibiliza a função TST_NotificarFalha +* que incrementa o contador de falhas além de emitir uma mensagem +* de erro. +* +***************************************************************************/ + +#if defined( GENERICO_OWN ) + #define GENERICO_EXT +#else + #define GENERICO_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#include "TST_Espc.h" + + +/*********************************************************************** +* +* $FC Função: TSTG &Controlar uma sessão de teste +* +* $ED Descrição da função +* Esta função é o ponto de entrada para a realização do teste. +* Permite que se adicione o arcabouço de teste a um sistema qualquer. +* +* $EP Parâmetros +* $P NomeConstrutoParm +* $P NomeArqScriptParm - deve ser não nulo +* $P NomeArqLogParm - se for nulo, gera a saída na console +* $P NomeArqAcumParm - se não for nulo, acumula as estatísticas no +* arquivo denominado +* +* $FV Valor retornado +* 0 - se o teste ocorreu OK +* 4 - se foram observados erros de dados ou falhas nos testes +* +***********************************************************************/ + + int TST_ControlarSessaoTeste( char * NomeConstrutoParm , + char * NomeArqScriptParm , + char * NomeArqLogParm , + char * NomeArqAcumParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar booleano +* +* $ED Descrição da função +* Compara valor booleano esperado com valor booleano obtido, +* reportamdo uma falha caso não sejam iguais. +* Note que "!= 0" corresponde a TRUE e "== 0" corresponde a FALSE +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for consistente com o obtido +* TST_CondRetOK se os valores forem consistentes +* +***********************************************************************/ + + TST_tpCondRet TST_CompararBool( int ValorEsperado , + int ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar caractere +* +* $ED Descrição da função +* Compara um caractere esperado com um caractere obtido, emitindo mensagem de +* erro caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararChar( char ValorEsperado , + char ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar inteiro +* +* $ED Descrição da função +* Compara valor inteiro long esperado com valor inteiro obtido, +* reportamdo uma falha caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararInt( long ValorEsperado , + long ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar flutuante +* +* $ED Descrição da função +* Compara valor flutuante esperado com valor flutuante obtido, +* reportando uma falha caso +* 1 - Tolerancia > esperado / obtido ou +* 1 + Tolerancia < esperado / obtido +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* Tolerância - indica os limites da relação entre esperado e obtido. +* Deve ser um valor positivo, menor do que 1. +* Use um valor do tipo 10 ** -n, no qual n é o +* número de dígitos significativos desejado. +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor obtido não estiver dentro do domínio da +* tolerância em torno do valor esperado +* TST_CondRetOK se os valores estiverem dentro da tolerância +* +***********************************************************************/ + + TST_tpCondRet TST_CompararFloat( double ValorEsperado , + double ValorObtido , + double Tolerancia , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar string +* +* $ED Descrição da função +* Compara string esperado com string obtido, reportamdo uma falha +* caso não sejam iguais. Ambos os strings devem obedecer o +* padrão C, terminando em zero. +* +* $EP Parâmetros +* ValorEsperado - é um string fornecido como parâmetro do comando +* de teste. +* ValorObtido - é o string retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararString( char * ValorEsperado , + char * ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar espaço +* +* $ED Descrição da função +* Compara espaços de dados, reportando uma falha caso não sejam iguais. +* Esta função pode ser utilizada para comparar qualquer coisa, +* inclusive valores do tipo "struct" +* O tipo do valor é indefinido e os valores serão exibidos em +* formato hexadecimal, caso não sejam iguais +* +* $EP Parâmetros +* ValorEsperado - ponteiro para o espaço que contém o valor esperado +* ValorObtido - ponteiro para o espaço que contém o valor obtido +* TamEspaco - tamanho do espaço a ser comparado +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , + void * ValorObtido , + int TamEspaco , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro +* +* $ED Descrição da função +* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro nulo +* +* $ED Descrição da função +* Verifica +* - quando ModoEsperado == 0 se o PonteiroObtido é nulo +* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Assertiva controlada +* +* $ED Descrição da função +* Esta função substitui a função assert de C. +* É utilizada no contexto do arcabouço de teste. +* Ela imprime mensagens mais visíveis tanto no log como na +* janela de comando. +* +* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. +* +* $FV Valor retornado +* Termina a execução do programa com código de retorno == 4 +* +***********************************************************************/ + + #define TST_ASSERT( Expressao ) \ + TST_Assert( Expressao , __LINE__ , __FILE__ ) + + void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir prefixo da mensagem +* +* $ED Descrição da função +* Imprime o prefixo de mensages de falha ou de informação. +* Não incrementa o contador de falhas. +* Esta função estabelece o padrão de saída das mensagens geradas +* durante os testes. +* +* $EP Parâmetros +* $P Indicador - informa a natureza da mensagem, +* Utilize preferenciamente as constantes definidas em +* TST_ESPEC.H: +* SINALIZA_ERRO ">>>" +* SINALIZA_RECUPERA "<<<" +* SINALIZA_COMENTARIO "!!!" +* $P pMensagem - é a mensagem prefixo a ser gerada. +* +* $EIU Interface com usuário pessoa +* Podem ser acrescentadas mensagens ao prefixo. A função +* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso +* (stdout ou definido pelo usuário) +* +***********************************************************************/ + + void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Notificar falha +* +* $ED Descrição da função +* Exibe uma mensagem de falha no formato padrão do arcabouço. +* A função não exibe os valores esperado e obtido. +* +* $EP Parâmetros +* $P pMensagem - mensdagem explicativa da falha. +* +* $FV Valor retornado +* TST_CondRetErro sempre +* +***********************************************************************/ + + TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Incrementar contador de falhas +* +* $ED Descrição da função +* Esta função deve ser usada quando, por alguma razão, precisar-se +* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. +* As outras funções (comparação, TST_NotificarFalha, etc.) +* incrementam o contador automaticamente. +* +***********************************************************************/ + + void TST_ContarFalhas( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de casos de teste efetuados +* +* $ED Descrição da função +* Retorna o número de casos de teste lidos. +* Cada caso de teste inicia com o comando "== ". +* +***********************************************************************/ + + int TST_ObterNumCasosTeste( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados +* +* $ED Descrição da função +* Retorna o número de comandos de teste específicos lidos e +* corretamente interpretados. +* Não conta comandos que retornem não OK independentemento do motivo, +* inclusive os comandos saltados após uma falha. +* Também não conta comandos recuperar. +* +***********************************************************************/ + + int TST_ObterNumComandosExecutados( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de falhas encontradas +* +* $ED Descrição da função +* Retorna o número de falhas encontrados. +* O módulo de teste específico sinaliza falhas através de +* uma condição de retorno diferente de TST_CondRetOK. +* Além de comparações em erro, são tratados como falhas: +* - comandos de teste em erro, +* - comandos de teste de um dado caso de teste ignorados (saltados) +* - erros encontrados nos instrumentos +* - erros de sintaxe dos comandos de teste +* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. +* Portanto, é possível que o número de falhas venha a ser maior do +* que o número de casos de teste existente no script. +* +***********************************************************************/ + + int TST_ObterNumFalhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter origem do nome da extensão de arquivo +* +* $ED Descrição da função +* Procura o início do nome da extensão contido no nome do arquivo +* dado por parâmetro +* +* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". +* Isto pode confundir no caso de se desejar a adição de algum nome +* de extensão padrão. +* +* $EP Parâmetros +* $P NomeArqParm - nome de arquivo a ser analisado +* +* $FV Valor retornado +* Ponteiro para o caractere '.' que separa a extensão. +* Será NULL caso o nome do arquivo não contenha extensão. +* +***********************************************************************/ + + char * TST_ObterInicioExtensao( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter ponteiro para arquivo LOG +* +* $ED Descrição da função +* Retorna o ponteiro para o FILE do log em uso no momento. +* Será stdout caso não seja definido explicitamente ao chamar a funcao +* TST_ControlarSessaoTeste +* +* $FV Valor retornado +* Ponteiro válido para um arquivo de texto de saída +* +***********************************************************************/ + + FILE * TST_ObterArqLog( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char +* +* $ED Descrição da função +* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém +* uma coluna em hexadecimal e outra em ASCII +* São exibidos 16 bytes por linha. +* +* $EP Parâmetros +* $P tamEspaco - tamanho em bytes do espaço a exibir +* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir +* +***********************************************************************/ + + void TST_ExibirEspacoHexa( int tamEspaco , + void * Ponteiro ) ; + +#undef GENERICO_EXT + +/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ + +#else +#endif diff --git a/LERPARM.H b/LERPARM.H new file mode 100644 index 0000000..f12cf3d --- /dev/null +++ b/LERPARM.H @@ -0,0 +1,463 @@ +#if ! defined( LerParm_ ) +#define LerParm_ +/*************************************************************************** +* +* $MCD Módulo de definição: LER Ler parâmetros de comandos +* +* Arquivo gerado: LerParm.h +* Letras identificadoras: LER +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Provê funções para a leitura e análise léxica dos comandos de teste. +* Pressupõe-se que cada comando de teste esteja integralmente em +* uma linha. +* Cada comando de teste inicia com o caractere '=' seguido de um string +* que identifica o comando. +* Cada comando pode requerer zero ou mais parâmetros que se encontram na +* mesma linha que o comando. +* Parâmetros podem ser literis ou simbólicos. +* Os parâmetros simbólicos precisam ser declarados antes de serem +* utilizados. +* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. +* +* Se for do interesse do programador, módulos de teste específico +* podem ler e processar por conta própria linhas do script. Isto +* pode ser necessário quando um módulo necessita de um grande +* número de parâmetros ou de dados especiais. +* +* $EIU Interface com o usuário pessoa +* Este módulo interpreta os comandos de teste globalmente disponíveis: +* +* =declararparm +* declara o parâmetro do definido com o valor +* pode ser um de: +* i - inteiro (long) +* f - flutuante (double) +* c - caractere +* s - string +* O valor de literal tem que estar em conformidade com o tipo +* +* =exibirdeclaracao +* exibe a declaração do parâmetro em formato "dump de memória" +* +* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. +* +* Estes comandos sempre estarão disponíveis. Os demais comandos de +* teste estão impementados no módulo TESTLER específico para este módulo. +* +***************************************************************************/ + +#if defined( LerParm_OWN ) + #define LerParm_EXT +#else + #define LerParm_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define LER_DIM_NOME 32 +#define LER_DIM_STRING 500 +#define LER_DIM_BUFFER 250 + + +/*********************************************************************** +* +* $TC Tipo de dados: LER Condições de retorno +* +* +***********************************************************************/ + + typedef enum { + + LER_CondRetOK , + /* Ler retorno OK */ + + LER_CondRetNaoAbriu + /* Ler não abriu arquivo */ + + } LER_tpCondRet ; + +/***** Dados exportados pelo módulo *****/ + + /* Estrutura de dados: *LER Dados globais públicos */ + + LerParm_EXT int LER_TamBuffer ; + /* Tamanho do string contido no buffer de leitura + * + *$ED Descrição + * Contém o número total de caracteres do buffer, excluindo o zero. + * Jamais altere este valor. */ + + LerParm_EXT int LER_InxBuffer ; + /* Cursor do buffer de leitura + * + *$ED Descrição + * O cursor de leitura indexa o primeiro caractere não lido contido + * no buffer. + * O cursor é zerado sempre que uma nova linha for lida. + * O cursor é avançado ao ler um parâmetro, sendo colocado no + * primeiro caractere imediatamente após ao parâmetro lido. + * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ + + LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; + /* Buffer de leitura + * + *$ED Descrição + * Contém a linha corrente do script a ser processada. + * Jamais altere o valor do buffer. */ + + +/*********************************************************************** +* +* $FC Função: LER &Inicializar módulo LerParm +* +* $ED Descrição da função +* Inicializa o módulo. +* Deve ser chamada antes de iniciar a análise de comandos. +* Deve ser chamada uma única vez no início ou após terminar o módulo. +* +***********************************************************************/ + + int LER_InicializarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Terminar módulo LerParm +* +* $ED Descrição da função +* Fecha o arquivo de leitura e sinaliza módulo de leitura não +* inicializado. +* Após esta função somente poderá ser chamada a funçãp +* LER_InicializarLeitura +* +***********************************************************************/ + + void LER_TerminarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter nome do arquivo script +* +* $FV Valor retornado +* Retorna o ponteiro para o nome do arquivo script sendo processado. +* Deve-se tomar cuidado para não alterar este nome. +* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. +* +***********************************************************************/ + + char * LER_ObterNomeArqScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter número de linhas lidas até o momento +* +***********************************************************************/ + + int LER_ObterNumLinhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Abrir arquivo script de teste +* +* $ED Descrição da função +* Abre o arquivo que contém o script de teste. +* A extensão default do arquivo de comandos script de teste é +* ".script" e será acrescida ao nome do arquivo caso este não +* contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo contendo o script de teste +* +* $FV Valor retornado +* LER_CondRetOK - caso tenha sido possível abrir o arquivo. +* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. +* Não há discriminação do erro encontrado. +* +***********************************************************************/ + + LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha script eliminando brancos ao final +* +* $ED Descrição da função +* Lê uma linha do arquivo script e elimina os caracteres branco, +* fim de linha, tabulação etc. do final da linha lida. +* +* $FV Valor retornado +* Retorna o tamanho da linha lida. +* Será: +* -1 caso tenha ocorrido fim de arquivo. +* -2 caso tenha ocorrido algum problema de leitura. +* +***********************************************************************/ + + int LER_LerLinhaScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Interpretar comandos de teste +* +* $ED Descrição da função +* Interpreta os comandos de teste disponibilizados pelo módulo +* de leitura. +* +* Ver a descrição do módulo para mais detalhes +* +* $EP Parâmetros +* $P - Comando de teste a ser interpretado +* +* $FV Valor retornado +* TST_CondRetOK - caso tenha interpretado corretamente +* TST_CondRetNaoExecutou - caso o comando de teste a interpretar +* não pertença ao conjunto de LER +* TST_CondRetErro - caso o comando de teste é do conjunto de LER +* e está sintaticamente errado. +* Neste caso é gerada uma mensagem de erro no +* log. +* +***********************************************************************/ + + TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Declarar parâmetro simbólico +* +* $EP Parâmetros +* Interpreta uma linha de comando de teste contendo uma declaração de +* nome simbólico. +* Todas as declarações têm o formato: +* =declararparm +* em que o deve estar consistente com o +* São geradas mensagens de erro no log de teste caso a declaração +* não possa ser realizada. +* +* $FV Valor retornado +* TRUE - se a declaração ocorreu +* FALSE - caso contrário +* +***********************************************************************/ + + int LER_DeclararParametro( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Exibir declaração de símbolo +* +* $ED Descrição da função +* Exibe o Símbolo e o valor associado ao símbolo, sendo que este +* é exibido em hexadecimal. +* +***********************************************************************/ + + void LER_ExibirParametro( char * Simbolo ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha de parâmetros +* +* $ED Descrição da função +* Lê um número variável de parâmetros +* +* $EP Parâmetros +* $P Tipos é um string contendo a identificação dos tipos dos parâmetros +* a serem lidos. +* $P ... Os demais parâmetros são referências (ponteiros) para os +* espaços onde deverão ser armazenados os valores lidos. +* +* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista +* de referência e o string de tipos tenha o mesmo tamanho +* e que os indicadores de tipo sejam consistentes com a referência +* posicionalmente correspondentes. +* +* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já +* declarado. Caso isto seja possível e o tipo esteja correto +* é "lido" o valor contido no parâmetro. +* Caso não seja possível, tenta ler um literal em acordo com o tipo +* dado. +* +* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada +* e tipo inconsistente com o solicitado no correspondente caractere no +* string Tipos. +* +* $FV Valor retornado +* Retorna o número de campos lidos até concluir ou até encontrar +* um erro. +* +***********************************************************************/ + + int LER_LerParametros( char * Tipos , ... ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro caractere +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do caractere lido +* +* $EIU Interface com usuário pessoa +* Um caractere deve vir entre aspas simples. Valem os caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmChar( char * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro inteiro +* +* $EP Parâmetros +* $P Parm é um ponteiro para um int que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do int lido +* +* $EIU Interface com usuário pessoa +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmInt( int * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro flutuante +* +* $EP Parâmetros +* $P Parm é um ponteiro para um double que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do double lido +* +* $EIU Interface com usuário pessoa +* São válidas todas as formas de literal double aceitas pelo scanf. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmDouble( double * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro nome +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o nome lido +* $P tamString é o tamanho do nome que foi lido +* $P dimString é o tamanho máximo que o nome poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do nome lido +* +* $EIU Interface com usuário pessoa +* São válidas as mesmas regras de nomes C. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro string +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o string lido +* $P tamString é o tamanho do string que foi lido +* $P dimString é o tamanho máximo que o string poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do string lido +* +* $EIU Interface com usuário pessoa +* Um string deve vir entre aspas duplas. +* Um string pode conter caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Pular comando de teste +* +* $ED Descrição da função +* Avança o cursor do buffer de leitura por cima de um comando de teste. +* Todos os comandos de teste principiam com o prefixo '=' +* +***********************************************************************/ + + void LER_PularComando( void ) ; + +#undef LerParm_EXT + +/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ + +#else +#endif diff --git a/TESTDADO.c b/TESTDADO.c new file mode 100644 index 0000000..a53d8e3 --- /dev/null +++ b/TESTDADO.c @@ -0,0 +1,123 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTMAT.C +* Letras identificadoras: TMAT +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criarmatriz - Chama a função MAT_CriarMatriz( linha, coluna, vtMatriz[inxmat]) +* =criarlista - Chama a função MAT_CriarLista( lista ) +* =avancar - Chama a função MAT_Avancar(vtMatriz[inxmat], direcao ) +* e avança a célula corrente da matriz de acordo com a direção dada. + as direções são: norte, nordeste, leste, sudeste, sul, sudoeste, oeste e noroeste +* =inscharantes" - Chama a função MAT_InserirCharAntes( lista ) e insere o char na posição posterior ao corrente +* =inschardepois" - Chama a função MAT_InserirCharDepois( lista ) e insere o char na posição anterior ao corrente +* "=inslista" - chama a função MAT_InserirLista(vtMatriz[inxmat], linha, coluna ) + e insere a lista na posição linhaXcoluna da matriz +* "=excluirelem" - Chama a função MAT_ExcluirElemento( lista ) e exclui o elemento corrente da lista +* "=irinicio" - chama a função MAT_IrInicio( lista ) +* "=irfinal" - chama a função MAT_IrIFinal( lista ) +* "=obtervalorelem" - Chama a função MAT_ObterValor( lista, charRecebido ) + e compara o charRecebido com o valor +* "=avancarelem" - chama a função MAT_AvancarElementoCorrente( lista, numElem ) +* +* "=destruirmatriz" - Chama a função MAT_DestruirMatriz( vtMatriz[inxmat] ) +***************************************************************************/ + +#include +#include +#include + +#include "TST_ESPC.H" + +#include "generico.h" +#include "lerparm.h" +#include "DADO.H" + + +/* Tabela dos nomes dos comandos de teste específicos */ + +#define JOGAR_DADO_CMD "=jogardado" + +/***** Código das funções exportadas pelo módulo *****/ + + +/*********************************************************************** +* +* $FC Função: TMAT Efetuar operações de teste específicas para Matrizes +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Matriz sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = DAD_CondRetOK ; + int CondRetEsperada = DAD_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + + int NumLidos = -1 ; + + int valorDado; + TST_tpCondRet Ret ; + + /* Testar MAT Criar Matriz */ + + if ( strcmp( ComandoTeste , JOGAR_DADO_CMD ) == 0 ) + { + + if ( NumLidos != -1 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = DAD_NumPular(&valorDado) ; + + printf("dado: %d\n", valorDado); + + return TST_CondRetOK; + + } /* fim ativa: Testar MAT Criar Matriz */ + + return TST_CondRetNaoConhec ; + + } /* Fim função: TMAT Efetuar operações de teste específicas para árvore */ \ No newline at end of file diff --git a/TST_ESPC.H b/TST_ESPC.H new file mode 100644 index 0000000..987ff8e --- /dev/null +++ b/TST_ESPC.H @@ -0,0 +1,320 @@ +#if ! defined( Tst_Espc_ ) +#define Tst_Espc_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTE Interface de teste específico +* +* Arquivo gerado: Tst_Espc.h +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Este módulo consta somente do módulo de definição de todos os módulos +* de teste específicos a serem desenvolvidos, e também da especificação +* do tipo de condições de retorno deste módulo. +* +* Ele estabelece a interface a ser utilizada pelo módulo de teste +* genérico com todos os módulos de teste específico a serem +* desenvolvidos. +* +* Os módulos de teste específico devem sempre incluir este módulo +* de definição e, idealmente, não devem adicionar mais itens +* à interface. +* +* O módulo de teste específico contém a função de teste de um +* determinado módulo ou conjunto de módulos. Mais especificamente, +* contém a função que interpreta os comandos de teste que exercitarão +* as funções do(s) módulo(s) em teste. +* +* Poderá conter também diversas funções auxiliares requeridas para +* realizar os testes, vide "contexto" a seguir. +* +* O contexto é formado por variáveis e estruturas auxiliares necessárias +* para que se possa efetuar todos os comandos de teste. +* Por exemplo pode-se desejar testar várias instâncias de uma +* mesma estrutura. Uma forma de resolver isto é criar um vetor +* global static +* de n elementos em que cada elemento aponta para a cabeça de +* uma determinada instância dessa estrutura. Para realizar um +* teste relativo a uma determinada instância, torna-se necessário +* selecioná-la através de um índice contido no comando de teste. +* Este parâmetro, embora seja um índice, é na realidade o identificador +* da instância da estrutura a ser manipulada (idEstrutura). +* +* Caso o módulo em teste requeira um contexto, este deverá ser +* estabelecido no presente módulo. Para tal devem ser declaradas +* variáveis e estruturas encapsuladas e devem ser incluídos comandos +* de teste capazes de manipular o contexto. +* +* Uma das formas para estabelecer o contexto seria a de incluir +* no mçodulo de teste específico comando semelhantes a: +* +* =iniciaXXX que inicializa o contexto do módulo sob teste para +* vazio. Este comando deve ser utilizado uma única vez +* logo ao inciar a execução do teste. +* =reset restaura o contexto para vazio. Este comando usualmente +* assumirá que o contexto a esvaziar esteja correto. +* O comando deverá liberar os espaços alocados aos +* elementos, anular as referências a ele, inicializar +* valores de vetores de referências, etc. +* O comando tem utilidade especial ao segmentar um teste +* em partes estanques e ao controlar vazamento de +* memória. +* =terminaXXX este comando destrói todo o contexto e não o +* reinicializa. O objetivo é poder verificar vazamento +* de memória. +* +* Evidentemente, outra forma seria a de alterar as funções de +* inicialização e término do módulo de teste genérico o que é pouco +* recomendável pois viola o princípio de um mesmo módulo genérico +* servir para testar todos os construtos. +* +* Para cada função do módulo a ser testado deve existir pelo menos +* um comando de teste. Em alguns casos pode ser interessante criar +* comandos que armazenem, alterem ou consultem variáveis de +* estado do próprio módulo de teste. Ver os comentários sobre +* contexto acima. Ou seja, podem existir comandos de teste que +* têm o propósito de agir sobre o contexto e, não, o de efetuar +* um determinado teste. Alguns desses comandos podem inclusive +* realizar verificações entre um resultado esperado e existente +* no contexto. +* +* Todos os controles de consistência dos parâmetros dos comandos +* de teste devem ser realizados no módulo de teste específico. +* Recomenda-se que seja sempre retornado TST_CondRetParm, +* sinalizando erro de sintaxe do comando de teste ou valores +* não permitidos. Deve ser sempre assumido que os parâmetros +* podem estar em erro. Ou seja, o controle da integridade dos +* comando é mandatória. +* +* Caso seja necessário emitir mensagens especiais, +* deve ser utilizada a função genérica "TST_ExibirPrefixo". +* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, +* (prefixo, ou comparar), utilize a função +* fprintf( TST_ObterArqLog( ) , "..." , ... ) +* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") +* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção +* assegura a consistência do aspecto das mensagens com o restante do +* programa de teste. +* +* Cada comando deve ser completamente interpretado pelo seu +* respectivo fragmento de interpretação. Ou seja, não deverá ser +* retornado para o módulo genérico qualquer dado adicional à +* condição de retorno da função de teste específico. Veja +* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes +* à mensagen já exibida. +* +* A função TST_NotificarFalha sempre registra uma falha, enquanto que +* a função TST_ExibirPrefixo pode ser usada para emitir mensagens +* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo +* seja utilizada para sinalizar uma falha, é necessário chamar +* também a função TST_ContarFalha( ) para que seja notificada a falha. +* Isto não é necessário no caso da função TST_NotificarFalha, pois +* esta sempre conta falhas. +* +* As funções a testar que retornem um valor sempre devem ter +* este valor verificado, mesmo que seja uma condição de retorno. +* Utilize para isto uma das funções " Comparar" do arcabouço. +* Caso uma função retorne dois ou mais valores, incluindo +* a condição de retorno, utilize um código semelhante ao +* descrito a seguir. +* +* Seja +* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... +* a função a ser testada e, v1, v2, ... os dados retornados de +* alguma forma (valor retornado, parâmetro por referência, variável +* global). Assumindo que v1 seja o valor retornado. +* +* v1Obtido = FuncATestar( ... +* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* +* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* ... +* +* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; +* +***************************************************************************/ + +#if defined( Tst_Espc_OWN ) + #define Tst_Espc_EXT +#else + #define Tst_Espc_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define SINALIZA_ERRO ">>>" +#define SINALIZA_RECUPERA "<<<" +#define SINALIZA_COMENTARIO "!!!" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste específico +* +* +* $ED Descrição do tipo +* Este tipo enumera todas as condições de retorno que podem ser +* geradas pela função de teste específica. +* +***********************************************************************/ + + typedef enum { + + TST_CondRetOK , + /* Comando de teste executou corretamente */ + + TST_CondRetErro , + /* Comando de teste encontrou uma ou mais falhas + * + *$ED Descrição + * Esta condição sinaliza que um ou mais resultados da execução + * da função sob teste resultou em um valor diferente do esperado. */ + + TST_CondRetParm , + /* Comando de teste está com a sintaxe em erro + * + *$ED Descrição + * A presente condição de retorno deve ser retornada caso a sintaxe + * ou os valores do comando de teste estiverem em erro. + * + * Todos os fragmentos de interpretação devem: + * - realizar a análise dos parâmetros do comando + * - verificar se todos os parâmetros foram lidos + * - verificar se os valores dos parâmetros estão corretos + * por exemplo: verificar se os índices de acesso a elementos + * estão dentro dos limites dos correspondentes vetores. + * - efetuar a função a testar + * - verificar se os resultados retornados por esta função estão + * corretos */ + + TST_CondRetNaoExecutou , + /* Comando de teste não se destina ao presente interpretador + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de comandos de teste relativas a módulos do próprio arcabouço, + * caso não tenha sido encontrado um comando válido. Isso permite + * estabelecer um "daisy chain" de interpretadores em que cada qual + * tenha finalidade específica no contexto do arcabouço. */ + + TST_CondRetNaoConhec , + /* Comando de teste não é conhecido + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de casos de teste específico visando determinado módulo em teste, + * sempre que esse interpretador não consiga identificar o comando. + * + * Cabe salientar a diferença entre TST_CondRetNaoExecutou e + * TST_CondRetNaoConhec. A primeira corresponde à não interpretação + * de um comando possivelmente válido em interpretadores subsequentes. + * A segunda corresponde a comandos não válidos considerando todos + * os interpretadores. */ + + TST_CondRetNaoImplementado , + /* Comando de teste não implementado + * + *$ED Descrição + * Esta condição deve ser retornada ao interpretar um comando de teste + * específico ainda não implementado. + * + * Recomenda-se que o desenvolvimento dos módulos sob teste e do + * correpondente módulo de teste específico se dê incrementalmente. + * Consequentemente diversos comandos não estarão implementados + * no início do desenvolvimento. Esta incompleteza poderá ser + * sinalizada com esta condição de retorno. */ + + TST_CondRetMemoria + /* Faltou memória para executar o comando + * + *$ED Descrição + * Esta condição deve ser retornada caso tenha ocorrido algum erro + * quando o módulo de teste específico tentar alocar memória ou + * outro recurso. */ + + } TST_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: TSTE &Efetuar comandos de teste específicos +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* sendo testado. +* +* Cada módulo de teste específico deve desenvolver esta função. +* Poderá conter diversas outras conforme necessário. No entanto +* estas devem todas ser funções encapsuladas no módulo (static) +* +* Freqüentemente é necessário desenvolver um contexto para o teste. +* Por exemplo, pode ser necessário tratar n elementos disponibilizados +* pelo módulo sob teste. Neste caso deveria ser criado um vetor +* global com referências para estas elemento. Ao iniciar os teste +* este vetor deverá ser inicializado. Ao terminar, os elementos do +* vetor referenciando algum elemento devem ser destruídos. +* +* Todos os controles de consistência devem ser realizados no +* módulo de teste específico. +* +* A função TST_EfetuarComando( ) deve retornar as condições de retorno +* identificadas no tipo TST_tpCondRet. +* +* As funções do módulo sob teste que retornam algum valor sempre +* devem sempre ter este valor verificado, mesmo sendo uma condição de +* retorno. Para fazer a vereficação da corretude, recomenda-se +* utilizar as funções TST_CompararXXX definidas no módulo genérico. +* Assegura-se assim a uniformidade da saída gerada durante o teste. +* +* Para realizar a análise de um comando de teste recomenda-se +* utilizar as funções definidas no módulo LerParm. Elas, além +* de realizarem a análise léxica, permitem o uso intercambiável +* de parâmetros simbólicos ou literais. Também realizam a +* verificação da corretude dos tipos dos parâmetros, contribuindo +* assim para a redução de erros de redação de scripts de teste +* que possam passar despercebidos. +* +* As funções a serem testadas que requeiram algum argumento, devem +* ser chamadas com valores (parâmetros) extraídos do comando de +* teste sendo executado. Use sempre as funções do módulo LerParm +* para realizar a análise sintática. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* TST_CondRetXXX - veja a descriÓcão dos possíveis valores +* retornados na especificação do correspondente +* enum +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; + +#undef Tst_Espc_EXT + +/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ + +#else +#endif From cb512eae592a8ed6403f9a4c4083e67ab1e1408f Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Wed, 16 Sep 2015 23:55:52 -0300 Subject: [PATCH 03/18] Teste de dado terminado e teste peca adicionado --- DADO.c | 22 +- Dado/Source Dado/ArcaboucoTeste.lib | Bin 0 -> 89288 bytes Dado/Source Dado/DADO.H | 73 ++++ Dado/Source Dado/DADO.c | 72 ++++ Dado/Source Dado/GENERICO.H | 588 ++++++++++++++++++++++++++++ Dado/Source Dado/LERPARM.H | 463 ++++++++++++++++++++++ Dado/Source Dado/TESTDADO.c | 125 ++++++ Dado/Source Dado/TST_ESPC.H | 320 +++++++++++++++ Dado/TRAB2-2.exe | Bin 0 -> 76800 bytes Dado/testedado.bat | 1 + Dado/testedadoscript.script | 5 + GERAALT.C | 1 - PECA.C | 25 +- PECA.h | 6 +- TESTDADO.c | 10 +- TESTPECA.C | 158 ++++++++ peca/TRAB2-3.exe | Bin 0 -> 77312 bytes peca/peca source/ArcaboucoTeste.lib | Bin 0 -> 89288 bytes peca/peca source/GENERICO.H | 588 ++++++++++++++++++++++++++++ peca/peca source/LERPARM.H | 463 ++++++++++++++++++++++ peca/peca source/PECA.C | 92 +++++ peca/peca source/PECA.h | 98 +++++ peca/peca source/TESTPECA.C | 158 ++++++++ peca/peca source/TST_ESPC.H | 320 +++++++++++++++ peca/testepeca.bat | 1 + peca/testepecascript.script | 21 + 26 files changed, 3589 insertions(+), 21 deletions(-) create mode 100644 Dado/Source Dado/ArcaboucoTeste.lib create mode 100644 Dado/Source Dado/DADO.H create mode 100644 Dado/Source Dado/DADO.c create mode 100644 Dado/Source Dado/GENERICO.H create mode 100644 Dado/Source Dado/LERPARM.H create mode 100644 Dado/Source Dado/TESTDADO.c create mode 100644 Dado/Source Dado/TST_ESPC.H create mode 100644 Dado/TRAB2-2.exe create mode 100644 Dado/testedado.bat create mode 100644 Dado/testedadoscript.script create mode 100644 TESTPECA.C create mode 100644 peca/TRAB2-3.exe create mode 100644 peca/peca source/ArcaboucoTeste.lib create mode 100644 peca/peca source/GENERICO.H create mode 100644 peca/peca source/LERPARM.H create mode 100644 peca/peca source/PECA.C create mode 100644 peca/peca source/PECA.h create mode 100644 peca/peca source/TESTPECA.C create mode 100644 peca/peca source/TST_ESPC.H create mode 100644 peca/testepeca.bat create mode 100644 peca/testepecascript.script diff --git a/DADO.c b/DADO.c index 5d2aa73..63e4dd0 100644 --- a/DADO.c +++ b/DADO.c @@ -22,32 +22,46 @@ #include #include +#include #include "GERAALT.H" #define DADO_OWN #include "DADO.h" #undef DADO_OWN +#define RAN_MAX 0x7fff /*************************************************************************** * * Função: DAD & gerar o numero de casas que devem ser puladas com 1 dado * ****/ + +/* Funcao do Modulo */ +int dadorand(void); + + +/* fim funcao do modulo */ + DAD_tpCondRet DAD_NumPular(int *NumeroCasas) { unsigned int i = 1; int DadoInicio = 1; int DadoFim = 6; - int *NumeroCasasPular; - ALT_Inicializar( i ); - NumeroCasasPular = (int*)ALT_GerarDistUniforme( DadoInicio, DadoFim ); - NumeroCasas = NumeroCasasPular; + //ALT_Inicializar( i ); + *NumeroCasas = dadorand(); return DAD_CondRetOK; }/*Fim da função DAD_NumPular */ +/* Função usada pelo módulo */ +int dadorand(void) +{ + int dado; + srand( 3141592653 |(unsigned)time(NULL)); + return rand()%6+1; +} /*********** Fim do módulo de implementação: Módulo Dado **************/ diff --git a/Dado/Source Dado/ArcaboucoTeste.lib b/Dado/Source Dado/ArcaboucoTeste.lib new file mode 100644 index 0000000000000000000000000000000000000000..41ba1990924bce9779c6bdfa6b21565e71e10993 GIT binary patch literal 89288 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

(+lxk=fk>%<99^g>Amgv#<{Lp z5O6HIcgLFp-usv6Ui8p2x?V|o?_oq?e-Gw2xTEp>%-c}E#ISJPTh#s7LaNxm@j-y- z`pnJvv)i4iVCA{h^r^T71fBR)?yvWzX4<}4!|Q?~(aVDAgh-NgMi}oGiS%{R2M47h zGfAU}c4ykYJVGX`=O8n~Q=pKHb!yYZJ=E9ZjyK0zx63dlk$!Jq0dq%+Hn=m-kp6Fw zdZ%j6fkgVxWcsD(@bz!R*U18%A9hoIOd;c+Ih;iGFJ(jO0IHHlTZqah<~{B5>_arG z{yd2*a*y4MzYAGforpVzQtUn+sn}4GIe{stRTG?rT*v$zXqIwn?<`kCJ!~Plx~Thb z(ci1*ec*F)s?3XsrbMgV^P=S`^P|*Dm+G1Txa=xBvOX zGEQX!vWApkK1h87oXkj)Q8;l;UZV0@=sjM*OBdom5QJ%EGR-ZWYO$ z1<5H!nbVD86*Eezw=Tstg~u%S)My^+Y#$Q08HuZp?m^n(l9ebuMx{X3Q^ZK=Cu+u# zq=Yq1>X)A2l0r=y=X7FjsjSgLcZ|&^vG+_FDypRkjLWe9|MhdiyZge!k@+Vp8{8=W z9e<;oEPqNqQAP4n&5dudO!E%vP;}4YsC%G;K$C z82U#A~AGnzkeIu4dOy6?%qQC!nOr4gLyW-|6C5WiALe zG#QeiJhD-8$IKkJrP+MsrEJG^S6F7%v2|}{Kql7!ejlQFB{d7`qVITL;^=j>&_~b3 zq?R>B58-**)0#Pa+TqCTt|v1y!H>lfS}C@;Pn&%Ls>>;WS(KB3i_u4}tQGXR~3o z^t#b8?K+l}*8Ld5JJ)1hFe6;M1yG?rc+|9hdE3k6IA$iLN+K#VJvqYq`$Xmrmkckgc2xJZm!|e{xdSm$}M^IKHWsZ zUb=%M3lGobneqi?t&!`_h(Kq?xz^zOURzID>)}9@?*zGny>Ca~>wYObv$rb6utu+^ zbIQr8t5c$X;_m0p?zbaDdM@qZ{_){~J^4MiDGZ^Ej6TIScwfRz(fbxA2RAHW0tyGM z(@5kX$}hEk2`08Oecdj)kNZ#ZJaA|~K?J!Urv5x`{9uLaN0b>Xj~n{P_h1-3 zF0CSpeR!f7PW1e&^ByhW_wG;pzSLXxe&WYpC)Y0(PO}nCHR*``i2-vr!(5{8{^0qG z`ta*AkjwCyhYm) zAkjus_EK2N-+)A05;8`#WdMm}nzkp}CTiL&AR}!+M%sXkv;i4u12WPEB-(BRGSUWQ zqzy>4eG90Tt)jJ9g!YuCy#yo^;SXxsAA!m_hsax7VqAdEgxEI`h+2eXl?$|x`O1LA z(rO^FbODf9S`Tyy$7lo+O9Mb+>Fq$G;~pTXIbQ;r$&z;f$%J{DEH3qBKahvz9RLz3 zzXKY@v_ELt8$hF(MytFC-}^w9G3~FK=ECDtCaGTpl*yr^fFuS@FCW9S$(lA5=yIk} zS6TQ z&=AmgrriW2I&K3J9rpuC+vX zvJvA#Ac>I=Bso+8BssJINOGtFNOGtNNOGtZNbVV0nMNev1SGc5dNd;WOF&X1z5^uk zegq`)eg-7+{sU+tTlzGR$fIxhBJT*0$Qy()WU=&oAhGlcAd#E{B$D%iMDk~V#L^NV zkvtnnB-aCpc!x}vSBo^!j5(^Fhi3KkKi3JCN#DYUWV!_)$V!?Yr zV!e@>D5p5knqU|mq(e@=E zsgqkY?Fk?wZ9qoafQ+;O8EFGD(guY8(DpX|7-<7C(l*%Cb}rCR<{PJJGc{TWBzl{H zL~jU4^xg_2dOLwc?*<^z+Y2OmKMy2&9|4k7eh*0W?$NY2fJEC-Akj8ph^g%?Akmf% zB-(}piMES@MB8ORqAeFlv=su0wn~kz*P%B7iQYSbMDOQ-B$ZzV61|&&W+SgM)T2P6 z_uD|C_xnJicNdW8eHKXWvfl!U1%K3`9{`EoWGEHA=ira%y$DG3dVprL-f=*p_bMRK z>je_MWk8~LF_36$*0j5TMB9Tv_>a2rb^N)8C4UP@v~2|vZQFrF+fRW+TR)I!djUwa z{Sin~IRuTa(8dCZwmcv(K-)Dy*RZw)K%(t>AknrANVF{n5^XDiMB92Gk$f-E*(~ot zAZZVNszZMXBs!i45*;rCiH_HSCUM-uK%(OvAkmQmv7%!PP=GDX0cznG#Tu0ZE$7e$ zK<9Gk^*S`H(JeqZ9C|xYGsn1Fhd!jy*MUUacYs9R4}mH;#!rE=S;|fzv3W0$*!%|2 z91i^m$jfNZP*X}Okn~@&fFxh00!hAn21xRy9Ec_*CaXC>qN4^#bhH5Z5t^ZH1EQCW zWYq;E`4ZK%do}Iffby8{``kk8c0(429WfX-v+AW(D#AF(&Ip4sTJ>aoi_>q~7laI*a2T01{hX0uoye0*Nh$fX-*Ww}Ixdl=pzdmce-BisVayq_oBW zrE-k%Kqws8mkoq!36u{cHqQXUf6$8YNAju?C z2)8h#tOdG(Lq7{7X?qAr-f_MSB$oadNGx~?NK*bZkfi+AK$7y`0S#x#uK-EP-vE-7 ze+(q@hQM^uaS_mk9K)k&V}Q!pstKBw4YY!3vw%d(av&+0n}NjoZXmJmZXmJmJ|MC0 zA)pl2wgpJ+`zDas_au-=-UlT1J*&}gfEKU?uK-E@y#W+v8nWM@4FM8c&Ib~C`9NZ6 znGUT15=)l=iKWYc#L^W&VrdXaER6t(rBNV}ycK99r)V3Hf5*5sBoK9w^58s+ z5#<_{E!>xJrl<8Ft_gD)Eya00qjsEY7=2n9(yh zFJW{L=Xyp*aBg5km0~F)8dvf$@&GMklm*nts1T@$Q8kdC(NZ9)kAqY@5ZO3LbpmxT zx(6u2sPG@Q>gOiNcOG`{0~8y47A6`DU)Xwozr~9eeLjc>J`1)zLntK4l?&_RkBdP{ zM+oz9@OYeQ2vR5w?Xs;RjTTxw^c18!!J<%G;Bio>H0a}&#nT3gwX!2F)NT0D_Y;eU z(x0U%_Sy9V5t8KUBUT*mUOV&&L0Ee-H+xDBUoejnNLOVS7!+1zsbs@U?`3)1_k#fwF$C+Q5g{j;g{sv3>h?1ZXKq7 zRys%`C*D7cxao=K!OzmQ6IWRd%5%7S#zA=vS8|X&bbKI}I1?qYGy7mzX&w?wp29>k z<>Z5>5I?d9auTkC>?&jN1J|C=oeCF&BeCaTvL}89eF8U{hCPYY;wC za)|a|yPq06K1^NP5bGWYu_W&V#mVzqP-sPMi|0?ogTk^Xw5-fl2W2EES?Cg3Jh{Z< zpv(oOda#{`-2V?cDC|^8hGE92EMl(1}i?#nT6h2d@Mcc-2!xbHiWzx~8XG>Xg@?mE5r{_ew%}@c_NP0G4Y_uug2k6O4&#L^aCJ;O;%xOA?Ah&{fI&B;}RZ1b%*_KsOh zmx@d8ww+*$Zc3(g2RPQ@joUtwc+HK(?O8~Sv0H=_uhW!9e@A;$piO(OYQNQN@=di4 zb5FtS$+_7DOqP{%8?mS01L!(GPB%D?M1HHEYLx|Bf1c!zqf^Y$NqYsx>?!ENQ=p%o zA-1D1fj{a|4CU;?)8NN6#DOD#IGzN11yT?3*JIJMzf$RWGko@>o|iCZnpSY`zaz4}_=8ruHihnjQ zS)Cq=gO+|AZIO3{r_Be4I6OW))~dVYAXi*kQ(aO~HBo!FHF-R9g5<=@Zg04`coEx> zkq8*l=wIfKz+M;;K>FHf3wyRDkqz=(IB8^^R!UDI8ULhxy88Nmd;W=&Xd@~VIc(GB zm3+TQZPgy76BSxy9z0Bx9&6cSikx^E=acYY>sj&~4SH^jkf%5{$u@6R)K2P!Cem3d zX5t3N!qT|C`R*bQR@$bN+}m+@Dw=Q~;ht*eR06l_bPR#Zw8s-8Wr8O_F(x-5t}T+s z)8b$4n+h-7tQ;Cf^FT29wi~RtE*oHs67+i^q3C?Tfxm9{By5KOvhr=$b9+|r1OSkc-a44;uXSBGgc-VP)=L8?y9AE&*}+hlD=J%TOL{nu>IVPeuEa~4umSb+X;eeU+^t2tf zUCg5SbcljwJ~pPlH+cK37-PiCdCkeW4W(-*w;W26Z+Y0rnx*nA-nA!>UDtb4rOp2% zGCamI*aVkJ7$rnrn#r8oULq*o=0q$4W8NDQ+xI7p0dp7Q!w4`TGDmQ zv&P-qI_{O;x^dB`#y=M~t$$A$MnIsXES)?}dfHRBlTMm)XP%?|i=_J0qfGYmvRSks zcOBP*>UmOPl)O|VZ|K4m%FLD2=NJHrnA058N_+j@9ndB)rkEP|1Ubew+~S{ighv~vAx1i!^pP$K@>ATB>ehQ zgwvpN;`l~>-b@VMqld_LsZ!9SA)kbnJ}pOuiUeGykb>I$vW2Cso{ za6)$2qucYJO3IlZ9KWk?wk?Lu{v(>7%S##&G*~w7{kDnmLXPsClN_x|?I}-}Vm5l;fa>0=@)e&k+#KrQKt7uSn%S7 zcBe~mS)nD?Hq5KRohR$y;Wo^`ME>H8YH?SR8?U!`w#=`u!|HV7jQAtH$Bpt$+g3Y0 zbv_q}@XtcNb{%)Gc|BT8#%Dwejg6iq7@>!U+St*qMT@Di$cUC3dwZXRaU^m)-5LAv z#yrq7?MQeU-w|o+hazJN+S9|;wg`tO*)ALgN_*b578)*1$YVUUphIrI%!2mR z6R?73PZ@m_!fFkk-tww~s+5QutIrHiC>Y#QS*F&NM}|mEDXR#dkU3iAG5Bk;m_2s zM0X^)YxPJKdA+B6q;#+xH-t^zns|BPbW_-%J%z)OG+nPvA-4EmI8}VAj^=%lAbzUu zFIeeG-u_iQ+{`3JlDE^d4qcX!rW~98u?gb4;XiK14!;*I^qBDy=>N3wFW0xGWxumL z3WxXG?46l_KUs=M?h>vX*FYF`BxX@++hd`4F( z_$Bk4R!sT?qWKUsKTy^V#wQWb@WF$J6_eRR37@|~^Wsb|eaSp~nR=wjyfMvCMx{98 zlL}}URpRg3$vijmCZ^HM-BtKy@SHWV;8tAY!!crP#91t$CW&U;C9^-T(7umr>WC$) zpW!UDJwPIbo@BSAe^*+uQF!~G5G(Qr0TzDm88g;n0!ev10VL^t1LzWtaTKT%C_|B#=A}%VhK5VZ zcOj6ZatV+~Y1W~40MQIi_>KaJlr2D#;{_5ai0Ye`+fr?dHRaxdmSi``QFid zM}Z{AU1(QCUNTTV^HJwXNj-6y~E%fP{~{G$rrXX}&vw3YhO+&G!J1 z)RHZl?-3vxCr(!1)qGC?iM&3bAsqTFkXY~=plM8d1xPG-UGx1-qhV;2B*ytb(>cZ{ zAc=7~kVr1ld}Tn?Jwdyn`4($F^2n4Jn}NhW^1hT5eFsSL{%1g)kdmQ(2{eo49R&Iu z(>?%_Hf9iJ9nIm;vw`m8(DQ++nC8(m^1htQv>BRK2UN|p#hTU(M03HD6?tEZyxW21 zGp$?G?gpx1+WngLFi2plg}-A<%V< zj_c5~@DRA3X~TfT(h)$5nC8*6%Yha%&8yK2pe0Nz)_ik->X}xfY0H6VJ}mqkHEk`> zQl@=YqX&U}O#7AZaIuq4G)S`9OXS zy;##m12r>kERe*V03>mXf#eRI10?n8Iv|l(544=)HUddp^6Qki?LbmHJAoudH&6@5 z*a##s?go+=_W?mOnU_Aaz^BVDw2N)B$E4p#&YOWK$4;ZKwCh|P_F=q zjyHhDG2gpDqT?74iXG)K1~>F(jzPYt5@Q;WSXBWeF~}=btRk;ev8n+`thxb6tXc&m zR^19DR&4+htF{1%jz@s5U<|MEb(-%Bn(w=sZyQi9^X<@l&uPAQG~ZFp=RyZb>^l$0un)+v59l*u zpXRI8d_K+B3{=Q`H)_5On(t8{xfi|-RK$GW1Co2;381y0Whn9|oynp7KvD`n2P$UT zGeAt(l#Km zv;#;iT@56b-VP*|-UTF~Di@N(AAkjfyq@_$FFH+G#UZkR950J$8 z1rRC};{F;);=TY>#=-F{qRzW_efb*;f~>Wk&4``CU^J+~ipciWFl`voxN zrTu8JUjY9J38Az=e-Z@^rxOk{eFsbc&jX?d@S}S&2{o6FSbL&OrIYZ-rjL4PbeLj) zCYPk2NmQ5U;KIS*Y`(JiW3LNN5gyBLmcOZggAw1}{ z&b^F|;QU!el!72P2g&rDp= z-DOeey=tU`(u^yQgF^L>?rDi-pD9dsCAnN=8jgh*y=+ud6?& zWc9q0lIK;wi=pJIgHFnn0^T~-rX35*z2@X8n4)OR%g$3^+nkiV5wo)LREwPllmfNJ zNy*Mq564iv>d_d=6!o~1;w@kgCapa;YjT$QwUcLZfjZ=*C#3*BdJalLH;}wLn%rQbqpn6t&gEhQ4cvOxGx@$p=7JAF%+-b8$-!ghhiuN z>WGtq?WF%4L&;Go$&TD8$WtB%#hZopIfjz2Cd5z*RJoIad$1*jlCSQGp`etVl$>1k zyBJEo@(i+D=*1S#A31rj#dDLB2hW1_F_c_IYn!1m;FhL#)tft6JsLwnjf$a6QO|3N z-Io^Gh^HQTz68(~PMh#3bx4ilF5~Y&W%>ht!wk}t9~czehWt!b>feFHI+OCOBbMC* z7s-eAYP4TtG>-{h2B7DlrTtAaNNfMtL1~EhYJ|^8yno^_q_iD6Ey)*yve`kI0m?HD z3hktqj$~S~ZUKebLyK}RDEBxhkATwWpzH?apo8+Cpiq`sa^3;OL81HI;-PhrI}HkaSK)5scjPl&>;n(ol@yD35^cb3 zZGmmppTmfC5cN=EksPP*DpAfx-cSe8;<*HrgM&>A6Z=Pxr&z`TB{;6u6jS?kpi~br z*gcb2k$v*+*po8aEpln8`){^sIpd4{fTqvt7 zjGG4TOE{Hpd4{f=93(ZTv&4ape%JzZlPG3(u=DG^24wk3*pXS`OX50 zzXkbCvPZ03b`;6x-|)(0CrrMS9jJxDqLMt>qucP!GB4raX$XUZCH9cEOkm$e_#(hj z0ZM6SOYc#jNb;_DgzyEWxEuH z4uA!x*ipQsR8%A?KN4dr0@DZ9k(Q!WKKNFc4z&^_nZTA;8~$$+U~|Kz^zw#%i9$>t z);NvY&(2gN#aQfH=7+0x3+h~)_p@-!@wau*hI+!lRZ06?YY$~pD5ZP8cm-k$*oF>& zVH)TwC8c7kX$B?5PAP|Llbz3A zJB41td+~+HPstQQV(0j%G7Cj~j#!(W3>PF@2%8!!MTp|U#9msWb52L#7SsHeI2{S| zRug&K_#v(SP`fX*@)P(SEz+b=hW5wu=(nLfHuI6nvZ zo&^5M?VxYH0%7BY?*jZulnxr|pnY}i$N$!D@wPhfY5kbnum%Gq32SZy+Lq%Zaf^?> z6siFBux$!PmbD^uMw7p>)fe({#Y5N(|LVZ9K**pr`htqeZemAcD9|2Op=J1l#}&?F zxZ#nzGB(T&`==6lOveyKdxTz&IJ7^gh=I#;(1VKohn0SK=+OWcEw1448NojC6%HF7 zZyYS)D_${N>exWI$FXA<&B%b~UWdX$5n)J1$M(HYz&DX;ESD@2|3vb)!``A372UyP zsWt)^9gV@Z7JnlY;iv(ac|ihkWFm;bWTc;nawM8bx`B{>nr(rnOnqrIzU+b1zlww;W)X$Pip2;eU#1 zK{;#Gi`HPho_3K5xM901RKd2*x?_XGkG!$Fyl=rD4JPZQd;I) z)`-f3Nh@#|g)6aL2D$Fy)(PM>E|DaB7<;cNz>nqo5z9Su#o9eXGE8ESCoHlPV5Au?DT3fGHTYweqdNGDTzf4%R z&AR1%ZGTK*u?}=CL_9<%ndF*7W4S7deJOb7+q#AHR;|YGoa@-iHu^4YW@~It%OdP@ zQoccPFa>qw0teaJg@b$wcjF}v2TzSP_qTOS5Uw$&(7L@Z!BwjJ`{0(1QPR4<2`sZ> z=e7I=nDy8;dg6)e;RSJ6%dOQZ$x8{B63E= z9-WaZIAxA(Ot3*_Dx4HggRyQ!7AJ0F*#vkUOz#N0r?*8$Mpt>FyX_8_g>`1mr$8>1 z3EPMK7-0sut+F)A(Mk;XF$LLeCrtN*2TdOwris}y*V-&-<1br9k;DOtFOhyN0(htJbVv+M@f*W ztA1nuqJBw?VgI#h>vw`-`s%dx)PAIG>+99Ce0U6MfF>UNTL?? z1D|cfgKhXM8y;lCsW$u>8y;)JqiuMxi4!G;Gh$;WnT3i}4}-if3BUJf^my8~9tw%e z=mJODi#k#$y@#?6r%m?(bqwq}lz%v>>(Ig-ueyuMlAafVT^|ov^KX*5YcEJ-3mL!} zOZk8L#}FJYIwd#;B%oo%r!@D!PDnwAD%r)B#t8)m3p30!`$$r7@a7O;JpiPnv~rGum_^i z#EMZ1xLM5DkjCN)*{GknAYMETZkt8>jiqgq`@zz}+>ybZ{5WffjFPIb!F{!eDPuX) z-oJggh*|T~-R`SZLyxz92{#Li#DArQ(!nP~a?0+KNyo9~T7A#>C1j|PpIvW_W4Z8d zgD3k64;|c#lCUI-cDV+#>oSQcl=Twt<9Ve&OQ;ZvxzmuV=06f6JpwDPTXnLm$Yr2lxL=7ly^9DMI)Qj#a=Xn zpvk?#)xWXYLk<3hbZLfJgOt|T@F?QJaP!bSJAXvBjSY`Dv0$UeK+?^^MPAHvX26IO-!BQ$fBA}lE&VA-TS|}Xy8b9< zKuV8fz;#mUBDk)1D;e7P;Z<}$j*lcu>WmtH1+`xrh{3E~l*{L`iFU>{FIculK}{Q;>DU2mnJ3Hf9>GGRrtEk{yc_!Cs6 zzI-9>|NfT?Jt)7_mq)NtqS&$?ewolU5(_|Z@~OQVg7zwGYp>+a`z$4`g-&J`83|{# z9Ka{Og!VY3ADhxg7s-ZKQ=!4RCWQ18Q? zfz>9RN=<#w!$}KiJoXPfZCh$qjgCJzUq6Th;*|_w=1=3V zfV*XQ^jFcnD%VgijeU(c<>P)pEg#fE745Kx@43Xq&m62!5{ODjt0N;mwiVU8a`TZSoaaD zv8oR((Jn2DW<9((fp(f;CEB?u@>C1^;j0W@yG)vTB{HQzY1d>^`fwD*mBpo<(^Ojb zn0L4j70diB4{mjI)1Rhm{Ai_|C?- z0eP{g)4jW|WGiSe=W~d~#u;|G>+$5WcY^;e`I1MRpDEP;PPaGh=h5^66|09EJJSf- zf8A*YF2~U}>Pd)daEwO)0Fo44s`+w(@F57lVoj?6x`b&}K-Y5IWjb^@ zki=*M600IWVhgqGVnMg&BcEfj`Ky{nb2EkSF(8S%184;6{Uy*+*84l4aZGy!2%n;$ z`*olO4*hSSE15>kVm;IT0z_Vf8EPP^2Yt9oW{(2;Je91{K$Ez`fv7o3=3Qwd?q#4! z-0?t*S;~Bkd_a=k8-SK^C^b1kTMHzmwF3y_(xCqw=o;2RGk`=d?F`$$*XgKB=5v{bQ@x1DB6*>nb8k`rm_^;n^y9G z_NJ9QcosCjA#Cg@P|gvNhJAx~(L zR}0k4QmzA{=TEYtoomI?Mj)}2=62rBp0ZCl)f9~WM zPXkGN@FLJsro9d%Qpgi}7HG+eJfTI(`#>UP0FqtKq2~Zej0=D&m^KnfVvGWk7!!eJ zbEp?cTHpd8X@M(%IuV+od_YhGy~}};8HIrGA6Iwk&|XdZJdl+17NE5(rC;;y(|peZ ziKQ4%YBe9D1$rVJt&Ju%m$IasuT?W*}F{S}YdJBQ*+i$We1(Nj629osN2qf}o zpIni*9!OI3pbq_-ru_?$q>}c;l~lg0`CbJQDdev#Qph*iuo*~b=L1b)t40Ee%~t}6 z&69u%I5ZdN8b$>`VzUoO0*Q{RfI3;;bwH8_ejt&&0%#1!4FZYeFpx;T1?aOJ z_p?AEJ@R64?{zKmP@TZ&k z`hkS+w?M*2-ohws@LiQI{+1bP7SP=s<2s-yqb49Jts8)PnRXM-LCmw0Fv7Dd!QSb@2IAI1eDBDhU10sON=fB`XZxjpoxs81APG~L(K$| zTw4q@i9?s`(3L=vS9bwrap>oC=z~C#L*D_)=FlJO&^zO?&n4u`(3LyrP&1T90I zcaB;5BY?cjM|;jn>1P5->E{AH$e~k!?q@U|=mAEBK=&~!0s1_na-h#KY67~QQ5XoB zgj{+IXcJI|dIIQDracMt5Yv7R)X9kUjfJs@LHof3T1I|dqn{f^>+KMyPj6tdo=T=6~;Cu_CgE&)d8N|Cl z(z6tIFf3fhC>`hyMjjx#pTy^y?hf&}rdkU75PC18r9fY1gcBcy|AYR{q|j~r2ur0v zMQ5r-84dVXy2OF~2Se86Ulb#}pUOByslHj?IbuNkq4tRm=3zunTYA!4lxke1J19$W zMYY@F3F2y`gR%}+bjMgc)B;j3S}1luZc1O0E73e=@i6}g;mm`-Nxc7c56B2?yEF5CX&hPExVwAuOt>xa^T-bPa-?T%lTuY zVBgX#Cr{3lm>p4b;B!~&IEIqPt*lM*1#|ux`CMP8~U#)gh z;9I@PNkJ+$$51A#A2=yf;HBuKz%TfigOUpmaT@Wn?8$|PIPLXlqvYhNtQbnZqVF3v z9&bMTXxk_#(^e->UbgCtp?KB9F_bAWJH6)Sd(}ZFPeHzN<5seCO@`-kdJH93jdW77 zy{bHhQlOSPDM-bAP6~Xq`(h}Q)u9+lUd#@ylTlu&xRq=cVprJ-PD(ykmC=sb#a|Tm*_o zQyT2PQOQKfA9H|LJq4vo<1U{iDW?38nWhuH2R(ZWj6dpGso`$%+U!ff{?F01C!(qyK53#Jh zaqT@B?w7deY#pWMSF^;14wfAD6=c?QjmNH%L`2Kw5%)^R=j#V{L%Yuy$*h3nYOb_&<1Dovr((7q{h zkj!K(NojFq z(fp$M4K)>WX3njg+fY2G1bgCMTQRdDhSmRM})MA{spE8yE_S5+c@ehm$@xo2Tk z%mK~Kt>H+AzsV6vT&09mV)zHz3pc^$yp~N;1;{bpwx2Hr!!-D}!XZy*n88#PlwI(| z4_U#}t^XY&q!|k+8W_^l9%=?}6UyT;yA|(N(m*4_;S4 z50B=#a%tP#Q=?D!=5C$YTjZj-a~Bq^e+l7xr#%~bHM-k-;Dc~xdi|p4PGiO~&0bAe z;C;Jb{HhYnRXZLnc1Lp`#SR{mWbP5Re2T86`DiCLG5P`W>9?iR#)o!d`ctu6^2nTX zm$F39RZc=5*i{vR4ucFuiBWob)?lr<`^o zN$M$bgVfODzLzEg@1KVfPw91MR?~E2bAA-^FERjAzSVX8^LRoaX-4`m>rN_=>5n$3 zp|@;6JvhrK%duq`w78>XsA{xjSV~WI%Hgx4v!E~qHl_5W-V>d5^6Eo#eXr{$!)fGD z_I(gU{S$N*LF>|}N2ANp0!S#0NC+y`=o*cJKs5T9p=hQLwG|n>)|%*;i?&2)A&qtd ziM+iUAsUZE(%&RwMbc4pVLPq?h6?@vIEI zJ`>;n;CQ9I{YK{y@7~mcla)2QA1KBjetYYG5=`#EAzxHx#8$5Ir4#3CLl;e!T6c&H2u0mWwGp(oW+O`&$S zA-=~GSO&-MkhK^Gam4m^szX7n{()YY+3_N#3UQQo&=NA1uI8mcOvdH@HaOTf2F-_j zb}q)V@^W(uj3+ssiF{;ZvBbPQk0*PIHy?j+$VwN>u+qgBa}|G4pj0M$#@8Ze9LEWs z@m(=|g$Y)=xE6v=XQc}oHHbYr6RdP`0Pn6e3(tNeTIr$;cjgQ<4PBQA=R2@9QQu-S z=x?Ke>gD${`NEhe9aI zyL2q3Raf|gmzc)IbC<2aq6{62?RDT&c0wlMJLL>~otlB&<|FM?mw}g|%X>q65bp14 zMkC%3uzUl^YDQ6`KM?l8?Z3tMe~LR7IIF69kMCio;o;Z}aa1hQtqz7fhdJ{Eq`_eb zR1_ISR1}Ug1B?y~%{fD)s8a(9ju>X93uM7h5k(IZPm6)X2t(bt)YgbJ( z?)U%y@4e1Gdq%_Vy|q6x=lu3>{nvjz_S$Q&z4lqZot{P(8NoNF(%$hVNzm4MQL2Nr z^r@!yv^Qkx)Ty*Nc`fzg_Ez3uPr=YO@>6ot13tjrRB&B_#@kvj77IYDqCK5&8|Pz zZ$DpN$*y~S^E-89dWt#}VE*KyCwd|y%PO0-mU}1pl9q6`Jt1F8ifx}d7`ei-NN?IF zOkRI2nonw>;!nBt=fZf!I-7}RwXRJ0i$y?**Nr21v3w~dr5b`m9UkM+2e5@@%k}MN zlgUCc)iTTX0k|Ih&-#`Z$d9a`JURnFX{dIzRD4NS>d)0X`y-R{J?cI#TVXaM%aZen zCHctenYa_W3ECUa-ExYnkDPN-hmk-1aU}^$;yM2kZ^)3NjylRW#W0b@2+l=6#rx({ z`YL!DT$;SoDm8shC5iV5iOWB+Jt?QnUGM_&v?c{eQf3ZlR=^_6{^=qCVxona^f-tX)1^mn?7BPBOGf>yHHN0))FItu#Zq z1R>FqTIOnP6J|r#d=v2#P*g_lD|B;-PdTz+c zaf)-GeVl0fkO8_p-9}cnX3v4Fsk9}IU+#GzrtX{zY=h&Qrp{G>DR8WAxZdrz%NWq121aHlwJl>#yT8MJzhc{Uw*a?*}DVCSO~-|I*PMyTpbOqlz~dC2hIj zX^}%UgT?2QUtj%F_uoq{@gI^%V}8x-kJgu(g$-fQNu7VRwxYC~q0lrcWGQq0t}6?Y zQ~ZuWQ!YbNg&D9-<1GRj9VQ@Sk%AxynT7 z?(KEm_JghH`*_1yo1$%f?TcuaI(5fn*1Yc3rGr?(cMBCmJ(e8!IiPu;cY&>@3oCJy z9yC^PGna(-lVq09Tw2vw8SF%ilq7o2UEs~rEQbdmbg7d_!CW7+Wmodf-bu{RWg6dG zws|Lcsc+dR-n=b1wQXt<4GhixIol!<8$pU%UotgDW1?8Jxc6F9XKJZjMTIkIy5{_; zr*_f*JkMg3=OpM({m|@3Ff^l;-5iR@H8^*+88N?DIv%6i-GHww~w*Rs<1$F%D! zhfX@Q^H>BZiZ6dec2CQjG%v67knT4I6kmRi5Yq-snlYewjZ_c~)_;!;Hm9}v+Fi`q zXf4bNX02=989k5fCWSs-&%DMUpl|Q918thI^j`PUl>|*Qn8W@5ZjX9B(&LX9*kGoy z2WvwGy#C%AKbJ~6f)8oq%V}wDF4>B0r$>0w7lo%sc*1{bZ)tv1S;1$o`{7b~jxMis zFXOv-?U{L8tb;vShC3+d(3I$&9)fr6hV1YY9Zibi2heR{74a-{q+Z}Z(uIdTjJ=?E z!%SZ*Wb)SHHS&Ybu;~|Q?znoZ!#l*)zdOGdSe{rxFIDbTDCB5FhBtvy4Wdb!^RPUF zoN|~QWIG?MPUR}eMS1n_tggTD0#`Qds*i#@6CbZhl$VsFq zHXazowR%MUuHwxJlOD0_jAbdfH2+pc1IGlT0qZ~XxT)W;4Kg6;?UOgjmkc^8rT=Bn z(RW0kL&oCGkM}bO`B`^cX-P@ zmr8UyBFedg6DFWX(hl=^=X7sRL{6~N9xEuNx$J*HeDv(tc!1aA&Wt>9(}XRN?Sn*! zX`o6H@HDNU)UrN#YiF%m#nfsn^j*5M@ebAl;-H(u#d+U0Xwq9np9t}+-9)pYS z5Aq0Blb)CLYwc^r>*O6Zjdp()47rQ1o(!i=IO}8wU4yrn{9byuxp+XF$$iMy%o%yv zj>g>EEvDvUZq|pD$ErWehHb0V4wE#9-UsQ4yH=N`z05&;b=+ONRv4GR8`)v3T+;Q{ zgw7!~3rdF;uaSlI+KxEkO2YfU0~_BJuQ@3i`2bsC@f!IRSl3&}hdJn>+oE${+sHSP zDkb#q!2{)&yZ>HTe1$A?*+61*kJH@CSkBXNUwM4omub;4-v?>y zE6)zbdj~V#TRGdtdYOhUyJad~b1{y!g7t{!DXsgO+B+S9L~p%hF?%etQMf|%9veD+ zNRE7-_N7^i$VEj-Ymc1on&gK1!Li~^>{GmBwRne5-nMc?v~?w;>hbCv4dIyh;X3yaQxgxp6 zE_VxyzqAD*8jaY!y=@zFC-1g}Llzla{PP1ArVmDhmxdC4;*qeU9Ask9c^m2r(2LEK zCTfnz9MiKydCZ1K%$7b-zdw@^jd0 z_)q9U8)@E!-l2ScK#`nXlNBAq=SKb$y13lzc=Q#-Jpp9gOpwJr6(kmgy7b1poXx&@ zk!L9u<5M7>4Pz(ykhBYRkZ7T=uy6j}1j(I5!W+uDHdO77cIX6$#ruz$09z7u4rZ30flD3HaFUh+~6 z6(ueUt#P5pgD%rh>1r)h79v_)`PodDhOTm<*MP2pOL*6VKBb|eiuGwlw}Z^fS3y>% z_kg-J^ghrUMKUxpyGKA)$b-ALSIy?DUi5-t$fv(Wd7eVV3{odLA+1b4g zTCbrZq;sXB0bC+2-Ge|q%E=-cSp-O{bD@(!mRcRi$~(hxCxfhp8bKp8?tGB7u=7Bc zMw7F<5F{NwjZGl)vf0@^0yPEN|2>- z3Fv5zD>6Hl#yU_?8_w=?pkvhTi!SsJAWLH($kKS#aeoC_8nXJRRO7x6WN91(vNRGP zvl|N zOL#XqyW2ox)b6X!Zj-ay?Cc%_ja9p?&h9TDE76-ED-pjz3%Ej%<@8|CIF0)Okd^YTT|jf5t=+d&p%6X;vY-S0xTfMkVAq4%h>dlF>nJ`J*Tf8j!(2i0hd z-+(OLKY%RVeISeRCdjzLSF#YY3T1<=s<4BEZu`acC{Y{vUJN`Xf?>L_VPnF3!UXcPXXE0{&W|5u?rQM zoi0uHN*5}UI@6SsTSCjhRu}qn&`=G14rJ}+CC~}V?FCs3k>0Uu{2L%U3V#RL_#pov z&-*Sh65e2tEM-o3Q$TWqhJ*%anEIRT&|J_LH1s@By@oDxp;v>ZD|fBqZUEh^F@6AQ z(9lOgGRcNCAIMtvGa$>=PLSpKk05J9BFAI7e;YJIy$mP{^EVJ=X^aPbOhZM4$Bx1z zkfkBgJ610$!?##rI(M673~rnVYnsjUH-zpI?xb)Z>l zccZhr)rEcqWcm9h$l{7@kLC1XkR9orAh}s8^xn_cClw6?{Q#8k#(=DbDnJ)$=p@J0 zgRCZJIqp=Dr6IyR7i$a==9#Q01+o$?1Fcpr1G*iQ@Gb*AqG$u?`-()E=V3*6gC0_} z9ds|K(EAn0%Jy53rMnk&vWAKXkEJHkJF}G&>77#)4Fp-}!61t(B0Q&R=y1>+MMpTh zV?aNKOL)hDEXH`yX=;}Q%~ezjGS4$WPic(VpdTqZAM~W!r9q8~R)L;Sv>x=h+T94U zy1x~4x`uukWHtVE7kV$q^71{<8EW@1$ZGtDAj`|+&hEz`OYLW%c^czcXZIVBikricsU{foL+IZ-X8LCA>#Lk16*fkey{e2U*Eq0MR)R<3B-`?$IS78V@>OLu)}+ z-l?D_l5AoJ1)YF4|mKpWL=3CO&(ffi}#$3ZDYD?#S38`PrQ)gX&; zEoiZFH#j>H7_xNl09m?sftIM zS*~P>=LO1*2U)I?pbM3&aduNdmaBS@r7;uKrgpNJ)N*wWXqj@0LFVs5&~oKgfGpjW zAoF)I$ozGI+STrIkomh7v_iRCK<4ib(8ra#3uON80hz!1K<4jzpboYBKFIt%3F2ph zw2hyG%-?gMjB+o4%-`=o=5G(EQ$t??nV0<_i(7!vN(~(hl3zX2uYt^qEY{@@?r^>= zS4V(WDOUp_<8XF&Yn<@0={LOozu60%-`K0Yjq;VWO28G&eRw?K<4==5P$gl z8DD1iENH%RyFljow;=P}3*wI$f8xt>`YPxw<^BpXy8&Fxt+#kT$UF}NouhWcL6(Cf zK<2O1*^LG*P`e2r%Rwc`JU2MI(?IuOm+%&Vc4&-6php!ogSIPL3i_dJLqXe{{cE2 zROtNz^i$>j1iDGl8=wzr=-V!I0B%2|oCq{ojA0-Q@G=3k1;lI_XtN?d^gd6%2gnDT zjNWC-voE=I%h?KZ_QZ4U7T=e#y=-}2p1PEpiEa->cfjF(xNz#~Sh(a|ws2vV^!>7h z`*M!SmhTm6k>pI1EiA`++jZe3K|u?=BI?D?QTYzzuah0NaQ`~&r8Vd4QRI5bzPMmv zmsGU20r`ei&tKt_+kG~9zT$Z=@vi~Fr!1zGqsAgB4d01>iE1~(HuT+P_&58FDP2U=NA=q@hR=cWVLQlbSs}S<{YT^uCiycTDK{Zws^au z7x}zH(aU_^rAUf!w<4*AXC)?R~)_&EHd=>;yZ4^tdAZ(WTFnfb?m@({0Q_I>^vghY8 zC$Kj*hmj0VcT8XTto{~9*;s%`L7odM;4 zF_so;OkWu;S%f9q1B>QL@z_j0%XZ|9Ky*R{wQ6(@B+At4s4T)vMEZ#s5eA7ZIc`y= zTw7a|Not#pFv)Vg+C`b9_O}rRVXnQoo)KS>HXpI6tn!MepD0rum(QxI@}}h4@QTyA zTn5pt1-T5OTZ>{$MNAs2yrwcHja6P#6_ds)udVdt9E#+y7BR6LCW-9TH*y(dLN>)1 z>L-^$ylZcasffvECCe*yp=37oB=T7^X)RHvIwp;kEU)!MGCyL2B#Asrh%ysnVp&O! z>Ekh*8t>^`MviGNQ(fu39Aj!dc`gu1i(?@tX_Tq(5;3OI^J7enC%@Cm#;Pcr=uL?+ z<=*rdQxOy9swk`U?j7YS_m~u~q{Ue?^ySK!cY89Y}+SGU=^B-ZVYdn$rk1|Nlu^VA( z%DoXWCh670mSKNcoe(UNj)8Wm$|ysAkGeVPv+Ojx%{q(mNLj>FQ;JeWC8JhGjh4;(QSZ$&b0wjm$ zTk$IQQMub5cIo@Mw-L{>G2jg5EkZ_~_;!=e?71S40gYz}w9yqLrM8D{S{;tDFSRvT$yXf>Bb(MN78ZU(>Mn9$}i zm=&5<$n1i7nkhWVA(hJ}ze2Drv>8Z%e^As$er=GoS-3dOn$)nlhq0=1Y{XiA8u)Zk z)X$KkUAK5b#c+_^!lh{jrj$tct>LtZS9qf^7+D8SH;j2WwJ zGpTx6WO_R5lTk=h!q&-#p|+4Z-5_h9WnFY2A!gEVPDD=R#^PdkB1aZe8dHffO~jh~*mKjL!?A5?%_{R*K124DPEqm`A106RUKQ~qrqzh0 zZE}N=mKZcBlc8fteM)6Mvg&><9m`smr#ixR*D&2RAJ$n1&3IZ{dy};|anna3@Ezst z8Wy)?I-Ta7w{TWH?jzQkXjo^n>Nyi5F`C=8eJ*KPW^#OycwsY)O7}VOy}8K!iIPdA z;Gx8&<~}QiX}NKABFS~MBZ(qsq?q=n_h>CWS8vi7SZf zSA-Hk{y)+Hswk_e@pTgoARa!T0rVu7r(o`;Uk#uFh6*{`J7@r9^^wh5wR6r-r=xM- zbQj1h+trV@&s}t?+hXa~iCs)L@KO9-$dy8V+#y>X|9(HZfn0^WO_XyB|FVf|$sbkm zFV_u>9JBwWWDhzYCpR?uthRS@WuOhZ=)Ng+fuFwMv{L%_0Eo9Rx{e!cIHYC6tG4!??ljyGi7d)ZtX zoDcn}gbWFFe(1tg1c-zK5snLfqkm&jqH zvPEicMeYJkoUH6apwHsZZb!(2Om>RC2r4EW?Mu+ANNK&vc|U*td}*NRDHPgH_^JNI z6WU~#tJ>5{*h$Hb3;-nLqyB1t!czYd{QG`1l2031PFEwTggK*}NYX;|RX*`4wr)<# zM!O9C$ktUm7uhA&=uk0Q)r6)8%1a2rIK7or=c;{eB99VeM>1`m-eY#&Js&HYTHBYW z+Q$2hEvhJj$i;F!g5(NSHcHY@{B|Tkf(yUYinaXZDL`AwAC=BDw|8calS&BkZgniV z@0<6ak)U9aEVVV-PzqqKYghx7P zA>(}+jA;!~FSs7tUp&13#zzT91yCppjf&<>tI};8y@?&(K*_}&V%nUZpnAOu5(&na zL%dJzm5a!2Ql0wlcIkf`dv0QtAy3wVb*;N4bg6vAP)~kjkzMjNU9ZA|p5#6jgp|}i z%yLB*Q(k=ppFIT+vDh&YmEyRPWsFlMWQI){mnmi`S@5d%-ls^Wc=PnqL%O$Y?S7-8 z_=GFTGB_*6!;Z@qL_n$t@eNJh|Y|b?bx`eUDdq$kKsnLU&enze{lVN4V~aPx!vX7mKe2;n+B56NTL3a(BjHNuS1l(n@@>f zsMAMs*(=l^G7M7mb3VDlhI@`ri(5!3W$;tzeE?)XNH`2+p|VUxF5HD)l|!;%Wtegw zb9OReB@ZhZ5jyU2(4orpIPP}PVak2gaq@6!xN`S8ZZqg`Nt6i%LujG>9}8m4PH=qTk5 za-2MvKU%p%9QQ%cG0Gk3I9X6rs+>%0nLk-ZWA!YLzwCI-2HA0wrI>OpNqFs`az(2_ zqt#0nXpEvYps|Y9fyODi3N%U)AD)bNr|~_&J5mmpE;Qi5d(*%0p?PFPFLN&WdHs#) z?SZl6P;CTgo0E<|%gB+UC;=0FxGddRexBR~$Tt1Kw{&_*A1)`WbQ&pqB+bKRm`eRw zxWIy<71WVR-DgCB{_fL*b}RjZVo%7~aTHM=7FAQXkz$nM!?78)d3J zSJ@TU z%cQz7{Z9kVz$V-EEg+V}Fh4(* +#include +#include +#include "GERAALT.H" + +#define DADO_OWN +#include "DADO.h" +#undef DADO_OWN +#define RAN_MAX 0x7fff + +/*************************************************************************** +* +* Função: DAD & gerar o numero de casas que devem ser puladas com 1 dado +* ****/ + + +/* Funcao do Modulo */ +int dadorand(void); + + +/* fim funcao do modulo */ + +DAD_tpCondRet DAD_NumPular(int *NumeroCasas) +{ + unsigned int i = 1; + int DadoInicio = 1; + int DadoFim = 6; + + //ALT_Inicializar( i ); + *NumeroCasas = dadorand(); + + return DAD_CondRetOK; +}/*Fim da função DAD_NumPular */ + +/* Função usada pelo módulo */ +int dadorand(void) +{ + int dado; + srand( 3141592653 |(unsigned)time(NULL)); + + return rand()%6+1; +} +/*********** Fim do módulo de implementação: Módulo Dado **************/ + + + + + + + diff --git a/Dado/Source Dado/GENERICO.H b/Dado/Source Dado/GENERICO.H new file mode 100644 index 0000000..c9d2692 --- /dev/null +++ b/Dado/Source Dado/GENERICO.H @@ -0,0 +1,588 @@ +#if ! defined( GENERICO_ ) +#define GENERICO_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTG Controlador de teste genérico +* +* Arquivo gerado: GENERICO.h +* Letras identificadoras: TST +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* O módulo de teste genérico contém um conjunto de funções de +* coordenação, apoio e controle da execução de testes de módulos +* quaisquer. +* +* Embora na prática a função de teste específica seja uma extensão da +* função de teste genérica, a função de teste específica encontra-se em +* outro módulo. Desta forma as alterações necessárias para cada +* módulo a testar concentram-se exclusivamente naquele módulo. +* +* $EIU Interface com o usuário pessoa +* Os seguintes comandos genéricos estão definidos: +* +* linha em branco - faz nada +* +* // - comentário, é impresso no LOG +* +* == - título de caso de teste, o título é impresso no LOG +* +* =recuperar +* - Caso o comando imediatamente anterior ao comando +* =recuperar retorne TST_CondRetOK, obviemanete o comando +* executou corretamente, portanto o comando =recuperar +* reportará uma falha no script de teste, uma vez que não +* foi encontrada a falha esperada ao executar o comando. +* - Caso o comando antecessor retorne TST_CondRetErro, +* ou TST_CondRetParm (erro de parâmetros do comando) +* a falha reportada será desconsiderada, uma vez que +* era esperada. O comando =recuperar destina-se a +* apoiar o teste da corretude dos validadores de +* parâmetros dos comandos e das funções por eles +* ativadas. +* - caso o comando antecessor retorne outras condições, o +* comando =recuperar será tratado como falha. +* +* =bkpt - permite interagir com o depurador utilizado para +* desenvolver os módulos sob teste. O comando =bkpt +* executa um código "dummy" no qual pode ser inserido +* um "breakpoint" do depurador. Desta forma o teste pode +* prosseguir sem interrupção até o comando =bkpt. +* Para isto +* - apague ou desative todos os breakpoints do depurador +* - insira o comando =bkpt no script pouco antes do ponto +* de interrupção desejado +* - usando o depurador, estabeleça um breakpoint na linha de +* código: "Dummy = 0 ;" contida no módulo de teste +* genérico. Esta linha pode ser encontrada +* procurando por "BKPT_CMD" +* - dê partida no programa e espere até chegar ao breakpoint +* associado ao comando "dummy". Agora reative ou instale +* os breakpoints requeridos pela a sessão de depuração. +* e continue depurando +* +* =cancelar +* - termina a interpretação dos comandos de teste. +* Sempre sinaliza falha. +* +* =AceitaFalhasAcumuladas numFalhas +* - caso o contador de falhas registre numFalhas, ele será +* tornado zero. Este comando é similar a =recuperar. +* Difere deste por ser executado desde que o comando +* anterior não tenha reportado erro, tal como acontece +* com todos os comandos, exceto =recuperar. +* O comando permite recuperar falhas sinalizadas por +* módulos de apoio, tais como, leitor de parâmetros, +* contador de passagens e controle de espaço dinâmico. +* Caso o contador de número de falhas contenha um valor +* diferente de numFalhas, será reportado um erro e +* o contador é incrementado de 1. +* +* Os demais comandos são passados para as funções de teste específico. +* Primeiro para as do arcabouço, depois para a específica do módulo +* a testar. A última função de teste específico deve retornar a condição +* TST_CondRetNaoConhec caso não consiga interpretar a diretiva. +* +* $EIM Interface com outros módulos +* A primeira função do arcabouço ("framework") a ser chamada deve a +* sempre ser TST_InicializarTeste. Caso não o seja, ocorrerão erros +* de execução (assert). +* +* Após abra o arquivo de script executando a função +* TST_AbrirArquivoScript. Se for desejado gerar um log abra +* o arquivo corresponente com a função TST_AbrirArquivoLog. +* +* Depois de abrir os arquivos, execute os testes chamando a função +* TST_RealizarTeste. A função de teste genérico lerá todo o arquivo +* de script, retornando após concluir o teste. +* +* Após, termine o teste através da função TST_TerminarTeste. +* Esta função exibe as estatísticas do teste e, caso solicitado, +* acumula essas estatísticas em um arquivo acumulador (ver +* parâmetro /a do programa principal. +* +* As funções "TST_ObterXXX" podem ser utilizadas antes de fechar o +* módulo de teste para exibir o resumo do teste no módulo cliente do +* módulo de controle genérico. +* +* O programa cliente do módulo controle de teste genérico pode +* efetuar as operações acima repetidas vezes, permitindo, assim o +* teste envolvendo diversos arquivos scripts de teste. A saída +* de cada teste deve ser dirigida para um log específico, ou para +* stdout, uma vez que, ao abrir um arquivo log, o seu conteúdo será +* sempre destruído. +* +* O módulo de teste genérico também implementa diversas funções +* de comparação "TST_CompararXXX" use-as no módulo de controle de +* teste específico. Desta forma será assegurado o tratamento uniforme +* de todas as falhas possivelmente encontradas. +* +* O módulo disponibiliza ainda a função TST_ExibirPrefixo +* que gera uma linha de saída obedecendo aos padrões de interface +* estabelecidos. Sendo desejado pode-se adicionar textos à linha +* usando a funcao fprintf( TST_ObterArqLog( ) , ... ). Um exemplo da +* utilidade disso é quando se deseja imprimir informação complementar +* ao interpretar uma determinada diretiva. A função TST_ObterArqLog( ) +* retorna a referência ao arquivo log em uso no momento. +* +* Finalmente, o módulo disponibiliza a função TST_NotificarFalha +* que incrementa o contador de falhas além de emitir uma mensagem +* de erro. +* +***************************************************************************/ + +#if defined( GENERICO_OWN ) + #define GENERICO_EXT +#else + #define GENERICO_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#include "TST_Espc.h" + + +/*********************************************************************** +* +* $FC Função: TSTG &Controlar uma sessão de teste +* +* $ED Descrição da função +* Esta função é o ponto de entrada para a realização do teste. +* Permite que se adicione o arcabouço de teste a um sistema qualquer. +* +* $EP Parâmetros +* $P NomeConstrutoParm +* $P NomeArqScriptParm - deve ser não nulo +* $P NomeArqLogParm - se for nulo, gera a saída na console +* $P NomeArqAcumParm - se não for nulo, acumula as estatísticas no +* arquivo denominado +* +* $FV Valor retornado +* 0 - se o teste ocorreu OK +* 4 - se foram observados erros de dados ou falhas nos testes +* +***********************************************************************/ + + int TST_ControlarSessaoTeste( char * NomeConstrutoParm , + char * NomeArqScriptParm , + char * NomeArqLogParm , + char * NomeArqAcumParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar booleano +* +* $ED Descrição da função +* Compara valor booleano esperado com valor booleano obtido, +* reportamdo uma falha caso não sejam iguais. +* Note que "!= 0" corresponde a TRUE e "== 0" corresponde a FALSE +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for consistente com o obtido +* TST_CondRetOK se os valores forem consistentes +* +***********************************************************************/ + + TST_tpCondRet TST_CompararBool( int ValorEsperado , + int ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar caractere +* +* $ED Descrição da função +* Compara um caractere esperado com um caractere obtido, emitindo mensagem de +* erro caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararChar( char ValorEsperado , + char ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar inteiro +* +* $ED Descrição da função +* Compara valor inteiro long esperado com valor inteiro obtido, +* reportamdo uma falha caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararInt( long ValorEsperado , + long ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar flutuante +* +* $ED Descrição da função +* Compara valor flutuante esperado com valor flutuante obtido, +* reportando uma falha caso +* 1 - Tolerancia > esperado / obtido ou +* 1 + Tolerancia < esperado / obtido +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* Tolerância - indica os limites da relação entre esperado e obtido. +* Deve ser um valor positivo, menor do que 1. +* Use um valor do tipo 10 ** -n, no qual n é o +* número de dígitos significativos desejado. +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor obtido não estiver dentro do domínio da +* tolerância em torno do valor esperado +* TST_CondRetOK se os valores estiverem dentro da tolerância +* +***********************************************************************/ + + TST_tpCondRet TST_CompararFloat( double ValorEsperado , + double ValorObtido , + double Tolerancia , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar string +* +* $ED Descrição da função +* Compara string esperado com string obtido, reportamdo uma falha +* caso não sejam iguais. Ambos os strings devem obedecer o +* padrão C, terminando em zero. +* +* $EP Parâmetros +* ValorEsperado - é um string fornecido como parâmetro do comando +* de teste. +* ValorObtido - é o string retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararString( char * ValorEsperado , + char * ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar espaço +* +* $ED Descrição da função +* Compara espaços de dados, reportando uma falha caso não sejam iguais. +* Esta função pode ser utilizada para comparar qualquer coisa, +* inclusive valores do tipo "struct" +* O tipo do valor é indefinido e os valores serão exibidos em +* formato hexadecimal, caso não sejam iguais +* +* $EP Parâmetros +* ValorEsperado - ponteiro para o espaço que contém o valor esperado +* ValorObtido - ponteiro para o espaço que contém o valor obtido +* TamEspaco - tamanho do espaço a ser comparado +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , + void * ValorObtido , + int TamEspaco , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro +* +* $ED Descrição da função +* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro nulo +* +* $ED Descrição da função +* Verifica +* - quando ModoEsperado == 0 se o PonteiroObtido é nulo +* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Assertiva controlada +* +* $ED Descrição da função +* Esta função substitui a função assert de C. +* É utilizada no contexto do arcabouço de teste. +* Ela imprime mensagens mais visíveis tanto no log como na +* janela de comando. +* +* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. +* +* $FV Valor retornado +* Termina a execução do programa com código de retorno == 4 +* +***********************************************************************/ + + #define TST_ASSERT( Expressao ) \ + TST_Assert( Expressao , __LINE__ , __FILE__ ) + + void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir prefixo da mensagem +* +* $ED Descrição da função +* Imprime o prefixo de mensages de falha ou de informação. +* Não incrementa o contador de falhas. +* Esta função estabelece o padrão de saída das mensagens geradas +* durante os testes. +* +* $EP Parâmetros +* $P Indicador - informa a natureza da mensagem, +* Utilize preferenciamente as constantes definidas em +* TST_ESPEC.H: +* SINALIZA_ERRO ">>>" +* SINALIZA_RECUPERA "<<<" +* SINALIZA_COMENTARIO "!!!" +* $P pMensagem - é a mensagem prefixo a ser gerada. +* +* $EIU Interface com usuário pessoa +* Podem ser acrescentadas mensagens ao prefixo. A função +* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso +* (stdout ou definido pelo usuário) +* +***********************************************************************/ + + void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Notificar falha +* +* $ED Descrição da função +* Exibe uma mensagem de falha no formato padrão do arcabouço. +* A função não exibe os valores esperado e obtido. +* +* $EP Parâmetros +* $P pMensagem - mensdagem explicativa da falha. +* +* $FV Valor retornado +* TST_CondRetErro sempre +* +***********************************************************************/ + + TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Incrementar contador de falhas +* +* $ED Descrição da função +* Esta função deve ser usada quando, por alguma razão, precisar-se +* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. +* As outras funções (comparação, TST_NotificarFalha, etc.) +* incrementam o contador automaticamente. +* +***********************************************************************/ + + void TST_ContarFalhas( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de casos de teste efetuados +* +* $ED Descrição da função +* Retorna o número de casos de teste lidos. +* Cada caso de teste inicia com o comando "== ". +* +***********************************************************************/ + + int TST_ObterNumCasosTeste( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados +* +* $ED Descrição da função +* Retorna o número de comandos de teste específicos lidos e +* corretamente interpretados. +* Não conta comandos que retornem não OK independentemento do motivo, +* inclusive os comandos saltados após uma falha. +* Também não conta comandos recuperar. +* +***********************************************************************/ + + int TST_ObterNumComandosExecutados( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de falhas encontradas +* +* $ED Descrição da função +* Retorna o número de falhas encontrados. +* O módulo de teste específico sinaliza falhas através de +* uma condição de retorno diferente de TST_CondRetOK. +* Além de comparações em erro, são tratados como falhas: +* - comandos de teste em erro, +* - comandos de teste de um dado caso de teste ignorados (saltados) +* - erros encontrados nos instrumentos +* - erros de sintaxe dos comandos de teste +* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. +* Portanto, é possível que o número de falhas venha a ser maior do +* que o número de casos de teste existente no script. +* +***********************************************************************/ + + int TST_ObterNumFalhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter origem do nome da extensão de arquivo +* +* $ED Descrição da função +* Procura o início do nome da extensão contido no nome do arquivo +* dado por parâmetro +* +* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". +* Isto pode confundir no caso de se desejar a adição de algum nome +* de extensão padrão. +* +* $EP Parâmetros +* $P NomeArqParm - nome de arquivo a ser analisado +* +* $FV Valor retornado +* Ponteiro para o caractere '.' que separa a extensão. +* Será NULL caso o nome do arquivo não contenha extensão. +* +***********************************************************************/ + + char * TST_ObterInicioExtensao( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter ponteiro para arquivo LOG +* +* $ED Descrição da função +* Retorna o ponteiro para o FILE do log em uso no momento. +* Será stdout caso não seja definido explicitamente ao chamar a funcao +* TST_ControlarSessaoTeste +* +* $FV Valor retornado +* Ponteiro válido para um arquivo de texto de saída +* +***********************************************************************/ + + FILE * TST_ObterArqLog( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char +* +* $ED Descrição da função +* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém +* uma coluna em hexadecimal e outra em ASCII +* São exibidos 16 bytes por linha. +* +* $EP Parâmetros +* $P tamEspaco - tamanho em bytes do espaço a exibir +* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir +* +***********************************************************************/ + + void TST_ExibirEspacoHexa( int tamEspaco , + void * Ponteiro ) ; + +#undef GENERICO_EXT + +/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ + +#else +#endif diff --git a/Dado/Source Dado/LERPARM.H b/Dado/Source Dado/LERPARM.H new file mode 100644 index 0000000..f12cf3d --- /dev/null +++ b/Dado/Source Dado/LERPARM.H @@ -0,0 +1,463 @@ +#if ! defined( LerParm_ ) +#define LerParm_ +/*************************************************************************** +* +* $MCD Módulo de definição: LER Ler parâmetros de comandos +* +* Arquivo gerado: LerParm.h +* Letras identificadoras: LER +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Provê funções para a leitura e análise léxica dos comandos de teste. +* Pressupõe-se que cada comando de teste esteja integralmente em +* uma linha. +* Cada comando de teste inicia com o caractere '=' seguido de um string +* que identifica o comando. +* Cada comando pode requerer zero ou mais parâmetros que se encontram na +* mesma linha que o comando. +* Parâmetros podem ser literis ou simbólicos. +* Os parâmetros simbólicos precisam ser declarados antes de serem +* utilizados. +* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. +* +* Se for do interesse do programador, módulos de teste específico +* podem ler e processar por conta própria linhas do script. Isto +* pode ser necessário quando um módulo necessita de um grande +* número de parâmetros ou de dados especiais. +* +* $EIU Interface com o usuário pessoa +* Este módulo interpreta os comandos de teste globalmente disponíveis: +* +* =declararparm +* declara o parâmetro do definido com o valor +* pode ser um de: +* i - inteiro (long) +* f - flutuante (double) +* c - caractere +* s - string +* O valor de literal tem que estar em conformidade com o tipo +* +* =exibirdeclaracao +* exibe a declaração do parâmetro em formato "dump de memória" +* +* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. +* +* Estes comandos sempre estarão disponíveis. Os demais comandos de +* teste estão impementados no módulo TESTLER específico para este módulo. +* +***************************************************************************/ + +#if defined( LerParm_OWN ) + #define LerParm_EXT +#else + #define LerParm_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define LER_DIM_NOME 32 +#define LER_DIM_STRING 500 +#define LER_DIM_BUFFER 250 + + +/*********************************************************************** +* +* $TC Tipo de dados: LER Condições de retorno +* +* +***********************************************************************/ + + typedef enum { + + LER_CondRetOK , + /* Ler retorno OK */ + + LER_CondRetNaoAbriu + /* Ler não abriu arquivo */ + + } LER_tpCondRet ; + +/***** Dados exportados pelo módulo *****/ + + /* Estrutura de dados: *LER Dados globais públicos */ + + LerParm_EXT int LER_TamBuffer ; + /* Tamanho do string contido no buffer de leitura + * + *$ED Descrição + * Contém o número total de caracteres do buffer, excluindo o zero. + * Jamais altere este valor. */ + + LerParm_EXT int LER_InxBuffer ; + /* Cursor do buffer de leitura + * + *$ED Descrição + * O cursor de leitura indexa o primeiro caractere não lido contido + * no buffer. + * O cursor é zerado sempre que uma nova linha for lida. + * O cursor é avançado ao ler um parâmetro, sendo colocado no + * primeiro caractere imediatamente após ao parâmetro lido. + * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ + + LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; + /* Buffer de leitura + * + *$ED Descrição + * Contém a linha corrente do script a ser processada. + * Jamais altere o valor do buffer. */ + + +/*********************************************************************** +* +* $FC Função: LER &Inicializar módulo LerParm +* +* $ED Descrição da função +* Inicializa o módulo. +* Deve ser chamada antes de iniciar a análise de comandos. +* Deve ser chamada uma única vez no início ou após terminar o módulo. +* +***********************************************************************/ + + int LER_InicializarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Terminar módulo LerParm +* +* $ED Descrição da função +* Fecha o arquivo de leitura e sinaliza módulo de leitura não +* inicializado. +* Após esta função somente poderá ser chamada a funçãp +* LER_InicializarLeitura +* +***********************************************************************/ + + void LER_TerminarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter nome do arquivo script +* +* $FV Valor retornado +* Retorna o ponteiro para o nome do arquivo script sendo processado. +* Deve-se tomar cuidado para não alterar este nome. +* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. +* +***********************************************************************/ + + char * LER_ObterNomeArqScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter número de linhas lidas até o momento +* +***********************************************************************/ + + int LER_ObterNumLinhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Abrir arquivo script de teste +* +* $ED Descrição da função +* Abre o arquivo que contém o script de teste. +* A extensão default do arquivo de comandos script de teste é +* ".script" e será acrescida ao nome do arquivo caso este não +* contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo contendo o script de teste +* +* $FV Valor retornado +* LER_CondRetOK - caso tenha sido possível abrir o arquivo. +* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. +* Não há discriminação do erro encontrado. +* +***********************************************************************/ + + LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha script eliminando brancos ao final +* +* $ED Descrição da função +* Lê uma linha do arquivo script e elimina os caracteres branco, +* fim de linha, tabulação etc. do final da linha lida. +* +* $FV Valor retornado +* Retorna o tamanho da linha lida. +* Será: +* -1 caso tenha ocorrido fim de arquivo. +* -2 caso tenha ocorrido algum problema de leitura. +* +***********************************************************************/ + + int LER_LerLinhaScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Interpretar comandos de teste +* +* $ED Descrição da função +* Interpreta os comandos de teste disponibilizados pelo módulo +* de leitura. +* +* Ver a descrição do módulo para mais detalhes +* +* $EP Parâmetros +* $P - Comando de teste a ser interpretado +* +* $FV Valor retornado +* TST_CondRetOK - caso tenha interpretado corretamente +* TST_CondRetNaoExecutou - caso o comando de teste a interpretar +* não pertença ao conjunto de LER +* TST_CondRetErro - caso o comando de teste é do conjunto de LER +* e está sintaticamente errado. +* Neste caso é gerada uma mensagem de erro no +* log. +* +***********************************************************************/ + + TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Declarar parâmetro simbólico +* +* $EP Parâmetros +* Interpreta uma linha de comando de teste contendo uma declaração de +* nome simbólico. +* Todas as declarações têm o formato: +* =declararparm +* em que o deve estar consistente com o +* São geradas mensagens de erro no log de teste caso a declaração +* não possa ser realizada. +* +* $FV Valor retornado +* TRUE - se a declaração ocorreu +* FALSE - caso contrário +* +***********************************************************************/ + + int LER_DeclararParametro( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Exibir declaração de símbolo +* +* $ED Descrição da função +* Exibe o Símbolo e o valor associado ao símbolo, sendo que este +* é exibido em hexadecimal. +* +***********************************************************************/ + + void LER_ExibirParametro( char * Simbolo ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha de parâmetros +* +* $ED Descrição da função +* Lê um número variável de parâmetros +* +* $EP Parâmetros +* $P Tipos é um string contendo a identificação dos tipos dos parâmetros +* a serem lidos. +* $P ... Os demais parâmetros são referências (ponteiros) para os +* espaços onde deverão ser armazenados os valores lidos. +* +* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista +* de referência e o string de tipos tenha o mesmo tamanho +* e que os indicadores de tipo sejam consistentes com a referência +* posicionalmente correspondentes. +* +* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já +* declarado. Caso isto seja possível e o tipo esteja correto +* é "lido" o valor contido no parâmetro. +* Caso não seja possível, tenta ler um literal em acordo com o tipo +* dado. +* +* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada +* e tipo inconsistente com o solicitado no correspondente caractere no +* string Tipos. +* +* $FV Valor retornado +* Retorna o número de campos lidos até concluir ou até encontrar +* um erro. +* +***********************************************************************/ + + int LER_LerParametros( char * Tipos , ... ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro caractere +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do caractere lido +* +* $EIU Interface com usuário pessoa +* Um caractere deve vir entre aspas simples. Valem os caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmChar( char * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro inteiro +* +* $EP Parâmetros +* $P Parm é um ponteiro para um int que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do int lido +* +* $EIU Interface com usuário pessoa +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmInt( int * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro flutuante +* +* $EP Parâmetros +* $P Parm é um ponteiro para um double que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do double lido +* +* $EIU Interface com usuário pessoa +* São válidas todas as formas de literal double aceitas pelo scanf. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmDouble( double * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro nome +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o nome lido +* $P tamString é o tamanho do nome que foi lido +* $P dimString é o tamanho máximo que o nome poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do nome lido +* +* $EIU Interface com usuário pessoa +* São válidas as mesmas regras de nomes C. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro string +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o string lido +* $P tamString é o tamanho do string que foi lido +* $P dimString é o tamanho máximo que o string poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do string lido +* +* $EIU Interface com usuário pessoa +* Um string deve vir entre aspas duplas. +* Um string pode conter caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Pular comando de teste +* +* $ED Descrição da função +* Avança o cursor do buffer de leitura por cima de um comando de teste. +* Todos os comandos de teste principiam com o prefixo '=' +* +***********************************************************************/ + + void LER_PularComando( void ) ; + +#undef LerParm_EXT + +/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ + +#else +#endif diff --git a/Dado/Source Dado/TESTDADO.c b/Dado/Source Dado/TESTDADO.c new file mode 100644 index 0000000..f74a38b --- /dev/null +++ b/Dado/Source Dado/TESTDADO.c @@ -0,0 +1,125 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTMAT.C +* Letras identificadoras: TMAT +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criarmatriz - Chama a função MAT_CriarMatriz( linha, coluna, vtMatriz[inxmat]) +* =criarlista - Chama a função MAT_CriarLista( lista ) +* =avancar - Chama a função MAT_Avancar(vtMatriz[inxmat], direcao ) +* e avança a célula corrente da matriz de acordo com a direção dada. + as direções são: norte, nordeste, leste, sudeste, sul, sudoeste, oeste e noroeste +* =inscharantes" - Chama a função MAT_InserirCharAntes( lista ) e insere o char na posição posterior ao corrente +* =inschardepois" - Chama a função MAT_InserirCharDepois( lista ) e insere o char na posição anterior ao corrente +* "=inslista" - chama a função MAT_InserirLista(vtMatriz[inxmat], linha, coluna ) + e insere a lista na posição linhaXcoluna da matriz +* "=excluirelem" - Chama a função MAT_ExcluirElemento( lista ) e exclui o elemento corrente da lista +* "=irinicio" - chama a função MAT_IrInicio( lista ) +* "=irfinal" - chama a função MAT_IrIFinal( lista ) +* "=obtervalorelem" - Chama a função MAT_ObterValor( lista, charRecebido ) + e compara o charRecebido com o valor +* "=avancarelem" - chama a função MAT_AvancarElementoCorrente( lista, numElem ) +* +* "=destruirmatriz" - Chama a função MAT_DestruirMatriz( vtMatriz[inxmat] ) +***************************************************************************/ + +#include +#include +#include + +#include "TST_ESPC.H" + +#include "generico.h" +#include "lerparm.h" +#include "DADO.H" + + +/* Tabela dos nomes dos comandos de teste específicos */ + +#define JOGAR_DADO_CMD "=jogardado" +#define INI_DADO_CMD "=inicializardado" + +/***** Código das funções exportadas pelo módulo *****/ + + +/*********************************************************************** +* +* $FC Função: TMAT Efetuar operações de teste específicas para Matrizes +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Matriz sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = DAD_CondRetOK ; + int CondRetEsperada = DAD_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + + int NumLidos = -1 ; + int i = 0; + int valorDado; + /* Testar MAT Criar Matriz */ + + if ( strcmp( ComandoTeste , JOGAR_DADO_CMD ) == 0 ) + { + + if ( NumLidos != -1 ) + { + return TST_CondRetParm ; + } /* if */ + + while( i < 60) { + CondRetObtido = DAD_NumPular(&valorDado) ; + + printf(" \n dado: %d\n", valorDado); + i++; + } + + return TST_CondRetOK; + + } /* fim ativa: Testar MAT Criar Matriz */ + + return TST_CondRetNaoConhec ; + + } /* Fim função: TMAT Efetuar operações de teste específicas para árvore */ \ No newline at end of file diff --git a/Dado/Source Dado/TST_ESPC.H b/Dado/Source Dado/TST_ESPC.H new file mode 100644 index 0000000..987ff8e --- /dev/null +++ b/Dado/Source Dado/TST_ESPC.H @@ -0,0 +1,320 @@ +#if ! defined( Tst_Espc_ ) +#define Tst_Espc_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTE Interface de teste específico +* +* Arquivo gerado: Tst_Espc.h +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Este módulo consta somente do módulo de definição de todos os módulos +* de teste específicos a serem desenvolvidos, e também da especificação +* do tipo de condições de retorno deste módulo. +* +* Ele estabelece a interface a ser utilizada pelo módulo de teste +* genérico com todos os módulos de teste específico a serem +* desenvolvidos. +* +* Os módulos de teste específico devem sempre incluir este módulo +* de definição e, idealmente, não devem adicionar mais itens +* à interface. +* +* O módulo de teste específico contém a função de teste de um +* determinado módulo ou conjunto de módulos. Mais especificamente, +* contém a função que interpreta os comandos de teste que exercitarão +* as funções do(s) módulo(s) em teste. +* +* Poderá conter também diversas funções auxiliares requeridas para +* realizar os testes, vide "contexto" a seguir. +* +* O contexto é formado por variáveis e estruturas auxiliares necessárias +* para que se possa efetuar todos os comandos de teste. +* Por exemplo pode-se desejar testar várias instâncias de uma +* mesma estrutura. Uma forma de resolver isto é criar um vetor +* global static +* de n elementos em que cada elemento aponta para a cabeça de +* uma determinada instância dessa estrutura. Para realizar um +* teste relativo a uma determinada instância, torna-se necessário +* selecioná-la através de um índice contido no comando de teste. +* Este parâmetro, embora seja um índice, é na realidade o identificador +* da instância da estrutura a ser manipulada (idEstrutura). +* +* Caso o módulo em teste requeira um contexto, este deverá ser +* estabelecido no presente módulo. Para tal devem ser declaradas +* variáveis e estruturas encapsuladas e devem ser incluídos comandos +* de teste capazes de manipular o contexto. +* +* Uma das formas para estabelecer o contexto seria a de incluir +* no mçodulo de teste específico comando semelhantes a: +* +* =iniciaXXX que inicializa o contexto do módulo sob teste para +* vazio. Este comando deve ser utilizado uma única vez +* logo ao inciar a execução do teste. +* =reset restaura o contexto para vazio. Este comando usualmente +* assumirá que o contexto a esvaziar esteja correto. +* O comando deverá liberar os espaços alocados aos +* elementos, anular as referências a ele, inicializar +* valores de vetores de referências, etc. +* O comando tem utilidade especial ao segmentar um teste +* em partes estanques e ao controlar vazamento de +* memória. +* =terminaXXX este comando destrói todo o contexto e não o +* reinicializa. O objetivo é poder verificar vazamento +* de memória. +* +* Evidentemente, outra forma seria a de alterar as funções de +* inicialização e término do módulo de teste genérico o que é pouco +* recomendável pois viola o princípio de um mesmo módulo genérico +* servir para testar todos os construtos. +* +* Para cada função do módulo a ser testado deve existir pelo menos +* um comando de teste. Em alguns casos pode ser interessante criar +* comandos que armazenem, alterem ou consultem variáveis de +* estado do próprio módulo de teste. Ver os comentários sobre +* contexto acima. Ou seja, podem existir comandos de teste que +* têm o propósito de agir sobre o contexto e, não, o de efetuar +* um determinado teste. Alguns desses comandos podem inclusive +* realizar verificações entre um resultado esperado e existente +* no contexto. +* +* Todos os controles de consistência dos parâmetros dos comandos +* de teste devem ser realizados no módulo de teste específico. +* Recomenda-se que seja sempre retornado TST_CondRetParm, +* sinalizando erro de sintaxe do comando de teste ou valores +* não permitidos. Deve ser sempre assumido que os parâmetros +* podem estar em erro. Ou seja, o controle da integridade dos +* comando é mandatória. +* +* Caso seja necessário emitir mensagens especiais, +* deve ser utilizada a função genérica "TST_ExibirPrefixo". +* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, +* (prefixo, ou comparar), utilize a função +* fprintf( TST_ObterArqLog( ) , "..." , ... ) +* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") +* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção +* assegura a consistência do aspecto das mensagens com o restante do +* programa de teste. +* +* Cada comando deve ser completamente interpretado pelo seu +* respectivo fragmento de interpretação. Ou seja, não deverá ser +* retornado para o módulo genérico qualquer dado adicional à +* condição de retorno da função de teste específico. Veja +* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes +* à mensagen já exibida. +* +* A função TST_NotificarFalha sempre registra uma falha, enquanto que +* a função TST_ExibirPrefixo pode ser usada para emitir mensagens +* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo +* seja utilizada para sinalizar uma falha, é necessário chamar +* também a função TST_ContarFalha( ) para que seja notificada a falha. +* Isto não é necessário no caso da função TST_NotificarFalha, pois +* esta sempre conta falhas. +* +* As funções a testar que retornem um valor sempre devem ter +* este valor verificado, mesmo que seja uma condição de retorno. +* Utilize para isto uma das funções " Comparar" do arcabouço. +* Caso uma função retorne dois ou mais valores, incluindo +* a condição de retorno, utilize um código semelhante ao +* descrito a seguir. +* +* Seja +* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... +* a função a ser testada e, v1, v2, ... os dados retornados de +* alguma forma (valor retornado, parâmetro por referência, variável +* global). Assumindo que v1 seja o valor retornado. +* +* v1Obtido = FuncATestar( ... +* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* +* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* ... +* +* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; +* +***************************************************************************/ + +#if defined( Tst_Espc_OWN ) + #define Tst_Espc_EXT +#else + #define Tst_Espc_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define SINALIZA_ERRO ">>>" +#define SINALIZA_RECUPERA "<<<" +#define SINALIZA_COMENTARIO "!!!" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste específico +* +* +* $ED Descrição do tipo +* Este tipo enumera todas as condições de retorno que podem ser +* geradas pela função de teste específica. +* +***********************************************************************/ + + typedef enum { + + TST_CondRetOK , + /* Comando de teste executou corretamente */ + + TST_CondRetErro , + /* Comando de teste encontrou uma ou mais falhas + * + *$ED Descrição + * Esta condição sinaliza que um ou mais resultados da execução + * da função sob teste resultou em um valor diferente do esperado. */ + + TST_CondRetParm , + /* Comando de teste está com a sintaxe em erro + * + *$ED Descrição + * A presente condição de retorno deve ser retornada caso a sintaxe + * ou os valores do comando de teste estiverem em erro. + * + * Todos os fragmentos de interpretação devem: + * - realizar a análise dos parâmetros do comando + * - verificar se todos os parâmetros foram lidos + * - verificar se os valores dos parâmetros estão corretos + * por exemplo: verificar se os índices de acesso a elementos + * estão dentro dos limites dos correspondentes vetores. + * - efetuar a função a testar + * - verificar se os resultados retornados por esta função estão + * corretos */ + + TST_CondRetNaoExecutou , + /* Comando de teste não se destina ao presente interpretador + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de comandos de teste relativas a módulos do próprio arcabouço, + * caso não tenha sido encontrado um comando válido. Isso permite + * estabelecer um "daisy chain" de interpretadores em que cada qual + * tenha finalidade específica no contexto do arcabouço. */ + + TST_CondRetNaoConhec , + /* Comando de teste não é conhecido + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de casos de teste específico visando determinado módulo em teste, + * sempre que esse interpretador não consiga identificar o comando. + * + * Cabe salientar a diferença entre TST_CondRetNaoExecutou e + * TST_CondRetNaoConhec. A primeira corresponde à não interpretação + * de um comando possivelmente válido em interpretadores subsequentes. + * A segunda corresponde a comandos não válidos considerando todos + * os interpretadores. */ + + TST_CondRetNaoImplementado , + /* Comando de teste não implementado + * + *$ED Descrição + * Esta condição deve ser retornada ao interpretar um comando de teste + * específico ainda não implementado. + * + * Recomenda-se que o desenvolvimento dos módulos sob teste e do + * correpondente módulo de teste específico se dê incrementalmente. + * Consequentemente diversos comandos não estarão implementados + * no início do desenvolvimento. Esta incompleteza poderá ser + * sinalizada com esta condição de retorno. */ + + TST_CondRetMemoria + /* Faltou memória para executar o comando + * + *$ED Descrição + * Esta condição deve ser retornada caso tenha ocorrido algum erro + * quando o módulo de teste específico tentar alocar memória ou + * outro recurso. */ + + } TST_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: TSTE &Efetuar comandos de teste específicos +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* sendo testado. +* +* Cada módulo de teste específico deve desenvolver esta função. +* Poderá conter diversas outras conforme necessário. No entanto +* estas devem todas ser funções encapsuladas no módulo (static) +* +* Freqüentemente é necessário desenvolver um contexto para o teste. +* Por exemplo, pode ser necessário tratar n elementos disponibilizados +* pelo módulo sob teste. Neste caso deveria ser criado um vetor +* global com referências para estas elemento. Ao iniciar os teste +* este vetor deverá ser inicializado. Ao terminar, os elementos do +* vetor referenciando algum elemento devem ser destruídos. +* +* Todos os controles de consistência devem ser realizados no +* módulo de teste específico. +* +* A função TST_EfetuarComando( ) deve retornar as condições de retorno +* identificadas no tipo TST_tpCondRet. +* +* As funções do módulo sob teste que retornam algum valor sempre +* devem sempre ter este valor verificado, mesmo sendo uma condição de +* retorno. Para fazer a vereficação da corretude, recomenda-se +* utilizar as funções TST_CompararXXX definidas no módulo genérico. +* Assegura-se assim a uniformidade da saída gerada durante o teste. +* +* Para realizar a análise de um comando de teste recomenda-se +* utilizar as funções definidas no módulo LerParm. Elas, além +* de realizarem a análise léxica, permitem o uso intercambiável +* de parâmetros simbólicos ou literais. Também realizam a +* verificação da corretude dos tipos dos parâmetros, contribuindo +* assim para a redução de erros de redação de scripts de teste +* que possam passar despercebidos. +* +* As funções a serem testadas que requeiram algum argumento, devem +* ser chamadas com valores (parâmetros) extraídos do comando de +* teste sendo executado. Use sempre as funções do módulo LerParm +* para realizar a análise sintática. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* TST_CondRetXXX - veja a descriÓcão dos possíveis valores +* retornados na especificação do correspondente +* enum +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; + +#undef Tst_Espc_EXT + +/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ + +#else +#endif diff --git a/Dado/TRAB2-2.exe b/Dado/TRAB2-2.exe new file mode 100644 index 0000000000000000000000000000000000000000..adc0474d3d9bc2ed6d4c0bcbbee24dcc6f336395 GIT binary patch literal 76800 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 literal 0 HcmV?d00001 diff --git a/Dado/testedado.bat b/Dado/testedado.bat new file mode 100644 index 0000000..caf2525 --- /dev/null +++ b/Dado/testedado.bat @@ -0,0 +1 @@ +TRAB2-2 /stestedadoscript > logtestedado.txt \ No newline at end of file diff --git a/Dado/testedadoscript.script b/Dado/testedadoscript.script new file mode 100644 index 0000000..aeb6334 --- /dev/null +++ b/Dado/testedadoscript.script @@ -0,0 +1,5 @@ +// SCRIPT DE TESTE PARA O MODULO DADO +// TESTE COMPLETO + +== Jogar o dado +=jogardado \ No newline at end of file diff --git a/GERAALT.C b/GERAALT.C index 8be9749..869519a 100644 --- a/GERAALT.C +++ b/GERAALT.C @@ -60,7 +60,6 @@ double x ; int i ; - do { x = rand( ) ; /* converte para flutuante */ diff --git a/PECA.C b/PECA.C index 009f0e2..696d6a6 100644 --- a/PECA.C +++ b/PECA.C @@ -39,7 +39,7 @@ typedef struct tgPeca{ int *posicao; /*Pontei para a posicao da peca, ainda deve ser alterado pelo tipo correto.*/ - char *cor; + char cor; /*Devemos usar um inteiro para facilitar a manipulacao da peça pela cor? Porem a cor tambem determia qual jogador tem a posse da peca*/ //struct tpp * jogador; @@ -56,14 +56,15 @@ typedef struct tgPeca{ * Função: Pec Criar Peça * ****/ -Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado1, char * CorDaNovaPeca) +Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado, char CorDaNovaPeca) { - struct tgPeca * PecaNova; - PecaNova= (tgPeca*)malloc(sizeof(tgPeca)); - if(PecaNova == NULL) + *PecCriado= (tppPeca)malloc(sizeof(struct tgPeca)); + + if(PecCriado == NULL) return Pec_CondRetFaltouMemoria; - PecaNova->cor = CorDaNovaPeca; - (*PecCriado1) = PecaNova; + + (*PecCriado)->cor = CorDaNovaPeca; + return Pec_CondRetOK; } @@ -72,14 +73,20 @@ Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado1, char * CorDaNovaPeca) * Função: PEC Destruir Peça * ****/ -Pec_tpCondRet Pec_DestruirPeca(tppPeca * Peca) +Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca) { + return Pec_CondRetOK; } + /*************************************************************************** * * Função: PEC Obter Cor * ****/ -Pec_tpCondRet Pec_ObterCor(tppPeca * Peca); +Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor) +{ + *cor = Peca->cor; + return Pec_CondRetOK; +} /*********** Fim do módulo de implementação: Módulo DadoPontos **************/ diff --git a/PECA.h b/PECA.h index bda5afc..a63d488 100644 --- a/PECA.h +++ b/PECA.h @@ -68,7 +68,7 @@ typedef struct tgPeca * tppPeca; * ***********************************************************************/ - Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); + Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado1, char CorDaNovaPeca); /*********************************************************************** * @@ -82,7 +82,7 @@ typedef struct tgPeca * tppPeca; * ***********************************************************************/ - Pec_tpCondRet Pec_DestruirPeca(tppPeca * Peca); + Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); /*********************************************************************** * @@ -95,4 +95,4 @@ typedef struct tgPeca * tppPeca; * Pec_CondRetFaltouMemoria * ***********************************************************************/ - Pec_tpCondRet Pec_ObterCor(tppPeca * Peca); \ No newline at end of file +Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); \ No newline at end of file diff --git a/TESTDADO.c b/TESTDADO.c index a53d8e3..f74a38b 100644 --- a/TESTDADO.c +++ b/TESTDADO.c @@ -64,6 +64,7 @@ /* Tabela dos nomes dos comandos de teste específicos */ #define JOGAR_DADO_CMD "=jogardado" +#define INI_DADO_CMD "=inicializardado" /***** Código das funções exportadas pelo módulo *****/ @@ -96,10 +97,8 @@ char ValorDado = '\0' ; int NumLidos = -1 ; - + int i = 0; int valorDado; - TST_tpCondRet Ret ; - /* Testar MAT Criar Matriz */ if ( strcmp( ComandoTeste , JOGAR_DADO_CMD ) == 0 ) @@ -110,9 +109,12 @@ return TST_CondRetParm ; } /* if */ + while( i < 60) { CondRetObtido = DAD_NumPular(&valorDado) ; - printf("dado: %d\n", valorDado); + printf(" \n dado: %d\n", valorDado); + i++; + } return TST_CondRetOK; diff --git a/TESTPECA.C b/TESTPECA.C new file mode 100644 index 0000000..199f11b --- /dev/null +++ b/TESTPECA.C @@ -0,0 +1,158 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTPECA.C +* Letras identificadoras: TPec +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); +* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); +* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +***************************************************************************/ + +#include +#include +#include + +#include "TST_ESPC.H" + +#include "generico.h" +#include "lerparm.h" +#include "PECA.h" + + +/* Tabela dos nomes dos comandos de teste específicos */ +#define MAX 5 +#define CRIAR_PECA_CMD "=criarpeca" +#define DESTRUIR_PECA_CMD "=destruirpeca" +#define OBTER_COR_CMD "=obtercorpeca" + +tppPeca P[MAX]; +/***** Código das funções exportadas pelo módulo *****/ + + +/*********************************************************************** +* +* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Peca sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = Pec_CondRetOK ; + int CondRetEsperada = Pec_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + char corEsperada = 'x'; + + int NumLidos = -1 ; + int i = 0; + char corRecebida; + int inxpec; + + TST_tpCondRet Ret; + + /* Testar Pec Criar Peca */ + if ( strcmp( ComandoTeste , CRIAR_PECA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec, &corRecebida, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + + if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; + + CondRetObtido = Pec_CriarPeca(&P[inxpec], corRecebida); + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar a peca." ); + + } /* fim ativa: Testar Pec Criar Peca */ + + /* Testar Pec Destruir Peca */ + else if ( strcmp( ComandoTeste , DESTRUIR_PECA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ii" , + &inxpec, &CondRetEsperada ) ; + if ( NumLidos != 2 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = Pec_DestruirPeca(P[inxpec]) ; + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao destruir a peca." ); + + } /* fim ativa: Testar Pec Destruir Peca */ + + /* Testar Pec Obter cor da Peca */ + else if ( strcmp( ComandoTeste , OBTER_COR_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec,&corEsperada, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + CondRetObtido = Pec_ObterCor(P[inxpec], &corRecebida) ; + + Ret = TST_CompararChar( corRecebida , corEsperada , + "Valor do elemento errado, diferente do esperado" ) ; + + if ( Ret != TST_CondRetOK ) + { + return Ret ; + } /* if */ + + return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); + + } /* fim ativa: Testar Pec Obter cor da Peca */ + return TST_CondRetNaoConhec ; + + } /* Fim função: TPec Efetuar operações de teste específicas para Peca */ \ No newline at end of file diff --git a/peca/TRAB2-3.exe b/peca/TRAB2-3.exe new file mode 100644 index 0000000000000000000000000000000000000000..f6c655bd3c505f0e6b22d35b09d3d1b8b24648a8 GIT binary patch literal 77312 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 literal 0 HcmV?d00001 diff --git a/peca/peca source/ArcaboucoTeste.lib b/peca/peca source/ArcaboucoTeste.lib new file mode 100644 index 0000000000000000000000000000000000000000..41ba1990924bce9779c6bdfa6b21565e71e10993 GIT binary patch literal 89288 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

(+lxk=fk>%<99^g>Amgv#<{Lp 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 esperado / obtido ou +* 1 + Tolerancia < esperado / obtido +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* Tolerância - indica os limites da relação entre esperado e obtido. +* Deve ser um valor positivo, menor do que 1. +* Use um valor do tipo 10 ** -n, no qual n é o +* número de dígitos significativos desejado. +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor obtido não estiver dentro do domínio da +* tolerância em torno do valor esperado +* TST_CondRetOK se os valores estiverem dentro da tolerância +* +***********************************************************************/ + + TST_tpCondRet TST_CompararFloat( double ValorEsperado , + double ValorObtido , + double Tolerancia , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar string +* +* $ED Descrição da função +* Compara string esperado com string obtido, reportamdo uma falha +* caso não sejam iguais. Ambos os strings devem obedecer o +* padrão C, terminando em zero. +* +* $EP Parâmetros +* ValorEsperado - é um string fornecido como parâmetro do comando +* de teste. +* ValorObtido - é o string retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararString( char * ValorEsperado , + char * ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar espaço +* +* $ED Descrição da função +* Compara espaços de dados, reportando uma falha caso não sejam iguais. +* Esta função pode ser utilizada para comparar qualquer coisa, +* inclusive valores do tipo "struct" +* O tipo do valor é indefinido e os valores serão exibidos em +* formato hexadecimal, caso não sejam iguais +* +* $EP Parâmetros +* ValorEsperado - ponteiro para o espaço que contém o valor esperado +* ValorObtido - ponteiro para o espaço que contém o valor obtido +* TamEspaco - tamanho do espaço a ser comparado +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , + void * ValorObtido , + int TamEspaco , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro +* +* $ED Descrição da função +* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro nulo +* +* $ED Descrição da função +* Verifica +* - quando ModoEsperado == 0 se o PonteiroObtido é nulo +* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Assertiva controlada +* +* $ED Descrição da função +* Esta função substitui a função assert de C. +* É utilizada no contexto do arcabouço de teste. +* Ela imprime mensagens mais visíveis tanto no log como na +* janela de comando. +* +* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. +* +* $FV Valor retornado +* Termina a execução do programa com código de retorno == 4 +* +***********************************************************************/ + + #define TST_ASSERT( Expressao ) \ + TST_Assert( Expressao , __LINE__ , __FILE__ ) + + void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir prefixo da mensagem +* +* $ED Descrição da função +* Imprime o prefixo de mensages de falha ou de informação. +* Não incrementa o contador de falhas. +* Esta função estabelece o padrão de saída das mensagens geradas +* durante os testes. +* +* $EP Parâmetros +* $P Indicador - informa a natureza da mensagem, +* Utilize preferenciamente as constantes definidas em +* TST_ESPEC.H: +* SINALIZA_ERRO ">>>" +* SINALIZA_RECUPERA "<<<" +* SINALIZA_COMENTARIO "!!!" +* $P pMensagem - é a mensagem prefixo a ser gerada. +* +* $EIU Interface com usuário pessoa +* Podem ser acrescentadas mensagens ao prefixo. A função +* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso +* (stdout ou definido pelo usuário) +* +***********************************************************************/ + + void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Notificar falha +* +* $ED Descrição da função +* Exibe uma mensagem de falha no formato padrão do arcabouço. +* A função não exibe os valores esperado e obtido. +* +* $EP Parâmetros +* $P pMensagem - mensdagem explicativa da falha. +* +* $FV Valor retornado +* TST_CondRetErro sempre +* +***********************************************************************/ + + TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Incrementar contador de falhas +* +* $ED Descrição da função +* Esta função deve ser usada quando, por alguma razão, precisar-se +* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. +* As outras funções (comparação, TST_NotificarFalha, etc.) +* incrementam o contador automaticamente. +* +***********************************************************************/ + + void TST_ContarFalhas( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de casos de teste efetuados +* +* $ED Descrição da função +* Retorna o número de casos de teste lidos. +* Cada caso de teste inicia com o comando "== ". +* +***********************************************************************/ + + int TST_ObterNumCasosTeste( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados +* +* $ED Descrição da função +* Retorna o número de comandos de teste específicos lidos e +* corretamente interpretados. +* Não conta comandos que retornem não OK independentemento do motivo, +* inclusive os comandos saltados após uma falha. +* Também não conta comandos recuperar. +* +***********************************************************************/ + + int TST_ObterNumComandosExecutados( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de falhas encontradas +* +* $ED Descrição da função +* Retorna o número de falhas encontrados. +* O módulo de teste específico sinaliza falhas através de +* uma condição de retorno diferente de TST_CondRetOK. +* Além de comparações em erro, são tratados como falhas: +* - comandos de teste em erro, +* - comandos de teste de um dado caso de teste ignorados (saltados) +* - erros encontrados nos instrumentos +* - erros de sintaxe dos comandos de teste +* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. +* Portanto, é possível que o número de falhas venha a ser maior do +* que o número de casos de teste existente no script. +* +***********************************************************************/ + + int TST_ObterNumFalhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter origem do nome da extensão de arquivo +* +* $ED Descrição da função +* Procura o início do nome da extensão contido no nome do arquivo +* dado por parâmetro +* +* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". +* Isto pode confundir no caso de se desejar a adição de algum nome +* de extensão padrão. +* +* $EP Parâmetros +* $P NomeArqParm - nome de arquivo a ser analisado +* +* $FV Valor retornado +* Ponteiro para o caractere '.' que separa a extensão. +* Será NULL caso o nome do arquivo não contenha extensão. +* +***********************************************************************/ + + char * TST_ObterInicioExtensao( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter ponteiro para arquivo LOG +* +* $ED Descrição da função +* Retorna o ponteiro para o FILE do log em uso no momento. +* Será stdout caso não seja definido explicitamente ao chamar a funcao +* TST_ControlarSessaoTeste +* +* $FV Valor retornado +* Ponteiro válido para um arquivo de texto de saída +* +***********************************************************************/ + + FILE * TST_ObterArqLog( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char +* +* $ED Descrição da função +* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém +* uma coluna em hexadecimal e outra em ASCII +* São exibidos 16 bytes por linha. +* +* $EP Parâmetros +* $P tamEspaco - tamanho em bytes do espaço a exibir +* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir +* +***********************************************************************/ + + void TST_ExibirEspacoHexa( int tamEspaco , + void * Ponteiro ) ; + +#undef GENERICO_EXT + +/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ + +#else +#endif diff --git a/peca/peca source/LERPARM.H b/peca/peca source/LERPARM.H new file mode 100644 index 0000000..f12cf3d --- /dev/null +++ b/peca/peca source/LERPARM.H @@ -0,0 +1,463 @@ +#if ! defined( LerParm_ ) +#define LerParm_ +/*************************************************************************** +* +* $MCD Módulo de definição: LER Ler parâmetros de comandos +* +* Arquivo gerado: LerParm.h +* Letras identificadoras: LER +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Provê funções para a leitura e análise léxica dos comandos de teste. +* Pressupõe-se que cada comando de teste esteja integralmente em +* uma linha. +* Cada comando de teste inicia com o caractere '=' seguido de um string +* que identifica o comando. +* Cada comando pode requerer zero ou mais parâmetros que se encontram na +* mesma linha que o comando. +* Parâmetros podem ser literis ou simbólicos. +* Os parâmetros simbólicos precisam ser declarados antes de serem +* utilizados. +* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. +* +* Se for do interesse do programador, módulos de teste específico +* podem ler e processar por conta própria linhas do script. Isto +* pode ser necessário quando um módulo necessita de um grande +* número de parâmetros ou de dados especiais. +* +* $EIU Interface com o usuário pessoa +* Este módulo interpreta os comandos de teste globalmente disponíveis: +* +* =declararparm +* declara o parâmetro do definido com o valor +* pode ser um de: +* i - inteiro (long) +* f - flutuante (double) +* c - caractere +* s - string +* O valor de literal tem que estar em conformidade com o tipo +* +* =exibirdeclaracao +* exibe a declaração do parâmetro em formato "dump de memória" +* +* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. +* +* Estes comandos sempre estarão disponíveis. Os demais comandos de +* teste estão impementados no módulo TESTLER específico para este módulo. +* +***************************************************************************/ + +#if defined( LerParm_OWN ) + #define LerParm_EXT +#else + #define LerParm_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define LER_DIM_NOME 32 +#define LER_DIM_STRING 500 +#define LER_DIM_BUFFER 250 + + +/*********************************************************************** +* +* $TC Tipo de dados: LER Condições de retorno +* +* +***********************************************************************/ + + typedef enum { + + LER_CondRetOK , + /* Ler retorno OK */ + + LER_CondRetNaoAbriu + /* Ler não abriu arquivo */ + + } LER_tpCondRet ; + +/***** Dados exportados pelo módulo *****/ + + /* Estrutura de dados: *LER Dados globais públicos */ + + LerParm_EXT int LER_TamBuffer ; + /* Tamanho do string contido no buffer de leitura + * + *$ED Descrição + * Contém o número total de caracteres do buffer, excluindo o zero. + * Jamais altere este valor. */ + + LerParm_EXT int LER_InxBuffer ; + /* Cursor do buffer de leitura + * + *$ED Descrição + * O cursor de leitura indexa o primeiro caractere não lido contido + * no buffer. + * O cursor é zerado sempre que uma nova linha for lida. + * O cursor é avançado ao ler um parâmetro, sendo colocado no + * primeiro caractere imediatamente após ao parâmetro lido. + * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ + + LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; + /* Buffer de leitura + * + *$ED Descrição + * Contém a linha corrente do script a ser processada. + * Jamais altere o valor do buffer. */ + + +/*********************************************************************** +* +* $FC Função: LER &Inicializar módulo LerParm +* +* $ED Descrição da função +* Inicializa o módulo. +* Deve ser chamada antes de iniciar a análise de comandos. +* Deve ser chamada uma única vez no início ou após terminar o módulo. +* +***********************************************************************/ + + int LER_InicializarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Terminar módulo LerParm +* +* $ED Descrição da função +* Fecha o arquivo de leitura e sinaliza módulo de leitura não +* inicializado. +* Após esta função somente poderá ser chamada a funçãp +* LER_InicializarLeitura +* +***********************************************************************/ + + void LER_TerminarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter nome do arquivo script +* +* $FV Valor retornado +* Retorna o ponteiro para o nome do arquivo script sendo processado. +* Deve-se tomar cuidado para não alterar este nome. +* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. +* +***********************************************************************/ + + char * LER_ObterNomeArqScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter número de linhas lidas até o momento +* +***********************************************************************/ + + int LER_ObterNumLinhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Abrir arquivo script de teste +* +* $ED Descrição da função +* Abre o arquivo que contém o script de teste. +* A extensão default do arquivo de comandos script de teste é +* ".script" e será acrescida ao nome do arquivo caso este não +* contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo contendo o script de teste +* +* $FV Valor retornado +* LER_CondRetOK - caso tenha sido possível abrir o arquivo. +* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. +* Não há discriminação do erro encontrado. +* +***********************************************************************/ + + LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha script eliminando brancos ao final +* +* $ED Descrição da função +* Lê uma linha do arquivo script e elimina os caracteres branco, +* fim de linha, tabulação etc. do final da linha lida. +* +* $FV Valor retornado +* Retorna o tamanho da linha lida. +* Será: +* -1 caso tenha ocorrido fim de arquivo. +* -2 caso tenha ocorrido algum problema de leitura. +* +***********************************************************************/ + + int LER_LerLinhaScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Interpretar comandos de teste +* +* $ED Descrição da função +* Interpreta os comandos de teste disponibilizados pelo módulo +* de leitura. +* +* Ver a descrição do módulo para mais detalhes +* +* $EP Parâmetros +* $P - Comando de teste a ser interpretado +* +* $FV Valor retornado +* TST_CondRetOK - caso tenha interpretado corretamente +* TST_CondRetNaoExecutou - caso o comando de teste a interpretar +* não pertença ao conjunto de LER +* TST_CondRetErro - caso o comando de teste é do conjunto de LER +* e está sintaticamente errado. +* Neste caso é gerada uma mensagem de erro no +* log. +* +***********************************************************************/ + + TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Declarar parâmetro simbólico +* +* $EP Parâmetros +* Interpreta uma linha de comando de teste contendo uma declaração de +* nome simbólico. +* Todas as declarações têm o formato: +* =declararparm +* em que o deve estar consistente com o +* São geradas mensagens de erro no log de teste caso a declaração +* não possa ser realizada. +* +* $FV Valor retornado +* TRUE - se a declaração ocorreu +* FALSE - caso contrário +* +***********************************************************************/ + + int LER_DeclararParametro( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Exibir declaração de símbolo +* +* $ED Descrição da função +* Exibe o Símbolo e o valor associado ao símbolo, sendo que este +* é exibido em hexadecimal. +* +***********************************************************************/ + + void LER_ExibirParametro( char * Simbolo ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha de parâmetros +* +* $ED Descrição da função +* Lê um número variável de parâmetros +* +* $EP Parâmetros +* $P Tipos é um string contendo a identificação dos tipos dos parâmetros +* a serem lidos. +* $P ... Os demais parâmetros são referências (ponteiros) para os +* espaços onde deverão ser armazenados os valores lidos. +* +* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista +* de referência e o string de tipos tenha o mesmo tamanho +* e que os indicadores de tipo sejam consistentes com a referência +* posicionalmente correspondentes. +* +* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já +* declarado. Caso isto seja possível e o tipo esteja correto +* é "lido" o valor contido no parâmetro. +* Caso não seja possível, tenta ler um literal em acordo com o tipo +* dado. +* +* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada +* e tipo inconsistente com o solicitado no correspondente caractere no +* string Tipos. +* +* $FV Valor retornado +* Retorna o número de campos lidos até concluir ou até encontrar +* um erro. +* +***********************************************************************/ + + int LER_LerParametros( char * Tipos , ... ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro caractere +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do caractere lido +* +* $EIU Interface com usuário pessoa +* Um caractere deve vir entre aspas simples. Valem os caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmChar( char * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro inteiro +* +* $EP Parâmetros +* $P Parm é um ponteiro para um int que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do int lido +* +* $EIU Interface com usuário pessoa +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmInt( int * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro flutuante +* +* $EP Parâmetros +* $P Parm é um ponteiro para um double que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do double lido +* +* $EIU Interface com usuário pessoa +* São válidas todas as formas de literal double aceitas pelo scanf. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmDouble( double * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro nome +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o nome lido +* $P tamString é o tamanho do nome que foi lido +* $P dimString é o tamanho máximo que o nome poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do nome lido +* +* $EIU Interface com usuário pessoa +* São válidas as mesmas regras de nomes C. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro string +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o string lido +* $P tamString é o tamanho do string que foi lido +* $P dimString é o tamanho máximo que o string poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do string lido +* +* $EIU Interface com usuário pessoa +* Um string deve vir entre aspas duplas. +* Um string pode conter caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Pular comando de teste +* +* $ED Descrição da função +* Avança o cursor do buffer de leitura por cima de um comando de teste. +* Todos os comandos de teste principiam com o prefixo '=' +* +***********************************************************************/ + + void LER_PularComando( void ) ; + +#undef LerParm_EXT + +/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ + +#else +#endif diff --git a/peca/peca source/PECA.C b/peca/peca source/PECA.C new file mode 100644 index 0000000..696d6a6 --- /dev/null +++ b/peca/peca source/PECA.C @@ -0,0 +1,92 @@ +/*************************************************************************** +* $MCI Módulo de implementação: PEC Estrutura Peca +* +* Arquivo gerado: PECA.C +* Letras identificadoras: PEC +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa +* fvc - Felipe Vieira Côrtes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 1.0 tbm 14/set/2015 Início do desenvolvimento +* +***************************************************************************/ + + +#include +#include +#include + +#define PECA_OWN +#include "PECA.h" +#undef PECA_OWN + +/*********************************************************************** +* +* $TC Tipo de dados: PECPnt Descritor do dados de ponto. +* +* $ED Descrição do tipo +* Descreve a estrutura de peça +***********************************************************************/ + +typedef struct tgPeca{ + int *posicao; + /*Pontei para a posicao da peca, ainda deve ser alterado pelo tipo correto.*/ + char cor; + /*Devemos usar um inteiro para facilitar a manipulacao da peça pela cor? Porem a cor tambem determia qual jogador + tem a posse da peca*/ + //struct tpp * jogador; +} tpPeca; + + +/***** Dados encapsulados no módulo *****/ + + +/***** Código das funções exportadas pelo módulo *****/ + +/*************************************************************************** +* +* Função: Pec Criar Peça +* ****/ + +Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado, char CorDaNovaPeca) +{ + *PecCriado= (tppPeca)malloc(sizeof(struct tgPeca)); + + if(PecCriado == NULL) + return Pec_CondRetFaltouMemoria; + + (*PecCriado)->cor = CorDaNovaPeca; + + return Pec_CondRetOK; +} + +/*************************************************************************** +* +* Função: PEC Destruir Peça +* ****/ + +Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca) +{ + return Pec_CondRetOK; +} + +/*************************************************************************** +* +* Função: PEC Obter Cor +* ****/ + +Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor) +{ + *cor = Peca->cor; + return Pec_CondRetOK; +} + +/*********** Fim do módulo de implementação: Módulo DadoPontos **************/ diff --git a/peca/peca source/PECA.h b/peca/peca source/PECA.h new file mode 100644 index 0000000..a63d488 --- /dev/null +++ b/peca/peca source/PECA.h @@ -0,0 +1,98 @@ +/*************************************************************************** +* +* $MCD Módulo de definição: Módulo Peça +* +* Arquivo gerado: PECA.H +* Letras identificadoras: PEC +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa +* fvc - Felipe Vieira Côrtes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão + +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 1.00 tbm 14/09/2015 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo implementa um conjunto simples de funções para manipular a peça +* alem de descrever sua estrutura. +* +***************************************************************************/ + +#if defined( PECA_OWN ) + #define PECA_EXT +#else + #define PECA_EXT extern +#endif + +typedef struct tgPeca * tppPeca; + +/*********************************************************************** +* +* $TC Tipo de dados: MAT Condicoes de retorno +* +* +***********************************************************************/ + + typedef enum { + + Pec_CondRetOK = 0 , + /* Executou correto */ + + Pec_CondRetErro = 1 , + /* Estrutura do DadoPontos está errada */ + + Pec_CondRetMatrizNaoExiste = 2 , + /* DadoPontos não existe */ + + Pec_CondRetFaltouMemoria = 3 + /* Faltou memória ao alocar dados */ + + } Pec_tpCondRet ; + +/*********************************************************************** +* +* $FC Função: DADPnt Criar Peça +* +* $ED Descrição da função +* Cria uma nova peça +* $FV Valor retonado +* Pec_CondRetOK +* Pec_CondRetFaltouMemoria +* +***********************************************************************/ + + Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado1, char CorDaNovaPeca); + +/*********************************************************************** +* +* $FC Função: DADPnt Destruir Peça +* +* $ED Descrição da função +* Destroi uma peça +* $FV Valor retonado +* Pec_CondRetOK +* Pec_CondRetFaltouMemoria +* +***********************************************************************/ + + Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); + +/*********************************************************************** +* +* $FC Função: DADPnt Obter Cor +* +* $ED Descrição da função +* Obtem cor de uma peca +* $FV Valor retonado +* Pec_CondRetOK +* Pec_CondRetFaltouMemoria +* +***********************************************************************/ +Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); \ No newline at end of file diff --git a/peca/peca source/TESTPECA.C b/peca/peca source/TESTPECA.C new file mode 100644 index 0000000..199f11b --- /dev/null +++ b/peca/peca source/TESTPECA.C @@ -0,0 +1,158 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTPECA.C +* Letras identificadoras: TPec +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); +* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); +* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +***************************************************************************/ + +#include +#include +#include + +#include "TST_ESPC.H" + +#include "generico.h" +#include "lerparm.h" +#include "PECA.h" + + +/* Tabela dos nomes dos comandos de teste específicos */ +#define MAX 5 +#define CRIAR_PECA_CMD "=criarpeca" +#define DESTRUIR_PECA_CMD "=destruirpeca" +#define OBTER_COR_CMD "=obtercorpeca" + +tppPeca P[MAX]; +/***** Código das funções exportadas pelo módulo *****/ + + +/*********************************************************************** +* +* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Peca sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = Pec_CondRetOK ; + int CondRetEsperada = Pec_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + char corEsperada = 'x'; + + int NumLidos = -1 ; + int i = 0; + char corRecebida; + int inxpec; + + TST_tpCondRet Ret; + + /* Testar Pec Criar Peca */ + if ( strcmp( ComandoTeste , CRIAR_PECA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec, &corRecebida, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + + if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; + + CondRetObtido = Pec_CriarPeca(&P[inxpec], corRecebida); + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar a peca." ); + + } /* fim ativa: Testar Pec Criar Peca */ + + /* Testar Pec Destruir Peca */ + else if ( strcmp( ComandoTeste , DESTRUIR_PECA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ii" , + &inxpec, &CondRetEsperada ) ; + if ( NumLidos != 2 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = Pec_DestruirPeca(P[inxpec]) ; + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao destruir a peca." ); + + } /* fim ativa: Testar Pec Destruir Peca */ + + /* Testar Pec Obter cor da Peca */ + else if ( strcmp( ComandoTeste , OBTER_COR_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec,&corEsperada, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + CondRetObtido = Pec_ObterCor(P[inxpec], &corRecebida) ; + + Ret = TST_CompararChar( corRecebida , corEsperada , + "Valor do elemento errado, diferente do esperado" ) ; + + if ( Ret != TST_CondRetOK ) + { + return Ret ; + } /* if */ + + return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); + + } /* fim ativa: Testar Pec Obter cor da Peca */ + return TST_CondRetNaoConhec ; + + } /* Fim função: TPec Efetuar operações de teste específicas para Peca */ \ No newline at end of file diff --git a/peca/peca source/TST_ESPC.H b/peca/peca source/TST_ESPC.H new file mode 100644 index 0000000..987ff8e --- /dev/null +++ b/peca/peca source/TST_ESPC.H @@ -0,0 +1,320 @@ +#if ! defined( Tst_Espc_ ) +#define Tst_Espc_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTE Interface de teste específico +* +* Arquivo gerado: Tst_Espc.h +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Este módulo consta somente do módulo de definição de todos os módulos +* de teste específicos a serem desenvolvidos, e também da especificação +* do tipo de condições de retorno deste módulo. +* +* Ele estabelece a interface a ser utilizada pelo módulo de teste +* genérico com todos os módulos de teste específico a serem +* desenvolvidos. +* +* Os módulos de teste específico devem sempre incluir este módulo +* de definição e, idealmente, não devem adicionar mais itens +* à interface. +* +* O módulo de teste específico contém a função de teste de um +* determinado módulo ou conjunto de módulos. Mais especificamente, +* contém a função que interpreta os comandos de teste que exercitarão +* as funções do(s) módulo(s) em teste. +* +* Poderá conter também diversas funções auxiliares requeridas para +* realizar os testes, vide "contexto" a seguir. +* +* O contexto é formado por variáveis e estruturas auxiliares necessárias +* para que se possa efetuar todos os comandos de teste. +* Por exemplo pode-se desejar testar várias instâncias de uma +* mesma estrutura. Uma forma de resolver isto é criar um vetor +* global static +* de n elementos em que cada elemento aponta para a cabeça de +* uma determinada instância dessa estrutura. Para realizar um +* teste relativo a uma determinada instância, torna-se necessário +* selecioná-la através de um índice contido no comando de teste. +* Este parâmetro, embora seja um índice, é na realidade o identificador +* da instância da estrutura a ser manipulada (idEstrutura). +* +* Caso o módulo em teste requeira um contexto, este deverá ser +* estabelecido no presente módulo. Para tal devem ser declaradas +* variáveis e estruturas encapsuladas e devem ser incluídos comandos +* de teste capazes de manipular o contexto. +* +* Uma das formas para estabelecer o contexto seria a de incluir +* no mçodulo de teste específico comando semelhantes a: +* +* =iniciaXXX que inicializa o contexto do módulo sob teste para +* vazio. Este comando deve ser utilizado uma única vez +* logo ao inciar a execução do teste. +* =reset restaura o contexto para vazio. Este comando usualmente +* assumirá que o contexto a esvaziar esteja correto. +* O comando deverá liberar os espaços alocados aos +* elementos, anular as referências a ele, inicializar +* valores de vetores de referências, etc. +* O comando tem utilidade especial ao segmentar um teste +* em partes estanques e ao controlar vazamento de +* memória. +* =terminaXXX este comando destrói todo o contexto e não o +* reinicializa. O objetivo é poder verificar vazamento +* de memória. +* +* Evidentemente, outra forma seria a de alterar as funções de +* inicialização e término do módulo de teste genérico o que é pouco +* recomendável pois viola o princípio de um mesmo módulo genérico +* servir para testar todos os construtos. +* +* Para cada função do módulo a ser testado deve existir pelo menos +* um comando de teste. Em alguns casos pode ser interessante criar +* comandos que armazenem, alterem ou consultem variáveis de +* estado do próprio módulo de teste. Ver os comentários sobre +* contexto acima. Ou seja, podem existir comandos de teste que +* têm o propósito de agir sobre o contexto e, não, o de efetuar +* um determinado teste. Alguns desses comandos podem inclusive +* realizar verificações entre um resultado esperado e existente +* no contexto. +* +* Todos os controles de consistência dos parâmetros dos comandos +* de teste devem ser realizados no módulo de teste específico. +* Recomenda-se que seja sempre retornado TST_CondRetParm, +* sinalizando erro de sintaxe do comando de teste ou valores +* não permitidos. Deve ser sempre assumido que os parâmetros +* podem estar em erro. Ou seja, o controle da integridade dos +* comando é mandatória. +* +* Caso seja necessário emitir mensagens especiais, +* deve ser utilizada a função genérica "TST_ExibirPrefixo". +* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, +* (prefixo, ou comparar), utilize a função +* fprintf( TST_ObterArqLog( ) , "..." , ... ) +* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") +* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção +* assegura a consistência do aspecto das mensagens com o restante do +* programa de teste. +* +* Cada comando deve ser completamente interpretado pelo seu +* respectivo fragmento de interpretação. Ou seja, não deverá ser +* retornado para o módulo genérico qualquer dado adicional à +* condição de retorno da função de teste específico. Veja +* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes +* à mensagen já exibida. +* +* A função TST_NotificarFalha sempre registra uma falha, enquanto que +* a função TST_ExibirPrefixo pode ser usada para emitir mensagens +* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo +* seja utilizada para sinalizar uma falha, é necessário chamar +* também a função TST_ContarFalha( ) para que seja notificada a falha. +* Isto não é necessário no caso da função TST_NotificarFalha, pois +* esta sempre conta falhas. +* +* As funções a testar que retornem um valor sempre devem ter +* este valor verificado, mesmo que seja uma condição de retorno. +* Utilize para isto uma das funções " Comparar" do arcabouço. +* Caso uma função retorne dois ou mais valores, incluindo +* a condição de retorno, utilize um código semelhante ao +* descrito a seguir. +* +* Seja +* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... +* a função a ser testada e, v1, v2, ... os dados retornados de +* alguma forma (valor retornado, parâmetro por referência, variável +* global). Assumindo que v1 seja o valor retornado. +* +* v1Obtido = FuncATestar( ... +* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* +* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* ... +* +* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; +* +***************************************************************************/ + +#if defined( Tst_Espc_OWN ) + #define Tst_Espc_EXT +#else + #define Tst_Espc_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define SINALIZA_ERRO ">>>" +#define SINALIZA_RECUPERA "<<<" +#define SINALIZA_COMENTARIO "!!!" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste específico +* +* +* $ED Descrição do tipo +* Este tipo enumera todas as condições de retorno que podem ser +* geradas pela função de teste específica. +* +***********************************************************************/ + + typedef enum { + + TST_CondRetOK , + /* Comando de teste executou corretamente */ + + TST_CondRetErro , + /* Comando de teste encontrou uma ou mais falhas + * + *$ED Descrição + * Esta condição sinaliza que um ou mais resultados da execução + * da função sob teste resultou em um valor diferente do esperado. */ + + TST_CondRetParm , + /* Comando de teste está com a sintaxe em erro + * + *$ED Descrição + * A presente condição de retorno deve ser retornada caso a sintaxe + * ou os valores do comando de teste estiverem em erro. + * + * Todos os fragmentos de interpretação devem: + * - realizar a análise dos parâmetros do comando + * - verificar se todos os parâmetros foram lidos + * - verificar se os valores dos parâmetros estão corretos + * por exemplo: verificar se os índices de acesso a elementos + * estão dentro dos limites dos correspondentes vetores. + * - efetuar a função a testar + * - verificar se os resultados retornados por esta função estão + * corretos */ + + TST_CondRetNaoExecutou , + /* Comando de teste não se destina ao presente interpretador + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de comandos de teste relativas a módulos do próprio arcabouço, + * caso não tenha sido encontrado um comando válido. Isso permite + * estabelecer um "daisy chain" de interpretadores em que cada qual + * tenha finalidade específica no contexto do arcabouço. */ + + TST_CondRetNaoConhec , + /* Comando de teste não é conhecido + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de casos de teste específico visando determinado módulo em teste, + * sempre que esse interpretador não consiga identificar o comando. + * + * Cabe salientar a diferença entre TST_CondRetNaoExecutou e + * TST_CondRetNaoConhec. A primeira corresponde à não interpretação + * de um comando possivelmente válido em interpretadores subsequentes. + * A segunda corresponde a comandos não válidos considerando todos + * os interpretadores. */ + + TST_CondRetNaoImplementado , + /* Comando de teste não implementado + * + *$ED Descrição + * Esta condição deve ser retornada ao interpretar um comando de teste + * específico ainda não implementado. + * + * Recomenda-se que o desenvolvimento dos módulos sob teste e do + * correpondente módulo de teste específico se dê incrementalmente. + * Consequentemente diversos comandos não estarão implementados + * no início do desenvolvimento. Esta incompleteza poderá ser + * sinalizada com esta condição de retorno. */ + + TST_CondRetMemoria + /* Faltou memória para executar o comando + * + *$ED Descrição + * Esta condição deve ser retornada caso tenha ocorrido algum erro + * quando o módulo de teste específico tentar alocar memória ou + * outro recurso. */ + + } TST_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: TSTE &Efetuar comandos de teste específicos +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* sendo testado. +* +* Cada módulo de teste específico deve desenvolver esta função. +* Poderá conter diversas outras conforme necessário. No entanto +* estas devem todas ser funções encapsuladas no módulo (static) +* +* Freqüentemente é necessário desenvolver um contexto para o teste. +* Por exemplo, pode ser necessário tratar n elementos disponibilizados +* pelo módulo sob teste. Neste caso deveria ser criado um vetor +* global com referências para estas elemento. Ao iniciar os teste +* este vetor deverá ser inicializado. Ao terminar, os elementos do +* vetor referenciando algum elemento devem ser destruídos. +* +* Todos os controles de consistência devem ser realizados no +* módulo de teste específico. +* +* A função TST_EfetuarComando( ) deve retornar as condições de retorno +* identificadas no tipo TST_tpCondRet. +* +* As funções do módulo sob teste que retornam algum valor sempre +* devem sempre ter este valor verificado, mesmo sendo uma condição de +* retorno. Para fazer a vereficação da corretude, recomenda-se +* utilizar as funções TST_CompararXXX definidas no módulo genérico. +* Assegura-se assim a uniformidade da saída gerada durante o teste. +* +* Para realizar a análise de um comando de teste recomenda-se +* utilizar as funções definidas no módulo LerParm. Elas, além +* de realizarem a análise léxica, permitem o uso intercambiável +* de parâmetros simbólicos ou literais. Também realizam a +* verificação da corretude dos tipos dos parâmetros, contribuindo +* assim para a redução de erros de redação de scripts de teste +* que possam passar despercebidos. +* +* As funções a serem testadas que requeiram algum argumento, devem +* ser chamadas com valores (parâmetros) extraídos do comando de +* teste sendo executado. Use sempre as funções do módulo LerParm +* para realizar a análise sintática. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* TST_CondRetXXX - veja a descriÓcão dos possíveis valores +* retornados na especificação do correspondente +* enum +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; + +#undef Tst_Espc_EXT + +/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ + +#else +#endif diff --git a/peca/testepeca.bat b/peca/testepeca.bat new file mode 100644 index 0000000..d0daf44 --- /dev/null +++ b/peca/testepeca.bat @@ -0,0 +1 @@ +TRAB2-3 /stestepecascript > logtestepeca.txt \ No newline at end of file diff --git a/peca/testepecascript.script b/peca/testepecascript.script new file mode 100644 index 0000000..03e2c37 --- /dev/null +++ b/peca/testepecascript.script @@ -0,0 +1,21 @@ +// TESTE DO MODULO PECA +// TESTE COMPLETO + +== Testar criar 2 pecas +=criarpeca 0 'p' 0 +=criarpeca 1 'b' 0 + +== Testar obter a cor da peca 0 (preta) +=obtercorpeca 0 'p' 0 + +== Testar obter a cor da peca 1 errada (branca) +=obtercorpeca 1 'p' 0 +=recuperar + +== Testar obter a cor da peca 1 (branca) +=obtercorpeca 1 'b' 0 + +== Destruir as duas pecas +=destruirpeca 1 0 +=destruirpeca 0 0 + From ea48b071c66480c3a6680ab8308e3d5fed8d32a0 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Thu, 17 Sep 2015 00:05:45 -0300 Subject: [PATCH 04/18] =?UTF-8?q?Pequenas=20altera=C3=A7oes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a funcao jogar dado ainda está errada --- Dado/TRAB2-2.exe | Bin 76800 -> 76800 bytes Dado/logtestedado.txt | 44 ++++++++++++++++++++++++++++++++++++ Dado/testedadoscript.script | 11 ++++++++- TESTDADO.c | 3 --- 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 Dado/logtestedado.txt diff --git a/Dado/TRAB2-2.exe b/Dado/TRAB2-2.exe index adc0474d3d9bc2ed6d4c0bcbbee24dcc6f336395..06d6fb08de59cbb9b39f111d434f6b34d5c038f1 100644 GIT binary patch delta 152 zcmZp;!P0PpWx@}pVx5h@3V21Vn``&{FJa%o#K6Gt+PK$sNx+M#lUw){{PlkP|8IQY zHR}!*piEHr*??Zr3sQ~@FJ^uF|34xsJ}$cPhyo)6gY}yiEI^grPh$@Qc?>szN|yZp z{~x6336Ncun3G@Rl9-Y|`QRGk%?kWyjxq{vetSjPowLtsiq%G|D^?G-OUf`l=LZ1m CEDMkZakvE$iQIz z=EdjlKuu3$5BGX900kJ{097sd|NlQo-;c=;`Ls7H@Si!#D6skM6=iqMDOR(r4q3gh M`m$Y8hVeN+0QOr*DgXcg diff --git a/Dado/logtestedado.txt b/Dado/logtestedado.txt new file mode 100644 index 0000000..84708fb --- /dev/null +++ b/Dado/logtestedado.txt @@ -0,0 +1,44 @@ + + +LES - Laboratório de Engenharia de Software DI/PUC-Rio + Arcabouço de teste de módulos C (c) 2006 + +--------------------------------------------- + Construto sob teste: TRAB2-2 + + Arquivo de teste: testedadoscript + + +!!! 0 Linha: 1 // SCRIPT DE TESTE PARA O MODULO DADO +!!! 0 Linha: 2 // TESTE COMPLETO + 4 == Jogar o dado 10 vezes + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + dado: 6 + + +!!! Número de linhas lidas: 14 +!!! Número de casos de teste: 1 +!!! Número comandos corretos: 10 +!!! Número de falhas encontradas: 0 + +!!! Não foram encontrados problemas + + +!!! Numero de espacos ainda alocados: 0 \ No newline at end of file diff --git a/Dado/testedadoscript.script b/Dado/testedadoscript.script index aeb6334..e4ccb16 100644 --- a/Dado/testedadoscript.script +++ b/Dado/testedadoscript.script @@ -1,5 +1,14 @@ // SCRIPT DE TESTE PARA O MODULO DADO // TESTE COMPLETO -== Jogar o dado +== Jogar o dado 10 vezes +=jogardado +=jogardado +=jogardado +=jogardado +=jogardado +=jogardado +=jogardado +=jogardado +=jogardado =jogardado \ No newline at end of file diff --git a/TESTDADO.c b/TESTDADO.c index f74a38b..73689be 100644 --- a/TESTDADO.c +++ b/TESTDADO.c @@ -109,12 +109,9 @@ return TST_CondRetParm ; } /* if */ - while( i < 60) { CondRetObtido = DAD_NumPular(&valorDado) ; printf(" \n dado: %d\n", valorDado); - i++; - } return TST_CondRetOK; From 93197fcc83ace5d06b649afeabd4a8514f40ca99 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Fri, 18 Sep 2015 10:02:51 -0300 Subject: [PATCH 05/18] percebe-se que se executado varias vzs no msm programa, a funcao randomica sempre retorna um mesmo numero --- Dado/logtestedado.txt | 20 ++++++++++---------- peca/logtestepeca.txt | 30 ++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 peca/logtestepeca.txt diff --git a/Dado/logtestedado.txt b/Dado/logtestedado.txt index 84708fb..d1b6bde 100644 --- a/Dado/logtestedado.txt +++ b/Dado/logtestedado.txt @@ -12,25 +12,25 @@ LES - Laborat !!! 0 Linha: 1 // SCRIPT DE TESTE PARA O MODULO DADO !!! 0 Linha: 2 // TESTE COMPLETO 4 == Jogar o dado 10 vezes - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 - dado: 6 + dado: 3 !!! Número de linhas lidas: 14 diff --git a/peca/logtestepeca.txt b/peca/logtestepeca.txt new file mode 100644 index 0000000..7f41f51 --- /dev/null +++ b/peca/logtestepeca.txt @@ -0,0 +1,30 @@ + + +LES - Laboratório de Engenharia de Software DI/PUC-Rio + Arcabouço de teste de módulos C (c) 2006 + +--------------------------------------------- + Construto sob teste: TRAB2-3 + + Arquivo de teste: testepecascript + + +!!! 0 Linha: 1 // TESTE DO MODULO PECA +!!! 0 Linha: 2 // TESTE COMPLETO + 4 == Testar criar 2 pecas + 8 == Testar obter a cor da peca 0 (preta) + 11 == Testar obter a cor da peca 1 errada (branca) +>>> 1 Linha: 12 Valor do elemento errado, diferente do esperado Deveria ser: 'b' É: 'p' +<<< 0 Linha: 13 Falha esperada foi recuperada. + 15 == Testar obter a cor da peca 1 (branca) + 18 == Destruir as duas pecas + +!!! Número de linhas lidas: 21 +!!! Número de casos de teste: 5 +!!! Número comandos corretos: 6 +!!! Número de falhas encontradas: 0 + +!!! Não foram encontrados problemas + + +!!! Numero de espacos ainda alocados: 0 \ No newline at end of file From 16b05df99753fc711f58c7217d3da51c26b79847 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Fri, 18 Sep 2015 14:44:25 -0300 Subject: [PATCH 06/18] Dado atualizado MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agora gerando numeros aleatórios (nao tao aleatorios mas serve) --- DADO.H | 1 - DADO.c | 38 ++++++++++++++++++++++++++------------ Dado/Source Dado/DADO.H | 1 - Dado/Source Dado/DADO.c | 38 ++++++++++++++++++++++++++------------ Dado/TRAB2-2.exe | Bin 76800 -> 76800 bytes Dado/logtestedado.txt | 18 +++++++++--------- 6 files changed, 61 insertions(+), 35 deletions(-) diff --git a/DADO.H b/DADO.H index 1204f8e..5a2f0df 100644 --- a/DADO.H +++ b/DADO.H @@ -31,7 +31,6 @@ #define DADO_EXT extern #endif -#include "GERAALT.H" /*********************************************************************** * * $TC Tipo de dados: MAT Condicoes de retorno diff --git a/DADO.c b/DADO.c index 63e4dd0..18832fc 100644 --- a/DADO.c +++ b/DADO.c @@ -23,10 +23,10 @@ #include #include #include -#include "GERAALT.H" #define DADO_OWN #include "DADO.h" +#include #undef DADO_OWN #define RAN_MAX 0x7fff @@ -44,23 +44,37 @@ int dadorand(void); DAD_tpCondRet DAD_NumPular(int *NumeroCasas) { - unsigned int i = 1; - int DadoInicio = 1; - int DadoFim = 6; - - //ALT_Inicializar( i ); - *NumeroCasas = dadorand(); + *NumeroCasas = randint(6); return DAD_CondRetOK; }/*Fim da função DAD_NumPular */ /* Função usada pelo módulo */ -int dadorand(void) -{ - int dado; - srand( 3141592653 |(unsigned)time(NULL)); - return rand()%6+1; + +/* Returns an integer in the range [1, n]. + * + * Uses rand(), and so is affected-by/affects the same seed. + */ +int randint(int n) { + int r; + if ((n - 1) == RAND_MAX) { + return rand(); + } else { + // Chop off all of the values that would cause skew... + long end = RAND_MAX / n; // truncate skew + assert (end > 0L); + end *= n; + + // ... and ignore results from rand() that fall above that limit. + // (Worst case the loop condition should succeed 50% of the time, + // so we can expect to bail out of this loop pretty quickly. + while ((r = rand()) >= end); + + r = (r|time(NULL)); + + return (r % n) +1; + } } /*********** Fim do módulo de implementação: Módulo Dado **************/ diff --git a/Dado/Source Dado/DADO.H b/Dado/Source Dado/DADO.H index 1204f8e..5a2f0df 100644 --- a/Dado/Source Dado/DADO.H +++ b/Dado/Source Dado/DADO.H @@ -31,7 +31,6 @@ #define DADO_EXT extern #endif -#include "GERAALT.H" /*********************************************************************** * * $TC Tipo de dados: MAT Condicoes de retorno diff --git a/Dado/Source Dado/DADO.c b/Dado/Source Dado/DADO.c index 63e4dd0..18832fc 100644 --- a/Dado/Source Dado/DADO.c +++ b/Dado/Source Dado/DADO.c @@ -23,10 +23,10 @@ #include #include #include -#include "GERAALT.H" #define DADO_OWN #include "DADO.h" +#include #undef DADO_OWN #define RAN_MAX 0x7fff @@ -44,23 +44,37 @@ int dadorand(void); DAD_tpCondRet DAD_NumPular(int *NumeroCasas) { - unsigned int i = 1; - int DadoInicio = 1; - int DadoFim = 6; - - //ALT_Inicializar( i ); - *NumeroCasas = dadorand(); + *NumeroCasas = randint(6); return DAD_CondRetOK; }/*Fim da função DAD_NumPular */ /* Função usada pelo módulo */ -int dadorand(void) -{ - int dado; - srand( 3141592653 |(unsigned)time(NULL)); - return rand()%6+1; + +/* Returns an integer in the range [1, n]. + * + * Uses rand(), and so is affected-by/affects the same seed. + */ +int randint(int n) { + int r; + if ((n - 1) == RAND_MAX) { + return rand(); + } else { + // Chop off all of the values that would cause skew... + long end = RAND_MAX / n; // truncate skew + assert (end > 0L); + end *= n; + + // ... and ignore results from rand() that fall above that limit. + // (Worst case the loop condition should succeed 50% of the time, + // so we can expect to bail out of this loop pretty quickly. + while ((r = rand()) >= end); + + r = (r|time(NULL)); + + return (r % n) +1; + } } /*********** Fim do módulo de implementação: Módulo Dado **************/ diff --git a/Dado/TRAB2-2.exe b/Dado/TRAB2-2.exe index 06d6fb08de59cbb9b39f111d434f6b34d5c038f1..af8fdf274720af76e9b050fca89f8de89f2b65e5 100644 GIT binary patch delta 20234 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 Hhui!grL_N> diff --git a/Dado/logtestedado.txt b/Dado/logtestedado.txt index d1b6bde..7be1abb 100644 --- a/Dado/logtestedado.txt +++ b/Dado/logtestedado.txt @@ -12,25 +12,25 @@ LES - Laborat !!! 0 Linha: 1 // SCRIPT DE TESTE PARA O MODULO DADO !!! 0 Linha: 2 // TESTE COMPLETO 4 == Jogar o dado 10 vezes - dado: 3 + dado: 2 - dado: 3 + dado: 1 - dado: 3 + dado: 6 - dado: 3 + dado: 6 - dado: 3 + dado: 4 - dado: 3 + dado: 1 - dado: 3 + dado: 6 dado: 3 - dado: 3 + dado: 6 - dado: 3 + dado: 6 !!! Número de linhas lidas: 14 From 9d6f17475f5e5c8eff5fe590dfbe80d1ca6fac51 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Mon, 21 Sep 2015 23:00:53 -0300 Subject: [PATCH 07/18] Tabuleiro Adicionado --- TESTDADOPONTOS.c | 207 ++++++++++++ tabuleiro/ArcaboucoTeste.lib | Bin 0 -> 89288 bytes tabuleiro/DADO.H | 72 +++++ tabuleiro/DADO.c | 86 +++++ tabuleiro/GENERICO.H | 588 +++++++++++++++++++++++++++++++++++ tabuleiro/LERPARM.H | 463 +++++++++++++++++++++++++++ tabuleiro/LISTA.C | 560 +++++++++++++++++++++++++++++++++ tabuleiro/LISTA.H | 346 +++++++++++++++++++++ tabuleiro/PECA.C | 92 ++++++ tabuleiro/PECA.h | 98 ++++++ tabuleiro/TABULEIRO.C | 64 ++++ tabuleiro/TABULEIRO.H | 162 ++++++++++ tabuleiro/TST_ESPC.H | 320 +++++++++++++++++++ 13 files changed, 3058 insertions(+) create mode 100644 TESTDADOPONTOS.c create mode 100644 tabuleiro/ArcaboucoTeste.lib create mode 100644 tabuleiro/DADO.H create mode 100644 tabuleiro/DADO.c create mode 100644 tabuleiro/GENERICO.H create mode 100644 tabuleiro/LERPARM.H create mode 100644 tabuleiro/LISTA.C create mode 100644 tabuleiro/LISTA.H create mode 100644 tabuleiro/PECA.C create mode 100644 tabuleiro/PECA.h create mode 100644 tabuleiro/TABULEIRO.C create mode 100644 tabuleiro/TABULEIRO.H create mode 100644 tabuleiro/TST_ESPC.H diff --git a/TESTDADOPONTOS.c b/TESTDADOPONTOS.c new file mode 100644 index 0000000..e7b289b --- /dev/null +++ b/TESTDADOPONTOS.c @@ -0,0 +1,207 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTDADOPONTOS.C +* Letras identificadoras: TPec +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 tbm 23/08/2015 Módulo modificado para operar dadospontos +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criardadoponto - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); +* =destruirdadoponto - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); +* =obtervalorjogo - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +***************************************************************************/ + +#include +#include +#include + +#include "TST_ESPC.H" + +#include "GENERICO.H" +#include "lerparm.h" +#include "DADOPONTOS.h" + +/* Tabela dos nomes dos comandos de teste específicos */ +#define MAX 5 +#define CRIAR_DADOPONTOS_CMD "=criardadopontos" +#define DESTRUIR_DADOPONTOS_CMD "=destruirdadoponto" +#define OBTER_VALORPARTIDA_CMD "=obtervalorpartida" +#define DOBRAR_DADO_CMD "=dobrardado" +#define OBTER_DONO_CMD "=obterdono" + + +tppDadoPontos P[MAX]; +/***** Código das funções exportadas pelo módulo *****/ + +/*********************************************************************** +* +* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Peca sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = DADPnt_CondRetOK ; + int CondRetEsperada = DADPnt_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + char corEsperada = 'x'; + + int NumLidos = -1 ; + int i = 0; + int ValorPontos,valoresperado; + char corRecebida; + int inxpec; + + TST_tpCondRet Ret; + + /* Testar Pec Criar Dado Pontos */ + if ( strcmp( ComandoTeste , CRIAR_DADOPONTOS_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec,&corEsperada, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; + + CondRetObtido = DADPtn_CriarDado(&P[inxpec]); + + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar a peca." ); + + } + /* fim ativa: Testar Criar Dado Pontos */ + + /* Testar Pec Destruir DadoPontos */ + else if ( strcmp( ComandoTeste , DESTRUIR_DADOPONTOS_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ii" , + &inxpec, &CondRetEsperada ) ; + if ( NumLidos != 2 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = DADPtn_DestruirDado(P[inxpec]) ; + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao destruir o dadopontos." ); + + } + /* fim ativa: Testar DadoPontos Destruir*/ + + /* Testar Obter Dono do DadoPonto */ + else if ( strcmp( ComandoTeste , OBTER_DONO_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec, &corEsperada ,&CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + CondRetObtido = DADPtn_ObterDono(P[inxpec],&corRecebida) ; + + Ret = TST_CompararChar( corRecebida , corEsperada , + "Cor do jogador errado, diferente do esperado" ) ; + + if ( Ret != TST_CondRetOK ) + { + return Ret ; + } /* if */ + + return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); + + } + /* fim ativa: Testar DadoPontos Dobrar Dado*/ + + /* Testar Dadoponto DobrarDado */ + else if ( strcmp( ComandoTeste , DOBRAR_DADO_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "ici" , + &inxpec,&corEsperada, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; + + CondRetObtido = DADPtn_DobrarDado(P[inxpec],corEsperada); + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar a peca." ); + + } /* fim ativa: Fim Dobrar Dado */ + + /* Testar Dadoponto Valor Partida */ + else if ( strcmp( ComandoTeste , OBTER_VALORPARTIDA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "iii" , + &inxpec,&valoresperado, &CondRetEsperada ) ; + if ( NumLidos != 3 ) + { + return TST_CondRetParm ; + } /* if */ + if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; + + CondRetObtido = DADPtn_ValorPartida(P[inxpec],&ValorPontos); + + Ret = TST_CompararChar( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar a peca." ); + + } /* fim ativa: Fim Dobrar Dado */ + + + + + return TST_CondRetNaoConhec ; + + } /* Fim função: TPec Efetuar operações de teste específicas para DadoPonto */ \ No newline at end of file diff --git a/tabuleiro/ArcaboucoTeste.lib b/tabuleiro/ArcaboucoTeste.lib new file mode 100644 index 0000000000000000000000000000000000000000..41ba1990924bce9779c6bdfa6b21565e71e10993 GIT binary patch literal 89288 zcmeEv3w%`7wf7z}gn*F*jf#jmU=S39Boh+C!zScGf*}MFf(j%I$%G7sOq|RhDq=81 z2}7#3YHe#c#Ma99Uu&JS&p9*0!%FY{ zzVFuqbMilHuf5jVkF(D{`|P#%sOi2?W6RY;CV8Akc5ZHVR$gvSf!9gTGA?uS3Jkb( zh*Bz`RK|-+UG-zuc4y2 zsVMr+I@{d)lgJf z+c3)?@`XwQ9pMFSf#zUnrQb#_3;A!1_}dx-J{z&xA6gj+`x{Y97J8eTv+RdS&&_ITZf?6wgsMZq)q$0gV_IXSKTh4;Ww6OqR2&S2{K!P zIoDJ1o5>PG93(cu$oVQ?(8}~C6n}9^X#=NJDikNCs5RIKYY>QvSG3C429-u0o7Ij& zihZqM6s{6~bD%8{stvRU?JT7&a>X@5I7?dtoVZH-3A1SsRl2&dH4+F3vn{VVD6q^7 zF(j-eN^P(y*dY<9HVLP`F`P1R6HqyW$4WfsSSV;_yEDwJVGj9hu`gu5qe!Gdp5tE` z3}{G3eH`J%sI9^oP+k>XXJq`!|Y@fUtEYiBP!Z_bnh7%GN&VO zi;-?FVi-}ipt4d7GbyO64vXUHMs+ZRa(FeWlRsd_bY?a))cRKX+FF8jzE*AlkP$+T zsUJe58;F%O2F(gFA8nAXT;~0duvGL-A*qnWX<}`J>TzZ1{Dz`sp+Kl8bYlehQ_~m< zw1pjHsnt;bMrknpEizgd-s|uq4CQP*X$RhFWR{ zthVby`&1cdYw_7_0ZnT$VhL$waSJugB;O#E1S88@QMfh|G&`=Vg7hS?G1P=ZfwtvB z;+!WAWQpAbp+{D-ZH5iiXq<4naAG7jir1bNvw(C)$TLJgBn+S$YG>9o6yq)l)%uqC zTajZ#D8chAguCBPGa7`Nz{+L8RulvARkU@W0Sq~4XqFn0^)_NnZ9`E97?BsXz%aX= zigac$h&$3wku0@S%o=2;m9++aF`_u1?L6k);FNDtt0J5Ln=NKJhzvXuLuJ0!79Vok zq)@vQs_}Pp_=5bjmk_CkVr991HDw>98nrWo7I-z~6i8LUuskSOuF$w(QP`D1)Bs{) z0@vbT>FTh*4Z3UrXe)|+9l;Kpdb4Vn)w*=GzY)C%uHafA;+ctA=?k=}PuzQ*oTGcM zgVB9`F+-_8U!~OEVx?BiR%&9mQjhFV>hX`1y2tHO_f@*6i>s21e*@L0`{!1t_iuo5 zspQl8H%OWPQq<}EOXidewsqIeSl8~K4}0kz{_|mvwuX8q<}Gb?0{-8B*#Gl=nCnQNPm6Z|VT?JNW;feYq2L=s)RT5%&oL zZQ)RRV_SG)aM=p#AL4Qj-8CxXdf#?~rux`IkkOXV#b@_W&%4;VV?>Gbe_cd|{u-rBo_-4#)9j z6;5=rsTJV)V1N~mP@&4|o4Bl_!%mG6#X+4ay>DXJzdCGVe0q>lKDSa?sX|V%)4_F^yL6X<0DRxOnce75;Fr zW3jz#)l@Zom>R9n0Vd0Wt6ci;oIqnJ*b!_Fd&bSb!ZWu$jM1Q5@N(**_q9MPUdWZ2 zfe|HhShCR?IaD(+ipN7pHsXwsIhf|N2Gd9eMA_KXjO9EKX(y=}x6lAun8uS5&`pxI zN955c9?9pIOXgw93=>+>)C@n5ADAI(Mq6a18I17`rQ?KoBvH*+WsdV1QQA6Gaj>l^ z@W!h_Pm|w+LEvDhE$H!wFu>}Ys5awshJ8Hp3l_@c7Jp-)DLB=mMvv)0{ZMMus8Obj zpvXW^-9w?CH>Y~WG7`Yiid5sxL?R51_hLTPw7KP42|bmI6Ze=Ak%-uiQrQd^)) zd3W`!&pd*wn!4x@GVx-lenjNxZtqJQ)29xLjF|eX@Hrc+T~p_|B160S26XKhF!fiF z*Svj)2VT_I_5AT^{gIWuC7G$!y_K06^I9lw&*IGChX{1-O6@x4x-Df7!rwoB{P>i` zndxC7tr^r?o0&fUu&c)4b92P%Xh~*9wHdX3QFIeq=H1Vvb-T#ue#5-eHLetPrE0q} z4B;uPk1wLIqEI*1RWj+kg5W`WDW{y#@rEU5QO0i&ZW=h(o$v|WVCs1sm zob1}=KEs(A@xz`JXZ3O#_1MRzQJaCNX0cIbnYyW3rJrWC>isfR+|$jk|BcEO@yYGB zDKiBXN!M)q9hbK03x7jK+?VMFM|@tK>09g)u8F6rhNqjSXI9!0)X|iA$O_7=`J5MQ zEjLXA(z@F|LPo8(GD@mR6cw9lvU!i4qFK1-G}D&W{WEG8q+A@vP}7js{mNgpF@_yS zU`5x*e~!$wTkh`N#0E>*b8>X;?kzj}1Wg!Au!~8li_aEQPWqWD&DnhOI@EGfkN)NO zaf^!lPCebs?rq9E?fY{!w`Z0fX@k?cS39)-IknAN$ae`dXykY^_dI)uNj+ zkKyrGzsS3PJN~Le)J_?XM0BB51%Aou5}Z>QU61pHj2dw+$1g)gah}EK^Ei*dFIjyR zXX<2UsPE#8!DpbK;yf6?Wc4o27cu%P&LSlVUGL#cO93hc%24M5iImHML`n`2P0mPG zHvo-f)D9$4dNto>pc0nyLrvSQX)kHo8$f5VluX>q7c;sFNaR%lQRHrd}ZU>@Qjb!yBpi3F;1QIE)0C|}92GC5P4D~*cNJ&A)iCiSHdNDys16|FbTXpD@K=cljtUd&~jM2wHV!`lk8NCT4I^GAmlKK7u zG@j9MpaSMgPsZCY)6N4DDHj2Wlq?{TG9Bn#=DQIHpInggRX}3tT|nqVgSH813Q&gn z0#F&F$ACo2HXwYm0pEWE(VKX(`ZJJ78Hn34i)llE@;UB#KxK@^0g04cp!1k72$anz z3?x#zfpVC(5h#!2-VY>F9t9F9yEFoeqPOY4;jc@bk6NqLWc&uH!bZGsPQ=T|s>jsv z2bi>7aZYS7f^-xgS>#J1D=! z)ejt$!?@b(pdh2w^A5@gP!2gLxu6`=6#IAzFD6S}~thl~tenauxs@kHGx${dgCuB|u z<{p&JpHoqlAYgv!tcsf2`3Na0UNC1tB}I}b^pzu4%&hrEbqR!AUrGXEnVr;z5{MSb zVyF>eR_Pp}Ru^d@nl^VP3>U$gR(fs4%!*i|Fjg&qteBKbNbTI(qRJRSb*1ww$|{OY z%V(8V8JUGauBQ3^a4C-g(j3tf&mW~AJt4{*9K-itkogOdN#faQHaezqU|@_xd7MpV zha{M8!cy#0OJe7r#HkW3G}noz;mJH#;*wcaF+|5~Mv3Ym@uV?CPCUsJ6Q=BGAT6J0 z=B0euky%7M^~bW4XUy7#Ta&G1{un;9H#Br$noKAVzPX_>7`!3iSA}*GMnZ2e0t$1L zjGp_OPWQ{m`gxTw!vRU3?A#F0SR~mpFPZ+vOXP_ttE@aO#N2i1jbwGs$(Xsn^qI zk{tuOb`Dto5S9XIG0S+_!llIV>|IYz?LPoVU4(_4(eFSl)s(j0tCMc&aHl8VA0 zQL6{PKBdZAk;U$6mdP4Sm0!en0Z|E)y7%3jOP>?$pDvI$!yS2(5ufK`s#z$hCouJ% z)6bs7w!V#_du{9K={#MPbGQod=K~hZYRr-F2=rRD4rL?X$n?PEr>_o))B87!z+2Xk z1=dLL3G(=K(>sIZTEbBsILWpeVh(tx#+SEokDacvnF;T&wC;RzZeC9MRIKeGlVAFV&T_Y0ReKiR7GH}P1Du1VxPbljT#C~jE zf57&!xw|iN0heHWX`$leI>yGS6{VN)V*HYMuselOHO?0>T7dIR{4!J<&Lxc2;9SJ0 zSJNH<8jN4EdKzaMqDof3##!RN3RH++2DhU!4EFkLfC96W95sXTK zL`ofy49+$HUBscyKr(O|0TL-|fv7*2tiBI4lF@b`k+KhHI%pY+hRrYL&{u$DK$NEU z$PoDvpsCE~8emEu0wlxX!+=DuM~7YkB!lk_KpvLd1T>SSM1W)<(jb`*apqVV?U7#t9{t9#%hYr9CwMZETBvM8I$*?&MzGpIDEs#i|A@?y% zTLC1)uMr@TvK~mJ^a9DS`A>l^=NLPI#xmLiBsugnkVv7S`EeZjB9IKp9t5I6)(rIy zkVyUu5Dg6^t4VI9u3(f4B=*e*%HTw69A6L5^l!LgUpQYz=#yGHe!>$!Y)r44bUgjg zb5zBQ!<-UGd0-BCdU@c|PRZwwgf>b+7T=e4ikIt+oidqgh@CQphu$s9l&oxZEi~IH zIf~j;JH@LyV<>rQa|~q)560VKWoN5roIKfHZiVeUdFrDW9<(ROCmT;rcFe%-l$;z@ z9mC^QwK0@Db*+=)%~mupYm@BFQ%jwc+$`0kDfZ!B+)5Zeq&un>=s#ZEH41->V;W-6 zF;JO9o}^h0ld>|7vM!GDU>xNM2j%Y{06ylBLzblvFbq_th4j3TgD4Fhi3XdeJ9vou zx;V;;ILgL2%0qFK@5E8|#8F<<6a@?Ecw1A*X8Ulj49`=Wu9MC&=!3A~n`ZY=EneBA ztkKB05FSdb;z131%We#Iu)k{uN3#X;tGdAv8-~%nkk2C8S&L+Z#0rEedM9RrjBMH| zl`@nO=i1BcMxeu3dw}I9Y-ylZX$)s@RKtZ|RJT-z0xRKB>#OtMate=s^4p1XqNYL0 zxKURy8b(^SVEEJ`i|zIdasKh;p2CyK9zpy-$!a|$EH^1JIUI zx0nw5*J!$?Z_%G>OgCl>b~5f`8q+;y-15{ZO*95u4LZ%-=%c4F4r;h*4A%aYo9Ogv z@vgx`*K`!77ZxVsqwb;oAU@CEH;a88!RVz)bYCu5jp)O{C>ZW<0S2_zs@j3%-PS()rRiqGq}X`z7+4i z?!L9>kc?>=pItksXxiR2N9+5eJL>!AvE-_*k6ml(ddpl3qiZrVNXg+8nICEzSCW|m zy(#hL{r*LaFR?Mvj3=V0cOA!NPsUw6sZWs5+jca-LaKU$@yp;BChA&e@Qf6p(aWIF z=sSm?I-v8IZyBGdTfY&A`o085QD8ug8P%qvHs@ zA*;UQ|5^AyIzPqM63~s9QRtwuqS(S?Z!<_SEaHJZc5~Q53SMmR&>zv(tSKIY5&~s2equ8P--X{Zn(`13 zFWh5WL*j()-k;RNs-d|x9O>|*m(|c54z}hrU@-)naC=WcuN`Dt52%qGHO$YCXnIfO zo0Xkgke>rSyKmNG6XC0mG}4jiX=T2M2?x#zzCdmQ`E-1O1`H7yAn?X-Tb$sM1 z;iIQGJtdK0e~)k0?TB9V_deBh*?zib+MM^Au%v~DrHKO$7J6v%dD>nLdYXd)kL9-2 zgl|OnKxeG^@dggk3vS^FP^6bL5 zs8xOs{L=7k3SY>46qUYD@fT7LzV8JiSiFTKE7cf`U|kgcP-xm=H#dU>y3CgQ4(jDiVcIxxPLl^d8eCM!oyR}q@3PmnX|j2y_HNs~Obyw!GeOfbF& z!fguX5Z{?N_^~)-OvmCejbmD=m8S7pvY{-n(w-moT48$Pkr`*sjx&*(Nt4)qd;Zy~ zaKbua@`_U$)pcD7jWknsvS{W}3AJegR6;)UcBkwi* z7yma8`KNJRK3P0spj(FS1H+|{<9LRgJ(wCDdMG8T!=wX2sF!HK#uQ9hRKIwMS;#}? zw)5BikjICmgO)|u12NFnNK2=M;l4)|Y>2r288^KL?Es~lX7pHT=6YC$mFaw8YB!A7 zZSYKAJcF}mqGz8`T@$tiv`!JFizSm|U{j>M6$_!^-iI1p_0d{zl~3!<%=Dbc5Tt6he_R7&CceUT5x??i|C zJn}b79oPBc#Bh7(hl|4l%e(t-{}Xy3^s&76;Y

(+lxk=fk>%<99^g>Amgv#<{Lp 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 +#include +#include + +#define DADO_OWN +#include "DADO.h" +#include +#undef DADO_OWN +#define RAN_MAX 0x7fff + +/*************************************************************************** +* +* Função: DAD & gerar o numero de casas que devem ser puladas com 1 dado +* ****/ + + +/* Funcao do Modulo */ +int dadorand(void); + + +/* fim funcao do modulo */ + +DAD_tpCondRet DAD_NumPular(int *NumeroCasas) +{ + *NumeroCasas = randint(6); + + return DAD_CondRetOK; +}/*Fim da função DAD_NumPular */ + +/* Função usada pelo módulo */ + + +/* Returns an integer in the range [1, n]. + * + * Uses rand(), and so is affected-by/affects the same seed. + */ +int randint(int n) { + int r; + if ((n - 1) == RAND_MAX) { + return rand(); + } else { + // Chop off all of the values that would cause skew... + long end = RAND_MAX / n; // truncate skew + assert (end > 0L); + end *= n; + + // ... and ignore results from rand() that fall above that limit. + // (Worst case the loop condition should succeed 50% of the time, + // so we can expect to bail out of this loop pretty quickly. + while ((r = rand()) >= end); + + r = (r|time(NULL)); + + return (r % n) +1; + } +} +/*********** Fim do módulo de implementação: Módulo Dado **************/ + + + + + + + diff --git a/tabuleiro/GENERICO.H b/tabuleiro/GENERICO.H new file mode 100644 index 0000000..c9d2692 --- /dev/null +++ b/tabuleiro/GENERICO.H @@ -0,0 +1,588 @@ +#if ! defined( GENERICO_ ) +#define GENERICO_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTG Controlador de teste genérico +* +* Arquivo gerado: GENERICO.h +* Letras identificadoras: TST +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* O módulo de teste genérico contém um conjunto de funções de +* coordenação, apoio e controle da execução de testes de módulos +* quaisquer. +* +* Embora na prática a função de teste específica seja uma extensão da +* função de teste genérica, a função de teste específica encontra-se em +* outro módulo. Desta forma as alterações necessárias para cada +* módulo a testar concentram-se exclusivamente naquele módulo. +* +* $EIU Interface com o usuário pessoa +* Os seguintes comandos genéricos estão definidos: +* +* linha em branco - faz nada +* +* // - comentário, é impresso no LOG +* +* == - título de caso de teste, o título é impresso no LOG +* +* =recuperar +* - Caso o comando imediatamente anterior ao comando +* =recuperar retorne TST_CondRetOK, obviemanete o comando +* executou corretamente, portanto o comando =recuperar +* reportará uma falha no script de teste, uma vez que não +* foi encontrada a falha esperada ao executar o comando. +* - Caso o comando antecessor retorne TST_CondRetErro, +* ou TST_CondRetParm (erro de parâmetros do comando) +* a falha reportada será desconsiderada, uma vez que +* era esperada. O comando =recuperar destina-se a +* apoiar o teste da corretude dos validadores de +* parâmetros dos comandos e das funções por eles +* ativadas. +* - caso o comando antecessor retorne outras condições, o +* comando =recuperar será tratado como falha. +* +* =bkpt - permite interagir com o depurador utilizado para +* desenvolver os módulos sob teste. O comando =bkpt +* executa um código "dummy" no qual pode ser inserido +* um "breakpoint" do depurador. Desta forma o teste pode +* prosseguir sem interrupção até o comando =bkpt. +* Para isto +* - apague ou desative todos os breakpoints do depurador +* - insira o comando =bkpt no script pouco antes do ponto +* de interrupção desejado +* - usando o depurador, estabeleça um breakpoint na linha de +* código: "Dummy = 0 ;" contida no módulo de teste +* genérico. Esta linha pode ser encontrada +* procurando por "BKPT_CMD" +* - dê partida no programa e espere até chegar ao breakpoint +* associado ao comando "dummy". Agora reative ou instale +* os breakpoints requeridos pela a sessão de depuração. +* e continue depurando +* +* =cancelar +* - termina a interpretação dos comandos de teste. +* Sempre sinaliza falha. +* +* =AceitaFalhasAcumuladas numFalhas +* - caso o contador de falhas registre numFalhas, ele será +* tornado zero. Este comando é similar a =recuperar. +* Difere deste por ser executado desde que o comando +* anterior não tenha reportado erro, tal como acontece +* com todos os comandos, exceto =recuperar. +* O comando permite recuperar falhas sinalizadas por +* módulos de apoio, tais como, leitor de parâmetros, +* contador de passagens e controle de espaço dinâmico. +* Caso o contador de número de falhas contenha um valor +* diferente de numFalhas, será reportado um erro e +* o contador é incrementado de 1. +* +* Os demais comandos são passados para as funções de teste específico. +* Primeiro para as do arcabouço, depois para a específica do módulo +* a testar. A última função de teste específico deve retornar a condição +* TST_CondRetNaoConhec caso não consiga interpretar a diretiva. +* +* $EIM Interface com outros módulos +* A primeira função do arcabouço ("framework") a ser chamada deve a +* sempre ser TST_InicializarTeste. Caso não o seja, ocorrerão erros +* de execução (assert). +* +* Após abra o arquivo de script executando a função +* TST_AbrirArquivoScript. Se for desejado gerar um log abra +* o arquivo corresponente com a função TST_AbrirArquivoLog. +* +* Depois de abrir os arquivos, execute os testes chamando a função +* TST_RealizarTeste. A função de teste genérico lerá todo o arquivo +* de script, retornando após concluir o teste. +* +* Após, termine o teste através da função TST_TerminarTeste. +* Esta função exibe as estatísticas do teste e, caso solicitado, +* acumula essas estatísticas em um arquivo acumulador (ver +* parâmetro /a do programa principal. +* +* As funções "TST_ObterXXX" podem ser utilizadas antes de fechar o +* módulo de teste para exibir o resumo do teste no módulo cliente do +* módulo de controle genérico. +* +* O programa cliente do módulo controle de teste genérico pode +* efetuar as operações acima repetidas vezes, permitindo, assim o +* teste envolvendo diversos arquivos scripts de teste. A saída +* de cada teste deve ser dirigida para um log específico, ou para +* stdout, uma vez que, ao abrir um arquivo log, o seu conteúdo será +* sempre destruído. +* +* O módulo de teste genérico também implementa diversas funções +* de comparação "TST_CompararXXX" use-as no módulo de controle de +* teste específico. Desta forma será assegurado o tratamento uniforme +* de todas as falhas possivelmente encontradas. +* +* O módulo disponibiliza ainda a função TST_ExibirPrefixo +* que gera uma linha de saída obedecendo aos padrões de interface +* estabelecidos. Sendo desejado pode-se adicionar textos à linha +* usando a funcao fprintf( TST_ObterArqLog( ) , ... ). Um exemplo da +* utilidade disso é quando se deseja imprimir informação complementar +* ao interpretar uma determinada diretiva. A função TST_ObterArqLog( ) +* retorna a referência ao arquivo log em uso no momento. +* +* Finalmente, o módulo disponibiliza a função TST_NotificarFalha +* que incrementa o contador de falhas além de emitir uma mensagem +* de erro. +* +***************************************************************************/ + +#if defined( GENERICO_OWN ) + #define GENERICO_EXT +#else + #define GENERICO_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#include "TST_Espc.h" + + +/*********************************************************************** +* +* $FC Função: TSTG &Controlar uma sessão de teste +* +* $ED Descrição da função +* Esta função é o ponto de entrada para a realização do teste. +* Permite que se adicione o arcabouço de teste a um sistema qualquer. +* +* $EP Parâmetros +* $P NomeConstrutoParm +* $P NomeArqScriptParm - deve ser não nulo +* $P NomeArqLogParm - se for nulo, gera a saída na console +* $P NomeArqAcumParm - se não for nulo, acumula as estatísticas no +* arquivo denominado +* +* $FV Valor retornado +* 0 - se o teste ocorreu OK +* 4 - se foram observados erros de dados ou falhas nos testes +* +***********************************************************************/ + + int TST_ControlarSessaoTeste( char * NomeConstrutoParm , + char * NomeArqScriptParm , + char * NomeArqLogParm , + char * NomeArqAcumParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar booleano +* +* $ED Descrição da função +* Compara valor booleano esperado com valor booleano obtido, +* reportamdo uma falha caso não sejam iguais. +* Note que "!= 0" corresponde a TRUE e "== 0" corresponde a FALSE +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for consistente com o obtido +* TST_CondRetOK se os valores forem consistentes +* +***********************************************************************/ + + TST_tpCondRet TST_CompararBool( int ValorEsperado , + int ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar caractere +* +* $ED Descrição da função +* Compara um caractere esperado com um caractere obtido, emitindo mensagem de +* erro caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararChar( char ValorEsperado , + char ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar inteiro +* +* $ED Descrição da função +* Compara valor inteiro long esperado com valor inteiro obtido, +* reportamdo uma falha caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararInt( long ValorEsperado , + long ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar flutuante +* +* $ED Descrição da função +* Compara valor flutuante esperado com valor flutuante obtido, +* reportando uma falha caso +* 1 - Tolerancia > esperado / obtido ou +* 1 + Tolerancia < esperado / obtido +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* Tolerância - indica os limites da relação entre esperado e obtido. +* Deve ser um valor positivo, menor do que 1. +* Use um valor do tipo 10 ** -n, no qual n é o +* número de dígitos significativos desejado. +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor obtido não estiver dentro do domínio da +* tolerância em torno do valor esperado +* TST_CondRetOK se os valores estiverem dentro da tolerância +* +***********************************************************************/ + + TST_tpCondRet TST_CompararFloat( double ValorEsperado , + double ValorObtido , + double Tolerancia , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar string +* +* $ED Descrição da função +* Compara string esperado com string obtido, reportamdo uma falha +* caso não sejam iguais. Ambos os strings devem obedecer o +* padrão C, terminando em zero. +* +* $EP Parâmetros +* ValorEsperado - é um string fornecido como parâmetro do comando +* de teste. +* ValorObtido - é o string retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararString( char * ValorEsperado , + char * ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar espaço +* +* $ED Descrição da função +* Compara espaços de dados, reportando uma falha caso não sejam iguais. +* Esta função pode ser utilizada para comparar qualquer coisa, +* inclusive valores do tipo "struct" +* O tipo do valor é indefinido e os valores serão exibidos em +* formato hexadecimal, caso não sejam iguais +* +* $EP Parâmetros +* ValorEsperado - ponteiro para o espaço que contém o valor esperado +* ValorObtido - ponteiro para o espaço que contém o valor obtido +* TamEspaco - tamanho do espaço a ser comparado +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , + void * ValorObtido , + int TamEspaco , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro +* +* $ED Descrição da função +* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro nulo +* +* $ED Descrição da função +* Verifica +* - quando ModoEsperado == 0 se o PonteiroObtido é nulo +* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Assertiva controlada +* +* $ED Descrição da função +* Esta função substitui a função assert de C. +* É utilizada no contexto do arcabouço de teste. +* Ela imprime mensagens mais visíveis tanto no log como na +* janela de comando. +* +* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. +* +* $FV Valor retornado +* Termina a execução do programa com código de retorno == 4 +* +***********************************************************************/ + + #define TST_ASSERT( Expressao ) \ + TST_Assert( Expressao , __LINE__ , __FILE__ ) + + void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir prefixo da mensagem +* +* $ED Descrição da função +* Imprime o prefixo de mensages de falha ou de informação. +* Não incrementa o contador de falhas. +* Esta função estabelece o padrão de saída das mensagens geradas +* durante os testes. +* +* $EP Parâmetros +* $P Indicador - informa a natureza da mensagem, +* Utilize preferenciamente as constantes definidas em +* TST_ESPEC.H: +* SINALIZA_ERRO ">>>" +* SINALIZA_RECUPERA "<<<" +* SINALIZA_COMENTARIO "!!!" +* $P pMensagem - é a mensagem prefixo a ser gerada. +* +* $EIU Interface com usuário pessoa +* Podem ser acrescentadas mensagens ao prefixo. A função +* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso +* (stdout ou definido pelo usuário) +* +***********************************************************************/ + + void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Notificar falha +* +* $ED Descrição da função +* Exibe uma mensagem de falha no formato padrão do arcabouço. +* A função não exibe os valores esperado e obtido. +* +* $EP Parâmetros +* $P pMensagem - mensdagem explicativa da falha. +* +* $FV Valor retornado +* TST_CondRetErro sempre +* +***********************************************************************/ + + TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Incrementar contador de falhas +* +* $ED Descrição da função +* Esta função deve ser usada quando, por alguma razão, precisar-se +* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. +* As outras funções (comparação, TST_NotificarFalha, etc.) +* incrementam o contador automaticamente. +* +***********************************************************************/ + + void TST_ContarFalhas( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de casos de teste efetuados +* +* $ED Descrição da função +* Retorna o número de casos de teste lidos. +* Cada caso de teste inicia com o comando "== ". +* +***********************************************************************/ + + int TST_ObterNumCasosTeste( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados +* +* $ED Descrição da função +* Retorna o número de comandos de teste específicos lidos e +* corretamente interpretados. +* Não conta comandos que retornem não OK independentemento do motivo, +* inclusive os comandos saltados após uma falha. +* Também não conta comandos recuperar. +* +***********************************************************************/ + + int TST_ObterNumComandosExecutados( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de falhas encontradas +* +* $ED Descrição da função +* Retorna o número de falhas encontrados. +* O módulo de teste específico sinaliza falhas através de +* uma condição de retorno diferente de TST_CondRetOK. +* Além de comparações em erro, são tratados como falhas: +* - comandos de teste em erro, +* - comandos de teste de um dado caso de teste ignorados (saltados) +* - erros encontrados nos instrumentos +* - erros de sintaxe dos comandos de teste +* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. +* Portanto, é possível que o número de falhas venha a ser maior do +* que o número de casos de teste existente no script. +* +***********************************************************************/ + + int TST_ObterNumFalhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter origem do nome da extensão de arquivo +* +* $ED Descrição da função +* Procura o início do nome da extensão contido no nome do arquivo +* dado por parâmetro +* +* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". +* Isto pode confundir no caso de se desejar a adição de algum nome +* de extensão padrão. +* +* $EP Parâmetros +* $P NomeArqParm - nome de arquivo a ser analisado +* +* $FV Valor retornado +* Ponteiro para o caractere '.' que separa a extensão. +* Será NULL caso o nome do arquivo não contenha extensão. +* +***********************************************************************/ + + char * TST_ObterInicioExtensao( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter ponteiro para arquivo LOG +* +* $ED Descrição da função +* Retorna o ponteiro para o FILE do log em uso no momento. +* Será stdout caso não seja definido explicitamente ao chamar a funcao +* TST_ControlarSessaoTeste +* +* $FV Valor retornado +* Ponteiro válido para um arquivo de texto de saída +* +***********************************************************************/ + + FILE * TST_ObterArqLog( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char +* +* $ED Descrição da função +* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém +* uma coluna em hexadecimal e outra em ASCII +* São exibidos 16 bytes por linha. +* +* $EP Parâmetros +* $P tamEspaco - tamanho em bytes do espaço a exibir +* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir +* +***********************************************************************/ + + void TST_ExibirEspacoHexa( int tamEspaco , + void * Ponteiro ) ; + +#undef GENERICO_EXT + +/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ + +#else +#endif diff --git a/tabuleiro/LERPARM.H b/tabuleiro/LERPARM.H new file mode 100644 index 0000000..f12cf3d --- /dev/null +++ b/tabuleiro/LERPARM.H @@ -0,0 +1,463 @@ +#if ! defined( LerParm_ ) +#define LerParm_ +/*************************************************************************** +* +* $MCD Módulo de definição: LER Ler parâmetros de comandos +* +* Arquivo gerado: LerParm.h +* Letras identificadoras: LER +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Provê funções para a leitura e análise léxica dos comandos de teste. +* Pressupõe-se que cada comando de teste esteja integralmente em +* uma linha. +* Cada comando de teste inicia com o caractere '=' seguido de um string +* que identifica o comando. +* Cada comando pode requerer zero ou mais parâmetros que se encontram na +* mesma linha que o comando. +* Parâmetros podem ser literis ou simbólicos. +* Os parâmetros simbólicos precisam ser declarados antes de serem +* utilizados. +* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. +* +* Se for do interesse do programador, módulos de teste específico +* podem ler e processar por conta própria linhas do script. Isto +* pode ser necessário quando um módulo necessita de um grande +* número de parâmetros ou de dados especiais. +* +* $EIU Interface com o usuário pessoa +* Este módulo interpreta os comandos de teste globalmente disponíveis: +* +* =declararparm +* declara o parâmetro do definido com o valor +* pode ser um de: +* i - inteiro (long) +* f - flutuante (double) +* c - caractere +* s - string +* O valor de literal tem que estar em conformidade com o tipo +* +* =exibirdeclaracao +* exibe a declaração do parâmetro em formato "dump de memória" +* +* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. +* +* Estes comandos sempre estarão disponíveis. Os demais comandos de +* teste estão impementados no módulo TESTLER específico para este módulo. +* +***************************************************************************/ + +#if defined( LerParm_OWN ) + #define LerParm_EXT +#else + #define LerParm_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define LER_DIM_NOME 32 +#define LER_DIM_STRING 500 +#define LER_DIM_BUFFER 250 + + +/*********************************************************************** +* +* $TC Tipo de dados: LER Condições de retorno +* +* +***********************************************************************/ + + typedef enum { + + LER_CondRetOK , + /* Ler retorno OK */ + + LER_CondRetNaoAbriu + /* Ler não abriu arquivo */ + + } LER_tpCondRet ; + +/***** Dados exportados pelo módulo *****/ + + /* Estrutura de dados: *LER Dados globais públicos */ + + LerParm_EXT int LER_TamBuffer ; + /* Tamanho do string contido no buffer de leitura + * + *$ED Descrição + * Contém o número total de caracteres do buffer, excluindo o zero. + * Jamais altere este valor. */ + + LerParm_EXT int LER_InxBuffer ; + /* Cursor do buffer de leitura + * + *$ED Descrição + * O cursor de leitura indexa o primeiro caractere não lido contido + * no buffer. + * O cursor é zerado sempre que uma nova linha for lida. + * O cursor é avançado ao ler um parâmetro, sendo colocado no + * primeiro caractere imediatamente após ao parâmetro lido. + * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ + + LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; + /* Buffer de leitura + * + *$ED Descrição + * Contém a linha corrente do script a ser processada. + * Jamais altere o valor do buffer. */ + + +/*********************************************************************** +* +* $FC Função: LER &Inicializar módulo LerParm +* +* $ED Descrição da função +* Inicializa o módulo. +* Deve ser chamada antes de iniciar a análise de comandos. +* Deve ser chamada uma única vez no início ou após terminar o módulo. +* +***********************************************************************/ + + int LER_InicializarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Terminar módulo LerParm +* +* $ED Descrição da função +* Fecha o arquivo de leitura e sinaliza módulo de leitura não +* inicializado. +* Após esta função somente poderá ser chamada a funçãp +* LER_InicializarLeitura +* +***********************************************************************/ + + void LER_TerminarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter nome do arquivo script +* +* $FV Valor retornado +* Retorna o ponteiro para o nome do arquivo script sendo processado. +* Deve-se tomar cuidado para não alterar este nome. +* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. +* +***********************************************************************/ + + char * LER_ObterNomeArqScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter número de linhas lidas até o momento +* +***********************************************************************/ + + int LER_ObterNumLinhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Abrir arquivo script de teste +* +* $ED Descrição da função +* Abre o arquivo que contém o script de teste. +* A extensão default do arquivo de comandos script de teste é +* ".script" e será acrescida ao nome do arquivo caso este não +* contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo contendo o script de teste +* +* $FV Valor retornado +* LER_CondRetOK - caso tenha sido possível abrir o arquivo. +* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. +* Não há discriminação do erro encontrado. +* +***********************************************************************/ + + LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha script eliminando brancos ao final +* +* $ED Descrição da função +* Lê uma linha do arquivo script e elimina os caracteres branco, +* fim de linha, tabulação etc. do final da linha lida. +* +* $FV Valor retornado +* Retorna o tamanho da linha lida. +* Será: +* -1 caso tenha ocorrido fim de arquivo. +* -2 caso tenha ocorrido algum problema de leitura. +* +***********************************************************************/ + + int LER_LerLinhaScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Interpretar comandos de teste +* +* $ED Descrição da função +* Interpreta os comandos de teste disponibilizados pelo módulo +* de leitura. +* +* Ver a descrição do módulo para mais detalhes +* +* $EP Parâmetros +* $P - Comando de teste a ser interpretado +* +* $FV Valor retornado +* TST_CondRetOK - caso tenha interpretado corretamente +* TST_CondRetNaoExecutou - caso o comando de teste a interpretar +* não pertença ao conjunto de LER +* TST_CondRetErro - caso o comando de teste é do conjunto de LER +* e está sintaticamente errado. +* Neste caso é gerada uma mensagem de erro no +* log. +* +***********************************************************************/ + + TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Declarar parâmetro simbólico +* +* $EP Parâmetros +* Interpreta uma linha de comando de teste contendo uma declaração de +* nome simbólico. +* Todas as declarações têm o formato: +* =declararparm +* em que o deve estar consistente com o +* São geradas mensagens de erro no log de teste caso a declaração +* não possa ser realizada. +* +* $FV Valor retornado +* TRUE - se a declaração ocorreu +* FALSE - caso contrário +* +***********************************************************************/ + + int LER_DeclararParametro( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Exibir declaração de símbolo +* +* $ED Descrição da função +* Exibe o Símbolo e o valor associado ao símbolo, sendo que este +* é exibido em hexadecimal. +* +***********************************************************************/ + + void LER_ExibirParametro( char * Simbolo ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha de parâmetros +* +* $ED Descrição da função +* Lê um número variável de parâmetros +* +* $EP Parâmetros +* $P Tipos é um string contendo a identificação dos tipos dos parâmetros +* a serem lidos. +* $P ... Os demais parâmetros são referências (ponteiros) para os +* espaços onde deverão ser armazenados os valores lidos. +* +* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista +* de referência e o string de tipos tenha o mesmo tamanho +* e que os indicadores de tipo sejam consistentes com a referência +* posicionalmente correspondentes. +* +* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já +* declarado. Caso isto seja possível e o tipo esteja correto +* é "lido" o valor contido no parâmetro. +* Caso não seja possível, tenta ler um literal em acordo com o tipo +* dado. +* +* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada +* e tipo inconsistente com o solicitado no correspondente caractere no +* string Tipos. +* +* $FV Valor retornado +* Retorna o número de campos lidos até concluir ou até encontrar +* um erro. +* +***********************************************************************/ + + int LER_LerParametros( char * Tipos , ... ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro caractere +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do caractere lido +* +* $EIU Interface com usuário pessoa +* Um caractere deve vir entre aspas simples. Valem os caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmChar( char * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro inteiro +* +* $EP Parâmetros +* $P Parm é um ponteiro para um int que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do int lido +* +* $EIU Interface com usuário pessoa +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmInt( int * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro flutuante +* +* $EP Parâmetros +* $P Parm é um ponteiro para um double que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do double lido +* +* $EIU Interface com usuário pessoa +* São válidas todas as formas de literal double aceitas pelo scanf. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmDouble( double * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro nome +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o nome lido +* $P tamString é o tamanho do nome que foi lido +* $P dimString é o tamanho máximo que o nome poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do nome lido +* +* $EIU Interface com usuário pessoa +* São válidas as mesmas regras de nomes C. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro string +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o string lido +* $P tamString é o tamanho do string que foi lido +* $P dimString é o tamanho máximo que o string poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do string lido +* +* $EIU Interface com usuário pessoa +* Um string deve vir entre aspas duplas. +* Um string pode conter caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Pular comando de teste +* +* $ED Descrição da função +* Avança o cursor do buffer de leitura por cima de um comando de teste. +* Todos os comandos de teste principiam com o prefixo '=' +* +***********************************************************************/ + + void LER_PularComando( void ) ; + +#undef LerParm_EXT + +/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ + +#else +#endif diff --git a/tabuleiro/LISTA.C b/tabuleiro/LISTA.C new file mode 100644 index 0000000..2889ad9 --- /dev/null +++ b/tabuleiro/LISTA.C @@ -0,0 +1,560 @@ +/*************************************************************************** +* $MCI Módulo de implementação: LIS Lista duplamente encadeada +* +* Arquivo gerado: LISTA.c +* Letras identificadoras: LIS +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +***************************************************************************/ + +#include +#include +#include +#include +#include + +#define LISTA_OWN +#include "LISTA.h" +#undef LISTA_OWN + +/*********************************************************************** +* +* $TC Tipo de dados: LIS Elemento da lista +* +* +***********************************************************************/ + + typedef struct tagElemLista { + + void * pValor ; + /* Ponteiro para o valor contido no elemento */ + + struct tagElemLista * pAnt ; + /* Ponteiro para o elemento predecessor */ + + struct tagElemLista * pProx ; + /* Ponteiro para o elemento sucessor */ + + } tpElemLista ; + +/*********************************************************************** +* +* $TC Tipo de dados: LIS Descritor da cabeça de lista +* +* +***********************************************************************/ + + typedef struct LIS_tagLista { + + tpElemLista * pOrigemLista ; + /* Ponteiro para a origem da lista */ + + tpElemLista * pFimLista ; + /* Ponteiro para o final da lista */ + + tpElemLista * pElemCorr ; + /* Ponteiro para o elemento corrente da lista */ + + int numElem ; + /* Número de elementos da lista */ + + void ( * ExcluirValor ) ( void * pValor ) ; + /* Ponteiro para a função de destruição do valor contido em um elemento */ + + } LIS_tpLista ; + +/***** Protótipos das funções encapuladas no módulo *****/ + + static void LiberarElemento( LIS_tppLista pLista , + tpElemLista * pElem ) ; + + static tpElemLista * CriarElemento( LIS_tppLista pLista , + void * pValor ) ; + + static void LimparCabeca( LIS_tppLista pLista ) ; + +/***** Código das funções exportadas pelo módulo *****/ + +/*************************************************************************** +* +* Função: LIS &Criar lista +* ****/ + + LIS_tppLista LIS_CriarLista( + void ( * ExcluirValor ) ( void * pDado ) ) + { + + LIS_tpLista * pLista = NULL ; + + pLista = ( LIS_tpLista * ) malloc( sizeof( LIS_tpLista )) ; + if ( pLista == NULL ) + { + return NULL ; + } /* if */ + + LimparCabeca( pLista ) ; + + pLista->ExcluirValor = ExcluirValor ; + + return pLista ; + + } /* Fim função: LIS &Criar lista */ + +/*************************************************************************** +* +* Função: LIS &Destruir lista +* ****/ + + void LIS_DestruirLista( LIS_tppLista pLista ) + { + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + LIS_EsvaziarLista( pLista ) ; + + free( pLista ) ; + + } /* Fim função: LIS &Destruir lista */ + +/*************************************************************************** +* +* Função: LIS &Esvaziar lista +* ****/ + + void LIS_EsvaziarLista( LIS_tppLista pLista ) + { + + tpElemLista * pElem ; + tpElemLista * pProx ; + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + pElem = pLista->pOrigemLista ; + while ( pElem != NULL ) + { + pProx = pElem->pProx ; + LiberarElemento( pLista , pElem ) ; + pElem = pProx ; + } /* while */ + + LimparCabeca( pLista ) ; + + } /* Fim função: LIS &Esvaziar lista */ + +/*************************************************************************** +* +* Função: LIS &Inserir elemento antes +* ****/ + + LIS_tpCondRet LIS_InserirElementoAntes( LIS_tppLista pLista , + void * pValor ) + { + + tpElemLista * pElem ; + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + /* Criar elemento a inerir antes */ + + pElem = CriarElemento( pLista , pValor ) ; + if ( pElem == NULL ) + { + return LIS_CondRetFaltouMemoria ; + } /* if */ + + /* Encadear o elemento antes do elemento corrente */ + + if ( pLista->pElemCorr == NULL ) + { + pLista->pOrigemLista = pElem ; + pLista->pFimLista = pElem ; + } else + { + if ( pLista->pElemCorr->pAnt != NULL ) + { + pElem->pAnt = pLista->pElemCorr->pAnt ; + pLista->pElemCorr->pAnt->pProx = pElem ; + } else + { + pLista->pOrigemLista = pElem ; + } /* if */ + + pElem->pProx = pLista->pElemCorr ; + pLista->pElemCorr->pAnt = pElem ; + } /* if */ + + pLista->pElemCorr = pElem ; + + return LIS_CondRetOK ; + + } /* Fim função: LIS &Inserir elemento antes */ + +/*************************************************************************** +* +* Função: LIS &Inserir elemento após +* ****/ + + LIS_tpCondRet LIS_InserirElementoApos( LIS_tppLista pLista , + void * pValor ) + + { + + tpElemLista * pElem ; + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + /* Criar elemento a inerir após */ + + pElem = CriarElemento( pLista , pValor ) ; + if ( pElem == NULL ) + { + return LIS_CondRetFaltouMemoria ; + } /* if */ + + /* Encadear o elemento após o elemento */ + + if ( pLista->pElemCorr == NULL ) + { + pLista->pOrigemLista = pElem ; + pLista->pFimLista = pElem ; + } else + { + if ( pLista->pElemCorr->pProx != NULL ) + { + pElem->pProx = pLista->pElemCorr->pProx ; + pLista->pElemCorr->pProx->pAnt = pElem ; + } else + { + pLista->pFimLista = pElem ; + } /* if */ + + pElem->pAnt = pLista->pElemCorr ; + pLista->pElemCorr->pProx = pElem ; + + } /* if */ + + pLista->pElemCorr = pElem ; + + return LIS_CondRetOK ; + + } /* Fim função: LIS &Inserir elemento após */ + +/*************************************************************************** +* +* Função: LIS &Excluir elemento +* ****/ + + LIS_tpCondRet LIS_ExcluirElemento( LIS_tppLista pLista ) + { + + tpElemLista * pElem ; + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + if ( pLista->pElemCorr == NULL ) + { + return LIS_CondRetListaVazia ; + } /* if */ + + pElem = pLista->pElemCorr ; + + /* Desencadeia à esquerda */ + + if ( pElem->pAnt != NULL ) + { + pElem->pAnt->pProx = pElem->pProx ; + pLista->pElemCorr = pElem->pAnt ; + } else { + pLista->pElemCorr = pElem->pProx ; + pLista->pOrigemLista = pLista->pElemCorr ; + } /* if */ + + /* Desencadeia à direita */ + + if ( pElem->pProx != NULL ) + { + pElem->pProx->pAnt = pElem->pAnt ; + } else + { + pLista->pFimLista = pElem->pAnt ; + } /* if */ + + LiberarElemento( pLista , pElem ) ; + + return LIS_CondRetOK ; + + } /* Fim função: LIS &Excluir elemento */ + +/*************************************************************************** +* +* Função: LIS &Obter referência para o valor contido no elemento +* ****/ + + void * LIS_ObterValor( LIS_tppLista pLista ) + { + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + if ( pLista->pElemCorr == NULL ) + { + return NULL ; + } /* if */ + + return pLista->pElemCorr->pValor ; + + } /* Fim função: LIS &Obter referência para o valor contido no elemento */ + +/*************************************************************************** +* +* Função: LIS &Ir para o elemento inicial +* ****/ + + void IrInicioLista( LIS_tppLista pLista ) + { + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + pLista->pElemCorr = pLista->pOrigemLista ; + + } /* Fim função: LIS &Ir para o elemento inicial */ + +/*************************************************************************** +* +* Função: LIS &Ir para o elemento final +* ****/ + + void IrFinalLista( LIS_tppLista pLista ) + { + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + pLista->pElemCorr = pLista->pFimLista ; + + } /* Fim função: LIS &Ir para o elemento final */ + +/*************************************************************************** +* +* Função: LIS &Avançar elemento +* ****/ + + LIS_tpCondRet LIS_AvancarElementoCorrente( LIS_tppLista pLista , + int numElem ) + { + + int i ; + + tpElemLista * pElem ; + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + /* Tratar lista vazia */ + + if ( pLista->pElemCorr == NULL ) + { + + return LIS_CondRetListaVazia ; + + } /* fim ativa: Tratar lista vazia */ + + /* Tratar avançar para frente */ + + if ( numElem > 0 ) + { + + pElem = pLista->pElemCorr ; + for( i = numElem ; i > 0 ; i-- ) + { + if ( pElem == NULL ) + { + break ; + } /* if */ + pElem = pElem->pProx ; + } /* for */ + + if ( pElem != NULL ) + { + pLista->pElemCorr = pElem ; + return LIS_CondRetOK ; + } /* if */ + + pLista->pElemCorr = pLista->pFimLista ; + return LIS_CondRetFimLista ; + + } /* fim ativa: Tratar avançar para frente */ + + /* Tratar avançar para trás */ + + else if ( numElem < 0 ) + { + + pElem = pLista->pElemCorr ; + for( i = numElem ; i < 0 ; i++ ) + { + if ( pElem == NULL ) + { + break ; + } /* if */ + pElem = pElem->pAnt ; + } /* for */ + + if ( pElem != NULL ) + { + pLista->pElemCorr = pElem ; + return LIS_CondRetOK ; + } /* if */ + + pLista->pElemCorr = pLista->pOrigemLista ; + return LIS_CondRetFimLista ; + + } /* fim ativa: Tratar avançar para trás */ + + /* Tratar não avançar */ + + return LIS_CondRetOK ; + + } /* Fim função: LIS &Avançar elemento */ + +/*************************************************************************** +* +* Função: LIS &Procurar elemento contendo valor +* ****/ + + LIS_tpCondRet LIS_ProcurarValor( LIS_tppLista pLista , + void * pValor ) + { + + tpElemLista * pElem ; + + #ifdef _DEBUG + assert( pLista != NULL ) ; + #endif + + if ( pLista->pElemCorr == NULL ) + { + return LIS_CondRetListaVazia ; + } /* if */ + + for ( pElem = pLista->pElemCorr ; + pElem != NULL ; + pElem = pElem->pProx ) + { + if ( pElem->pValor == pValor ) + { + pLista->pElemCorr = pElem ; + return LIS_CondRetOK ; + } /* if */ + } /* for */ + + return LIS_CondRetNaoAchou ; + + } /* Fim função: LIS &Procurar elemento contendo valor */ + + +/***** Código das funções encapsuladas no módulo *****/ + + +/*********************************************************************** +* +* $FC Função: LIS -Liberar elemento da lista +* +* $ED Descrição da função +* Elimina os espaços apontados pelo valor do elemento e o +* próprio elemento. +* +***********************************************************************/ + + void LiberarElemento( LIS_tppLista pLista , + tpElemLista * pElem ) + { + + if ( ( pLista->ExcluirValor != NULL ) + && ( pElem->pValor != NULL )) + { + pLista->ExcluirValor( pElem->pValor ) ; + } /* if */ + + free( pElem ) ; + + pLista->numElem-- ; + + } /* Fim função: LIS -Liberar elemento da lista */ + + +/*********************************************************************** +* +* $FC Função: LIS -Criar o elemento +* +***********************************************************************/ + + tpElemLista * CriarElemento( LIS_tppLista pLista , + void * pValor ) + { + + tpElemLista * pElem ; + + pElem = ( tpElemLista * ) malloc( sizeof( tpElemLista )) ; + if ( pElem == NULL ) + { + return NULL ; + } /* if */ + + pElem->pValor = pValor ; + pElem->pAnt = NULL ; + pElem->pProx = NULL ; + + pLista->numElem ++ ; + + return pElem ; + + } /* Fim função: LIS -Criar o elemento */ + + +/*********************************************************************** +* +* $FC Função: LIS -Limpar a cabeça da lista +* +***********************************************************************/ + + void LimparCabeca( LIS_tppLista pLista ) + { + + pLista->pOrigemLista = NULL ; + pLista->pFimLista = NULL ; + pLista->pElemCorr = NULL ; + pLista->numElem = 0 ; + + } /* Fim função: LIS -Limpar a cabeça da lista */ + +/********** Fim do módulo de implementação: LIS Lista duplamente encadeada **********/ + diff --git a/tabuleiro/LISTA.H b/tabuleiro/LISTA.H new file mode 100644 index 0000000..a9f9b84 --- /dev/null +++ b/tabuleiro/LISTA.H @@ -0,0 +1,346 @@ +#if ! defined( LISTA_ ) +#define LISTA_ +/*************************************************************************** +* +* $MCD Módulo de definição: LIS Lista duplamente encadeada +* +* Arquivo gerado: LISTA.h +* Letras identificadoras: LIS +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Implementa listas genéricas duplamente encadeadas. +* Podem existir n listas em operação simultaneamente. +* As listas possuem uma cabeça encapsulando o seu estado. +* +* Cada lista é homogênea quanto ao tipo dos dados que armazena. +* Cada elemento da lista referencia o valor que contém. +* +* Os ponteiros para os dados são copiados para elementos da lista. +* Não é copiado o valor apontado por estes ponteiros. +* +* O controle da destruição do valor de um elemento a ser excluído +* é realizado por uma função fornecida pelo usuário. +* +* Cada lista referencia uma função que determina como devem ser +* desalocados os dados nela contidos. +* +* A função de liberação dos valores contidos nos elementos deve +* assegurar a liberação de todos os espaços referênciados pelo +* valor contido em um elemento. +* Esta função é chamada antes de se desalocar um elemento +* de uma lista. +* Caso não seja necessário desalocar o valor referenciado pelo +* elemento, o ponteiro para a função de liberação poderá ser NULL . +* Caso o elemento da lista seja a única âncora do valor referenciado, +* esta função deve promover a destruição (free) desse valor e +* de todos os dados nele ancorados. +* +***************************************************************************/ + +#if defined( LISTA_OWN ) + #define LISTA_EXT +#else + #define LISTA_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +/* Tipo referência para uma lista */ + +typedef struct LIS_tagLista * LIS_tppLista ; + + +/*********************************************************************** +* +* $TC Tipo de dados: LIS Condições de retorno +* +* +* $ED Descrição do tipo +* Condições de retorno das funções da lista +* +***********************************************************************/ + + typedef enum { + + LIS_CondRetOK , + /* Concluiu corretamente */ + + LIS_CondRetListaVazia , + /* A lista não contém elementos */ + + LIS_CondRetFimLista , + /* Foi atingido o fim de lista */ + + LIS_CondRetNaoAchou , + /* Não encontrou o valor procurado */ + + LIS_CondRetFaltouMemoria + /* Faltou memória ao tentar criar um elemento de lista */ + + } LIS_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: LIS &Criar lista +* +* $ED Descrição da função +* Cria uma lista genérica duplamente encadeada. +* Os possíveis tipos são desconhecidos a priori. +* A tipagem é implicita. +* Não existe identificador de tipo associado à lista. +* +* $EP Parâmetros +* ExcluirValor - ponteiro para a função que processa a +* exclusão do valor referenciado pelo elemento +* a ser excluído. +* Ver descrição do módulo. +* +* $FV Valor retornado +* Se executou corretamente retorna o ponteiro para a lista. +* Este ponteiro será utilizado pelas funções que manipulem esta lista. +* +* Se ocorreu algum erro, por exemplo falta de memória ou dados errados, +* a função retornará NULL. +* Não será dada mais informação quanto ao problema ocorrido. +* +***********************************************************************/ + + LIS_tppLista LIS_CriarLista( + void ( * ExcluirValor ) ( void * pDado ) ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Destruir lista +* +* $ED Descrição da função +* Destrói a lista fornecida. +* O parâmetro ponteiro para a lista não é modificado. +* Se ocorrer algum erro durante a destruição, a lista resultará +* estruturalmente incorreta. +* OBS. não existe previsão para possíveis falhas de execução. +* +* $FV Valor retornado +* LIS_CondRetOK - destruiu sem problemas +* +***********************************************************************/ + + void LIS_DestruirLista( LIS_tppLista pLista ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Esvaziar lista +* +* $ED Descrição da função +* Elimina todos os elementos, sem contudo eliminar a lista +* +* $EP Parâmetros +* pLista - ponteiro para a lista a ser esvaziada +* +***********************************************************************/ + + void LIS_EsvaziarLista( LIS_tppLista pLista ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Inserir elemento antes +* +* $ED Descrição da função +* Insere novo elemento antes do elemento corrente. +* Caso a lista esteja vazia, insere o primeiro elemento da lista. +* +* $EP Parâmetros +* pLista - ponteiro para a lista onde deve ser inserido o elemento +* pValor - ponteiro para o valor do novo elemento +* Pode ser NULL +* +* $FV Valor retornado +* LIS_CondRetOK +* LIS_CondRetFaltouMemoria +* +***********************************************************************/ + + LIS_tpCondRet LIS_InserirElementoAntes( LIS_tppLista pLista , + void * pValor ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Inserir elemento após +* +* $ED Descrição da função +* Insere novo elemento apás o elemento corrente. +* Caso a lista esteja vazia, insere o primeiro elemento da lista. +* +* $EP Parâmetros +* Parâmetros +* pLista - ponteiro para a lista onde deve ser inserido o elemento +* pValor - ponteiro para o valor do novo elemento +* Pode ser NULL +* +* +* $FV Valor retornado +* Valor retornado +* LIS_CondRetOK +* LIS_CondRetFaltouMemoria +* +***********************************************************************/ + + LIS_tpCondRet LIS_InserirElementoApos( LIS_tppLista pLista , + void * pValor ) + ; + + +/*********************************************************************** +* +* $FC Função: LIS &Excluir elemento +* +* $ED Descrição da função +* Exclui o elemento corrente da lista dada. +* Se existir o elemento aa esquerda do corrente será o novo corrente. +* Se não existir e existir o elemento à direita, este se tornará corrente. +* Se este também não existir a lista tornou-se vazia. +* +* $EP Parâmetros +* pLista - ponteiro para a lista na qual deve excluir. +* +* $FV Valor retornado +* LIS_CondRetOK +* LIS_CondRetListaVazia +* +***********************************************************************/ + + LIS_tpCondRet LIS_ExcluirElemento( LIS_tppLista pLista ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Obter referência para o valor contido no elemento +* +* $ED Descrição da função +* Obtem a referência para o valor contido no elemento corrente da lista +* +* $EP Parâmetros +* pLista - ponteiro para a lista de onde se quer o valor +* +* $FV Valor retornado +* não NULL - se o elemento corrente existe +* NULL - se a lista estiver vazia +* Pode retornar NULL se o valor inserido no elemento for NULL. +* +***********************************************************************/ + + void * LIS_ObterValor( LIS_tppLista pLista ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Ir para o elemento inicial +* +* $ED Descrição da função +* Torna corrente o primeiro elemento da lista. +* Faz nada se a lista está vazia. +* +* $EP Parâmetros +* pLista - ponteiro para a lista a manipular +* +***********************************************************************/ + + void IrInicioLista( LIS_tppLista pLista ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Ir para o elemento final +* +* $ED Descrição da função +* Torna corrente o elemento final da lista. +* Faz nada se a lista está vazia. +* +* $EP Parâmetros +* pLista - ponteiro para a lista a manipular +* +***********************************************************************/ + + void IrFinalLista( LIS_tppLista pLista ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Avançar elemento +* +* $ED Descrição da função +* Avança o elemento corrente numElem elementos na lista +* Se numElem for positivo avança em direção ao final +* Se numElem for negativo avança em direção ao início +* numElem pode ser maior do que o númro de elementos existentes na +* direção desejada +* Se numElem for zero somente verifica se a lista está vazia +* +* $EP Parâmetros +* pLista - ponteiro para a lista a ser manipulada +* numElem - o número de elementos a andar +* +* $FV Valor retornado +* CondRetOK - se numElem elementos tiverem sido andados +* CondRetFimLista - se encontrou o fim da lista antes de andar numElem +* elementos +* CondRetListaVazia - se a lista está vazia +* +***********************************************************************/ + + LIS_tpCondRet LIS_AvancarElementoCorrente( LIS_tppLista pLista , + int numElem ) ; + + +/*********************************************************************** +* +* $FC Função: LIS &Procurar elemento contendo valor +* +* $ED Descrição da função +* Procura o elemento que referencia o valor dado. +* A função compara ponteiro e não conteúdo apontado. +* +* $EP Parâmetros +* pLista - ponteiro para a lista onde procura +* pValor - ponteiro para o valor procurado +* Pode ser NULL +* +* $FV Valor retornado +* LIS_CondRetOK - se encontrou. +* O elemento corrente é o primeiro elemento do +* elemento corrente inclusive para o fim da lista +* e que contém o ponteiro procurado +* +* LIS_CondRetNaoEncontrou - se o ponteiro não foi encontrado +* O elemento corrente continua o mesmo +* LIS_CondRetListaVazia - se a lista estiver vazia +* +***********************************************************************/ + + LIS_tpCondRet LIS_ProcurarValor( LIS_tppLista pLista , + void * pValor ) ; + +#undef LISTA_EXT + +/********** Fim do módulo de definição: LIS Lista duplamente encadeada **********/ + +#else +#endif diff --git a/tabuleiro/PECA.C b/tabuleiro/PECA.C new file mode 100644 index 0000000..696d6a6 --- /dev/null +++ b/tabuleiro/PECA.C @@ -0,0 +1,92 @@ +/*************************************************************************** +* $MCI Módulo de implementação: PEC Estrutura Peca +* +* Arquivo gerado: PECA.C +* Letras identificadoras: PEC +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa +* fvc - Felipe Vieira Côrtes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 1.0 tbm 14/set/2015 Início do desenvolvimento +* +***************************************************************************/ + + +#include +#include +#include + +#define PECA_OWN +#include "PECA.h" +#undef PECA_OWN + +/*********************************************************************** +* +* $TC Tipo de dados: PECPnt Descritor do dados de ponto. +* +* $ED Descrição do tipo +* Descreve a estrutura de peça +***********************************************************************/ + +typedef struct tgPeca{ + int *posicao; + /*Pontei para a posicao da peca, ainda deve ser alterado pelo tipo correto.*/ + char cor; + /*Devemos usar um inteiro para facilitar a manipulacao da peça pela cor? Porem a cor tambem determia qual jogador + tem a posse da peca*/ + //struct tpp * jogador; +} tpPeca; + + +/***** Dados encapsulados no módulo *****/ + + +/***** Código das funções exportadas pelo módulo *****/ + +/*************************************************************************** +* +* Função: Pec Criar Peça +* ****/ + +Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado, char CorDaNovaPeca) +{ + *PecCriado= (tppPeca)malloc(sizeof(struct tgPeca)); + + if(PecCriado == NULL) + return Pec_CondRetFaltouMemoria; + + (*PecCriado)->cor = CorDaNovaPeca; + + return Pec_CondRetOK; +} + +/*************************************************************************** +* +* Função: PEC Destruir Peça +* ****/ + +Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca) +{ + return Pec_CondRetOK; +} + +/*************************************************************************** +* +* Função: PEC Obter Cor +* ****/ + +Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor) +{ + *cor = Peca->cor; + return Pec_CondRetOK; +} + +/*********** Fim do módulo de implementação: Módulo DadoPontos **************/ diff --git a/tabuleiro/PECA.h b/tabuleiro/PECA.h new file mode 100644 index 0000000..a63d488 --- /dev/null +++ b/tabuleiro/PECA.h @@ -0,0 +1,98 @@ +/*************************************************************************** +* +* $MCD Módulo de definição: Módulo Peça +* +* Arquivo gerado: PECA.H +* Letras identificadoras: PEC +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa +* fvc - Felipe Vieira Côrtes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão + +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 1.00 tbm 14/09/2015 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo implementa um conjunto simples de funções para manipular a peça +* alem de descrever sua estrutura. +* +***************************************************************************/ + +#if defined( PECA_OWN ) + #define PECA_EXT +#else + #define PECA_EXT extern +#endif + +typedef struct tgPeca * tppPeca; + +/*********************************************************************** +* +* $TC Tipo de dados: MAT Condicoes de retorno +* +* +***********************************************************************/ + + typedef enum { + + Pec_CondRetOK = 0 , + /* Executou correto */ + + Pec_CondRetErro = 1 , + /* Estrutura do DadoPontos está errada */ + + Pec_CondRetMatrizNaoExiste = 2 , + /* DadoPontos não existe */ + + Pec_CondRetFaltouMemoria = 3 + /* Faltou memória ao alocar dados */ + + } Pec_tpCondRet ; + +/*********************************************************************** +* +* $FC Função: DADPnt Criar Peça +* +* $ED Descrição da função +* Cria uma nova peça +* $FV Valor retonado +* Pec_CondRetOK +* Pec_CondRetFaltouMemoria +* +***********************************************************************/ + + Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado1, char CorDaNovaPeca); + +/*********************************************************************** +* +* $FC Função: DADPnt Destruir Peça +* +* $ED Descrição da função +* Destroi uma peça +* $FV Valor retonado +* Pec_CondRetOK +* Pec_CondRetFaltouMemoria +* +***********************************************************************/ + + Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); + +/*********************************************************************** +* +* $FC Função: DADPnt Obter Cor +* +* $ED Descrição da função +* Obtem cor de uma peca +* $FV Valor retonado +* Pec_CondRetOK +* Pec_CondRetFaltouMemoria +* +***********************************************************************/ +Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); \ No newline at end of file diff --git a/tabuleiro/TABULEIRO.C b/tabuleiro/TABULEIRO.C new file mode 100644 index 0000000..b3f9aa2 --- /dev/null +++ b/tabuleiro/TABULEIRO.C @@ -0,0 +1,64 @@ +/*************************************************************************** +* $MCI Módulo de implementação: LIS Lista duplamente encadeada +* +* Arquivo gerado: LISTA.c +* Letras identificadoras: LIS +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +***************************************************************************/ + +#include +#include +#include +#include +#include + +#define TABULEIRO_OWN +#include "LISTA.H" +#include "GENERICO.H" +#include "PECA.h" +#include "TABULEIRO.H" + +#undef TABULEIRO_OWN + +/*********************************************************************** +* +* $TC Tipo de dados: TAB Tabuleiro +* +* +***********************************************************************/ + +typedef struct tagTabuleiro { + + LIS_tppLista Casa; + +} TAB_tpTabuleiro; + + +/***** Código das funções exportadas pelo módulo *****/ + +/*************************************************************************** +* +* Função: LIS &Criar Tabuleiro +* ****/ + + TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, + void ( * ExcluirValor ) ( void * pDado ) ) + { + + *pTab = (TAB_tppTabuleiro)malloc(sizeof(TAB_tpTabuleiro)); + (*pTab)->Casa = LIS_CriarLista(ExcluirValor); + diff --git a/tabuleiro/TABULEIRO.H b/tabuleiro/TABULEIRO.H new file mode 100644 index 0000000..7b024aa --- /dev/null +++ b/tabuleiro/TABULEIRO.H @@ -0,0 +1,162 @@ +#if ! defined( TABULEIRO_ ) +#define TABULEIRO_ +/*************************************************************************** +* +* $MCD Módulo de definição: LIS Lista duplamente encadeada +* +* Arquivo gerado: LISTA.h +* Letras identificadoras: LIS +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Implementa listas genéricas duplamente encadeadas. +* Podem existir n listas em operação simultaneamente. +* As listas possuem uma cabeça encapsulando o seu estado. +* +* Cada lista é homogênea quanto ao tipo dos dados que armazena. +* Cada elemento da lista referencia o valor que contém. +* +* Os ponteiros para os dados são copiados para elementos da lista. +* Não é copiado o valor apontado por estes ponteiros. +* +* O controle da destruição do valor de um elemento a ser excluído +* é realizado por uma função fornecida pelo usuário. +* +* Cada lista referencia uma função que determina como devem ser +* desalocados os dados nela contidos. +* +* A função de liberação dos valores contidos nos elementos deve +* assegurar a liberação de todos os espaços referênciados pelo +* valor contido em um elemento. +* Esta função é chamada antes de se desalocar um elemento +* de uma lista. +* Caso não seja necessário desalocar o valor referenciado pelo +* elemento, o ponteiro para a função de liberação poderá ser NULL . +* Caso o elemento da lista seja a única âncora do valor referenciado, +* esta função deve promover a destruição (free) desse valor e +* de todos os dados nele ancorados. +* +***************************************************************************/ + +#if defined( LISTA_OWN ) + #define LISTA_EXT +#else + #define LISTA_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +/* Tipo referência para uma lista */ + +typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; + + +/*********************************************************************** +* +* $TC Tipo de dados: LIS Condições de retorno +* +* +* $ED Descrição do tipo +* Condições de retorno das funções da lista +* +***********************************************************************/ + + typedef enum { + + TAB_CondRetOK , + /* Concluiu corretamente */ + TAB_CondRetErro, + + } TAB_tpCondRet ; + + + + +/*********************************************************************** +* +* $FC Função: TAB &Criar Tabuleiro +* +* $ED Descrição da função +* Cria uma lista genérica duplamente encadeada. +* Os possíveis tipos são desconhecidos a priori. +* A tipagem é implicita. +* Não existe identificador de tipo associado à lista. +* +* $EP Parâmetros +* ExcluirValor - ponteiro para a função que processa a +* exclusão do valor referenciado pelo elemento +* a ser excluído. +* Ver descrição do módulo. +* +* $FV Valor retornado +* Se executou corretamente retorna o ponteiro para a lista. +* Este ponteiro será utilizado pelas funções que manipulem esta lista. +* +* Se ocorreu algum erro, por exemplo falta de memória ou dados errados, +* a função retornará NULL. +* Não será dada mais informação quanto ao problema ocorrido. +* +***********************************************************************/ + + TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, + void ( * ExcluirValor ) ( void * pDado ) ) ; + + +/*********************************************************************** +* +* $FC Função: TAB &Destruir Tabuleiro +* +* $ED Descrição da função +* Destrói a lista fornecida. +* O parâmetro ponteiro para a lista não é modificado. +* Se ocorrer algum erro durante a destruição, a lista resultará +* estruturalmente incorreta. +* OBS. não existe previsão para possíveis falhas de execução. +* +* $FV Valor retornado +* LIS_CondRetOK - destruiu sem problemas +* +***********************************************************************/ + + void LIS_DestruirTabuleiro( TAB_tppTabuleiro pTab ) ; + + +/*********************************************************************** +* +* $FC Função: TAB &Mover Peça do Tabuleiro +* +* $ED Descrição da função + +* +* $FV Valor retornado +* LIS_CondRetOK - Moveu sem problemas +* TAB_CondRetOK - Nao moveu a peça +* +***********************************************************************/ + + void TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; + + +/***********************************************************************/ + + + +#undef TABULEIRO_EXT + +/********** Fim do módulo de definição: LIS Lista duplamente encadeada **********/ + +#else +#endif \ No newline at end of file diff --git a/tabuleiro/TST_ESPC.H b/tabuleiro/TST_ESPC.H new file mode 100644 index 0000000..987ff8e --- /dev/null +++ b/tabuleiro/TST_ESPC.H @@ -0,0 +1,320 @@ +#if ! defined( Tst_Espc_ ) +#define Tst_Espc_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTE Interface de teste específico +* +* Arquivo gerado: Tst_Espc.h +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Este módulo consta somente do módulo de definição de todos os módulos +* de teste específicos a serem desenvolvidos, e também da especificação +* do tipo de condições de retorno deste módulo. +* +* Ele estabelece a interface a ser utilizada pelo módulo de teste +* genérico com todos os módulos de teste específico a serem +* desenvolvidos. +* +* Os módulos de teste específico devem sempre incluir este módulo +* de definição e, idealmente, não devem adicionar mais itens +* à interface. +* +* O módulo de teste específico contém a função de teste de um +* determinado módulo ou conjunto de módulos. Mais especificamente, +* contém a função que interpreta os comandos de teste que exercitarão +* as funções do(s) módulo(s) em teste. +* +* Poderá conter também diversas funções auxiliares requeridas para +* realizar os testes, vide "contexto" a seguir. +* +* O contexto é formado por variáveis e estruturas auxiliares necessárias +* para que se possa efetuar todos os comandos de teste. +* Por exemplo pode-se desejar testar várias instâncias de uma +* mesma estrutura. Uma forma de resolver isto é criar um vetor +* global static +* de n elementos em que cada elemento aponta para a cabeça de +* uma determinada instância dessa estrutura. Para realizar um +* teste relativo a uma determinada instância, torna-se necessário +* selecioná-la através de um índice contido no comando de teste. +* Este parâmetro, embora seja um índice, é na realidade o identificador +* da instância da estrutura a ser manipulada (idEstrutura). +* +* Caso o módulo em teste requeira um contexto, este deverá ser +* estabelecido no presente módulo. Para tal devem ser declaradas +* variáveis e estruturas encapsuladas e devem ser incluídos comandos +* de teste capazes de manipular o contexto. +* +* Uma das formas para estabelecer o contexto seria a de incluir +* no mçodulo de teste específico comando semelhantes a: +* +* =iniciaXXX que inicializa o contexto do módulo sob teste para +* vazio. Este comando deve ser utilizado uma única vez +* logo ao inciar a execução do teste. +* =reset restaura o contexto para vazio. Este comando usualmente +* assumirá que o contexto a esvaziar esteja correto. +* O comando deverá liberar os espaços alocados aos +* elementos, anular as referências a ele, inicializar +* valores de vetores de referências, etc. +* O comando tem utilidade especial ao segmentar um teste +* em partes estanques e ao controlar vazamento de +* memória. +* =terminaXXX este comando destrói todo o contexto e não o +* reinicializa. O objetivo é poder verificar vazamento +* de memória. +* +* Evidentemente, outra forma seria a de alterar as funções de +* inicialização e término do módulo de teste genérico o que é pouco +* recomendável pois viola o princípio de um mesmo módulo genérico +* servir para testar todos os construtos. +* +* Para cada função do módulo a ser testado deve existir pelo menos +* um comando de teste. Em alguns casos pode ser interessante criar +* comandos que armazenem, alterem ou consultem variáveis de +* estado do próprio módulo de teste. Ver os comentários sobre +* contexto acima. Ou seja, podem existir comandos de teste que +* têm o propósito de agir sobre o contexto e, não, o de efetuar +* um determinado teste. Alguns desses comandos podem inclusive +* realizar verificações entre um resultado esperado e existente +* no contexto. +* +* Todos os controles de consistência dos parâmetros dos comandos +* de teste devem ser realizados no módulo de teste específico. +* Recomenda-se que seja sempre retornado TST_CondRetParm, +* sinalizando erro de sintaxe do comando de teste ou valores +* não permitidos. Deve ser sempre assumido que os parâmetros +* podem estar em erro. Ou seja, o controle da integridade dos +* comando é mandatória. +* +* Caso seja necessário emitir mensagens especiais, +* deve ser utilizada a função genérica "TST_ExibirPrefixo". +* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, +* (prefixo, ou comparar), utilize a função +* fprintf( TST_ObterArqLog( ) , "..." , ... ) +* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") +* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção +* assegura a consistência do aspecto das mensagens com o restante do +* programa de teste. +* +* Cada comando deve ser completamente interpretado pelo seu +* respectivo fragmento de interpretação. Ou seja, não deverá ser +* retornado para o módulo genérico qualquer dado adicional à +* condição de retorno da função de teste específico. Veja +* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes +* à mensagen já exibida. +* +* A função TST_NotificarFalha sempre registra uma falha, enquanto que +* a função TST_ExibirPrefixo pode ser usada para emitir mensagens +* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo +* seja utilizada para sinalizar uma falha, é necessário chamar +* também a função TST_ContarFalha( ) para que seja notificada a falha. +* Isto não é necessário no caso da função TST_NotificarFalha, pois +* esta sempre conta falhas. +* +* As funções a testar que retornem um valor sempre devem ter +* este valor verificado, mesmo que seja uma condição de retorno. +* Utilize para isto uma das funções " Comparar" do arcabouço. +* Caso uma função retorne dois ou mais valores, incluindo +* a condição de retorno, utilize um código semelhante ao +* descrito a seguir. +* +* Seja +* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... +* a função a ser testada e, v1, v2, ... os dados retornados de +* alguma forma (valor retornado, parâmetro por referência, variável +* global). Assumindo que v1 seja o valor retornado. +* +* v1Obtido = FuncATestar( ... +* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* +* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* ... +* +* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; +* +***************************************************************************/ + +#if defined( Tst_Espc_OWN ) + #define Tst_Espc_EXT +#else + #define Tst_Espc_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define SINALIZA_ERRO ">>>" +#define SINALIZA_RECUPERA "<<<" +#define SINALIZA_COMENTARIO "!!!" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste específico +* +* +* $ED Descrição do tipo +* Este tipo enumera todas as condições de retorno que podem ser +* geradas pela função de teste específica. +* +***********************************************************************/ + + typedef enum { + + TST_CondRetOK , + /* Comando de teste executou corretamente */ + + TST_CondRetErro , + /* Comando de teste encontrou uma ou mais falhas + * + *$ED Descrição + * Esta condição sinaliza que um ou mais resultados da execução + * da função sob teste resultou em um valor diferente do esperado. */ + + TST_CondRetParm , + /* Comando de teste está com a sintaxe em erro + * + *$ED Descrição + * A presente condição de retorno deve ser retornada caso a sintaxe + * ou os valores do comando de teste estiverem em erro. + * + * Todos os fragmentos de interpretação devem: + * - realizar a análise dos parâmetros do comando + * - verificar se todos os parâmetros foram lidos + * - verificar se os valores dos parâmetros estão corretos + * por exemplo: verificar se os índices de acesso a elementos + * estão dentro dos limites dos correspondentes vetores. + * - efetuar a função a testar + * - verificar se os resultados retornados por esta função estão + * corretos */ + + TST_CondRetNaoExecutou , + /* Comando de teste não se destina ao presente interpretador + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de comandos de teste relativas a módulos do próprio arcabouço, + * caso não tenha sido encontrado um comando válido. Isso permite + * estabelecer um "daisy chain" de interpretadores em que cada qual + * tenha finalidade específica no contexto do arcabouço. */ + + TST_CondRetNaoConhec , + /* Comando de teste não é conhecido + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de casos de teste específico visando determinado módulo em teste, + * sempre que esse interpretador não consiga identificar o comando. + * + * Cabe salientar a diferença entre TST_CondRetNaoExecutou e + * TST_CondRetNaoConhec. A primeira corresponde à não interpretação + * de um comando possivelmente válido em interpretadores subsequentes. + * A segunda corresponde a comandos não válidos considerando todos + * os interpretadores. */ + + TST_CondRetNaoImplementado , + /* Comando de teste não implementado + * + *$ED Descrição + * Esta condição deve ser retornada ao interpretar um comando de teste + * específico ainda não implementado. + * + * Recomenda-se que o desenvolvimento dos módulos sob teste e do + * correpondente módulo de teste específico se dê incrementalmente. + * Consequentemente diversos comandos não estarão implementados + * no início do desenvolvimento. Esta incompleteza poderá ser + * sinalizada com esta condição de retorno. */ + + TST_CondRetMemoria + /* Faltou memória para executar o comando + * + *$ED Descrição + * Esta condição deve ser retornada caso tenha ocorrido algum erro + * quando o módulo de teste específico tentar alocar memória ou + * outro recurso. */ + + } TST_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: TSTE &Efetuar comandos de teste específicos +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* sendo testado. +* +* Cada módulo de teste específico deve desenvolver esta função. +* Poderá conter diversas outras conforme necessário. No entanto +* estas devem todas ser funções encapsuladas no módulo (static) +* +* Freqüentemente é necessário desenvolver um contexto para o teste. +* Por exemplo, pode ser necessário tratar n elementos disponibilizados +* pelo módulo sob teste. Neste caso deveria ser criado um vetor +* global com referências para estas elemento. Ao iniciar os teste +* este vetor deverá ser inicializado. Ao terminar, os elementos do +* vetor referenciando algum elemento devem ser destruídos. +* +* Todos os controles de consistência devem ser realizados no +* módulo de teste específico. +* +* A função TST_EfetuarComando( ) deve retornar as condições de retorno +* identificadas no tipo TST_tpCondRet. +* +* As funções do módulo sob teste que retornam algum valor sempre +* devem sempre ter este valor verificado, mesmo sendo uma condição de +* retorno. Para fazer a vereficação da corretude, recomenda-se +* utilizar as funções TST_CompararXXX definidas no módulo genérico. +* Assegura-se assim a uniformidade da saída gerada durante o teste. +* +* Para realizar a análise de um comando de teste recomenda-se +* utilizar as funções definidas no módulo LerParm. Elas, além +* de realizarem a análise léxica, permitem o uso intercambiável +* de parâmetros simbólicos ou literais. Também realizam a +* verificação da corretude dos tipos dos parâmetros, contribuindo +* assim para a redução de erros de redação de scripts de teste +* que possam passar despercebidos. +* +* As funções a serem testadas que requeiram algum argumento, devem +* ser chamadas com valores (parâmetros) extraídos do comando de +* teste sendo executado. Use sempre as funções do módulo LerParm +* para realizar a análise sintática. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* TST_CondRetXXX - veja a descriÓcão dos possíveis valores +* retornados na especificação do correspondente +* enum +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; + +#undef Tst_Espc_EXT + +/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ + +#else +#endif From 5e6306f2ffd84fecab626bf3bdd5dd9eb5556f4c Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Tue, 22 Sep 2015 01:16:34 -0300 Subject: [PATCH 08/18] Criar e Destruir Tabuleiro Criado --- tabuleiro/TABULEIRO.C | 93 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 7 deletions(-) diff --git a/tabuleiro/TABULEIRO.C b/tabuleiro/TABULEIRO.C index b3f9aa2..e0ae02a 100644 --- a/tabuleiro/TABULEIRO.C +++ b/tabuleiro/TABULEIRO.C @@ -41,9 +41,9 @@ * ***********************************************************************/ -typedef struct tagTabuleiro { +typedef struct TAB_tagTabuleiro { - LIS_tppLista Casa; + LIS_tppLista Casas; } TAB_tpTabuleiro; @@ -55,10 +55,89 @@ typedef struct tagTabuleiro { * Função: LIS &Criar Tabuleiro * ****/ - TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, - void ( * ExcluirValor ) ( void * pDado ) ) - { +TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, + void ( * ExcluirValor ) ( void * pDado ) ) +{ + LIS_tppLista vtCasa[24]; // vetor de casas auxiliar + tppPeca vtPecaB[15]; // vetor de peças brancas + tppPeca vtPecaP[15]; //vetor de peças pretas + int i, jb = 0,jp = 0; + + *pTab = (TAB_tppTabuleiro)malloc(sizeof(TAB_tpTabuleiro)); + (*pTab)->Casas = LIS_CriarLista(ExcluirValor); + + /* Cria 15 peças brancas */ + for(i = 0; i < 15; i++) + if(Pec_CriarPeca(&vtPecaB[i], 'b')!=Pec_CondRetOK) + return TAB_CondRetErro; + /* Cria 15 peças pretas */ + for(i = 0; i < 15; i++) + if(Pec_CriarPeca(&vtPecaP[i], 'p')!=Pec_CondRetOK) + return TAB_CondRetErro; + /* Cria 24 listas que representam cada casa do tabuleiro*/ + for(i = 0; i < 24; i++) + vtCasa[i] = LIS_CriarLista(ExcluirValor); + + // Pretas + LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; + LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; + // Brancas + LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; + LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; + for(i = 0; i < 5; i++) + { + // Pretas + LIS_InserirElementoApos(vtCasa[5], vtPecaP[jp]); jp++; + LIS_InserirElementoApos(vtCasa[12], vtPecaP[jp]); jp++; + // Brancas + LIS_InserirElementoApos(vtCasa[11], vtPecaB[jb]); jb++; + LIS_InserirElementoApos(vtCasa[18], vtPecaB[jb]); jb++; + } + for(i = 0; i < 3; i++) + { + // Pretas + LIS_InserirElementoApos(vtCasa[7], vtPecaP[jp]); jp++; + // Brancas + LIS_InserirElementoApos(vtCasa[16], vtPecaB[jb]); jb++; + } + // Alocar as 24 casas na lista do tabuleiro + for(i = 0; i < 24; i++) + LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); + + free(vtCasa); + free(vtPecaB); + free(vtPecaP); + + return TAB_CondRetOK; +} + +/* Destuir Tabuleiro */ + +TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) +{ + LIS_tppLista temp; + int i; + // Destroi as 24 casas + for(i = 0; i < 24; i++) + { + temp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + LIS_DestruirLista(temp); + LIS_AvancarElementoCorrente(pTab->Casas, -1); + } + // Destroi a lista principal + LIS_DestruirLista(pTab->Casas); + // Libera o ponteiro para o tabuleiro + free(pTab); + + return TAB_CondRetOK; +} + + + + + + + + - *pTab = (TAB_tppTabuleiro)malloc(sizeof(TAB_tpTabuleiro)); - (*pTab)->Casa = LIS_CriarLista(ExcluirValor); From 60e6fc7f5973a97fe5dbf0a1c1758add9a8ae4a7 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Wed, 23 Sep 2015 19:06:10 -0300 Subject: [PATCH 09/18] merged --- {DadoPonto => DadoPontos/Source}/DADOPONTOS.c | 3 + {DadoPonto => DadoPontos/Source}/DADOPONTOS.h | 4 +- DadoPontos/Source/GENERICO.H | 713 ++++++++++++++++++ DadoPontos/Source/LERPARM.H | 463 ++++++++++++ .../Source}/TESTDADOPONTOS.c | 23 +- DadoPontos/Source/TST_ESPC.H | 320 ++++++++ DadoPontos/TRAB2-2.exe | Bin 0 -> 76800 bytes DadoPontos/TesteDadoPontos.bat | 1 + .../TesteDadoPontos.script | 3 +- DadoPontos/logTesteDadoPontos.txt | 39 + README.txt | 0 TESTDADOPONTOS.c | 33 + 12 files changed, 1589 insertions(+), 13 deletions(-) rename {DadoPonto => DadoPontos/Source}/DADOPONTOS.c (97%) rename {DadoPonto => DadoPontos/Source}/DADOPONTOS.h (98%) create mode 100644 DadoPontos/Source/GENERICO.H create mode 100644 DadoPontos/Source/LERPARM.H rename {DadoPonto => DadoPontos/Source}/TESTDADOPONTOS.c (91%) create mode 100644 DadoPontos/Source/TST_ESPC.H create mode 100644 DadoPontos/TRAB2-2.exe create mode 100644 DadoPontos/TesteDadoPontos.bat rename DadoPonto/testescript.script => DadoPontos/TesteDadoPontos.script (95%) create mode 100644 DadoPontos/logTesteDadoPontos.txt delete mode 100644 README.txt diff --git a/DadoPonto/DADOPONTOS.c b/DadoPontos/Source/DADOPONTOS.c similarity index 97% rename from DadoPonto/DADOPONTOS.c rename to DadoPontos/Source/DADOPONTOS.c index a19cd12..32d4a55 100644 --- a/DadoPonto/DADOPONTOS.c +++ b/DadoPontos/Source/DADOPONTOS.c @@ -24,6 +24,7 @@ #include #include #include +#include "GENERICO.H" #define DADO_OWN #include "DADOPONTOS.h" @@ -123,6 +124,8 @@ DADPnt_tpCondRet DADPtn_ObterDono(tppDadoPontos DadoPonto, char * CorDonoAtual) DADPnt_tpCondRet DADPtn_DestruirDado(tppDadoPontos Dado) { + if(Dado == NULL) + return DADPnt_CondRetDadoPontosNaoExiste; free(Dado); return DADPnt_CondRetOK; } diff --git a/DadoPonto/DADOPONTOS.h b/DadoPontos/Source/DADOPONTOS.h similarity index 98% rename from DadoPonto/DADOPONTOS.h rename to DadoPontos/Source/DADOPONTOS.h index b73dd7a..31e9c32 100644 --- a/DadoPonto/DADOPONTOS.h +++ b/DadoPontos/Source/DADOPONTOS.h @@ -31,6 +31,8 @@ #define DADOPONTOS_EXT extern #endif +#include "Generico.h" + typedef struct tgDadoPontos * tppDadoPontos; typedef struct tgPlayers * tppPlayers; /*********************************************************************** @@ -48,7 +50,7 @@ typedef struct tgPlayers * tppPlayers; DADPnt_CondRetErro = 1 , /* Estrutura do DadoPontos está errada */ - DADPnt_CondRetMatrizNaoExiste = 2 , + DADPnt_CondRetDadoPontosNaoExiste = 2 , /* DadoPontos não existe */ DADPnt_CondRetFaltouMemoria = 3 diff --git a/DadoPontos/Source/GENERICO.H b/DadoPontos/Source/GENERICO.H new file mode 100644 index 0000000..dcf7430 --- /dev/null +++ b/DadoPontos/Source/GENERICO.H @@ -0,0 +1,713 @@ +#if ! defined( GENERICO_ ) +#define GENERICO_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTG Controlador de teste genérico +* +* Arquivo gerado: GENERICO.h +* Letras identificadoras: TST +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\INSTRUM.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* O módulo de teste genérico contém um conjunto de funções de +* coordenação, apoio e controle da execução de testes de módulos +* quaisquer. +* +* Embora na prática a função de teste específica seja uma extensão da +* função de teste genérica, a função de teste específica encontra-se em +* outro módulo. Desta forma as alterações necessárias para cada +* módulo a testar concentram-se exclusivamente naquele módulo. +* +* $EIU Interface com o usuário pessoa +* Os seguintes comandos genéricos estão definidos: +* +* linha em branco - faz nada +* +* // - comentário, é impresso no LOG +* +* == - título de caso de teste, o título é impresso no LOG +* +* =recuperar +* - Caso o comando imediatamente anterior ao comando +* =recuperar retorne TST_CondRetOK, obviemanete o comando +* executou corretamente, portanto o comando =recuperar +* reportará uma falha no script de teste, uma vez que não +* foi encontrada a falha esperada ao executar o comando. +* - Caso o comando antecessor retorne TST_CondRetErro, +* ou TST_CondRetParm (erro de parâmetros do comando) +* a falha reportada será desconsiderada, uma vez que +* era esperada. O comando =recuperar destina-se a +* apoiar o teste da corretude dos validadores de +* parâmetros dos comandos e das funções por eles +* ativadas. +* - caso o comando antecessor retorne outras condições, o +* comando =recuperar será tratado como falha. +* +* =bkpt - permite interagir com o depurador utilizado para +* desenvolver os módulos sob teste. O comando =bkpt +* executa um código "dummy" no qual pode ser inserido +* um "breakpoint" do depurador. Desta forma o teste pode +* prosseguir sem interrupção até o comando =bkpt. +* Para isto +* - apague ou desative todos os breakpoints do depurador +* - insira o comando =bkpt no script pouco antes do ponto +* de interrupção desejado +* - usando o depurador, estabeleça um breakpoint na linha de +* código: "Dummy = 0 ;" contida no módulo de teste +* genérico. Esta linha pode ser encontrada +* procurando por "BKPT_CMD" +* - dê partida no programa e espere até chegar ao breakpoint +* associado ao comando "dummy". Agora reative ou instale +* os breakpoints requeridos pela a sessão de depuração. +* e continue depurando +* +* =cancelar +* - termina a interpretação dos comandos de teste. +* Sempre sinaliza falha. +* +* =AceitaFalhasAcumuladas numFalhas +* - caso o contador de falhas registre numFalhas, ele será +* tornado zero. Este comando é similar a =recuperar. +* Difere deste por ser executado desde que o comando +* anterior não tenha reportado erro, tal como acontece +* com todos os comandos, exceto =recuperar. +* O comando permite recuperar falhas sinalizadas por +* módulos de apoio, tais como, leitor de parâmetros, +* contador de passagens e controle de espaço dinâmico. +* Caso o contador de número de falhas contenha um valor +* diferente de numFalhas, será reportado um erro e +* o contador é incrementado de 1. +* +* Os demais comandos são passados para as funções de teste específico. +* Primeiro para as do arcabouço, depois para a específica do módulo +* a testar. A última função de teste específico deve retornar a condição +* TST_CondRetNaoConhec caso não consiga interpretar a diretiva. +* +* $EIM Interface com outros módulos +* A primeira função do arcabouço ("framework") a ser chamada deve a +* sempre ser TST_InicializarTeste. Caso não o seja, ocorrerão erros +* de execução (assert). +* +* Após abra o arquivo de script executando a função +* TST_AbrirArquivoScript. Se for desejado gerar um log abra +* o arquivo corresponente com a função TST_AbrirArquivoLog. +* +* Depois de abrir os arquivos, execute os testes chamando a função +* TST_RealizarTeste. A função de teste genérico lerá todo o arquivo +* de script, retornando após concluir o teste. +* +* Após, termine o teste através da função TST_TerminarTeste. +* Esta função exibe as estatísticas do teste e, caso solicitado, +* acumula essas estatísticas em um arquivo acumulador (ver +* parâmetro /a do programa principal. +* +* As funções "TST_ObterXXX" podem ser utilizadas antes de fechar o +* módulo de teste para exibir o resumo do teste no módulo cliente do +* módulo de controle genérico. +* +* O programa cliente do módulo controle de teste genérico pode +* efetuar as operações acima repetidas vezes, permitindo, assim o +* teste envolvendo diversos arquivos scripts de teste. A saída +* de cada teste deve ser dirigida para um log específico, ou para +* stdout, uma vez que, ao abrir um arquivo log, o seu conteúdo será +* sempre destruído. +* +* O módulo de teste genérico também implementa diversas funções +* de comparação "TST_CompararXXX" use-as no módulo de controle de +* teste específico. Desta forma será assegurado o tratamento uniforme +* de todas as falhas possivelmente encontradas. +* +* O módulo disponibiliza ainda a função TST_ExibirPrefixo +* que gera uma linha de saída obedecendo aos padrões de interface +* estabelecidos. Sendo desejado pode-se adicionar textos à linha +* usando a funcao fprintf( TST_pArqLog , ... ). Um exemplo disso +* é quando se deseja imprimir informação complementar ao interpretar +* uma determinada diretiva. +* +* Finalmente, o módulo disponibiliza a função TST_NotificarFalha +* que incrementa o contador de falhas além de emitir uma mensagem +* de erro. +* +***************************************************************************/ + +#if defined( GENERICO_OWN ) + #define GENERICO_EXT +#else + #define GENERICO_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#include "TST_Espc.h" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste genérico +* +* +***********************************************************************/ + + typedef enum { + + TST_CondOK , + /* Generico executou correto */ + + TST_CondNaoAbriu + /* Genérico não abriu arquivo */ + + } TST_tpCond ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Inicializar o módulo de teste +* +* $ED Descrição da função +* Inicializa todas as variáveis globais exportadas e encapsuladas +* do módulo de teste genérico. +* +* Embora pouco recomendável (ver descrição do módulo TesteSpc) +* esta função pode ser alterada para assegurar o estabelecimento +* do contexto inicial do módulo TesteSpc. Este deve conter uma +* função de inicialização a ser chamada pela presente função. +* +***********************************************************************/ + + void TST_InicializarTeste( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Terminar a execução do módulo de teste +* +* $ED Descrição da função +* Fecha todos os arquivos e desaloca todos os espaços de dados +* alocados sob controle do módulo de teste genérico +* +***********************************************************************/ + + void TST_TerminarTeste( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter origem do nome da extensão de arquivo +* +* $ED Descrição da função +* Procura o início do nome da extensão contido no nome do arquivo +* dado por parâmetro +* +* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". +* Isto pode confundir no caso de se desejar a adição de algum nome +* de extensão padrão. +* +* $EP Parâmetros +* $P NomeArqParm - nome de arquivo a ser analisado +* +* $FV Valor retornado +* Ponteiro para o caractere '.' que separa a extensão. +* Será NULL caso o nome do arquivo não contenha extensão. +* +***********************************************************************/ + + char * TST_ObterInicioExtensao( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Abrir arquivo log +* +* $ED Descrição da função +* Abre o arquivo log a ser utilizado como saída durante os testes. +* Todas as saídas geradas pelo módulo de teste são dirigidos para +* este arquivo. Caso não tenha sido aberto, será utilizado o +* arquivo stdout. +* +* A extensão default do arquivo log é ".log" e será acrescida ao nome +* do arquivo caso este não contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo. Pode (deve) ser um nome relativo +* ao diretório corrente. Caso o arquivo +* exista, será destruido sem perguntar se pode. +* +* $FV Valor retornado +* TST_CondRetOK - abriu corretamente +* TST_CondRetNaoAbriu - ocorreu algum problema ao tentar abrir. +* O problema não é descriminado. +* O arquivo de saída do log volta a ser stdout +* +* $EIU Interface com usuário pessoa +* Esta função deve ser chamada antes de iniciar a execução dos testes. +* +***********************************************************************/ + + TST_tpCondRet TST_AbrirArquivoLog( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter ponteiro para arquivo LOG +* +* $ED Descrição da função +* Retorna o ponteiro para o FILE do log. +* Será stdout caso não seja definido explicitamente por +* TSTG_DefinirLog +* +* $FV Valor retornado +* Ponteiro válido para um arquivo de texto de saída +* +***********************************************************************/ + + FILE * TST_ObterArqLog( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Registrar nome do arquivo acumulador +* +* $ED Descrição da função +* Registra o nome do arquivo acumulador. Este arquivo é utilizado +* para acumular as estatísticas de um teste formado por um conjunto +* de massas de teste. Cada massa de teste gera o seu conjunto de +* estatísticas de execução. O arquivo acumulador acumula estas +* estatísticas permitindo ver o total de todas as massas de teste. +* +* $EIU Interface com usuário pessoa +* O arquivo acumulador tem serventia somente se o teste é formado +* por um conjunto de duas ou mais massas de teste. +* Antes de executar a primeira deve ser apagado o arquivo acumulador. +* Após terminar a execução da última massa de teste exiba o resultado +* como o programa "ExbeEstat" que faz parte do arcabouço. +* +***********************************************************************/ + + void TST_RegistrarArquivoAcumulador( char * pNomeArquivoAcumulador ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Interpretar toda a massa de teste +* +* $ED Descrição da função +* Interpreta o arquivo de diretivas (script) de teste já aberto +* +* A função de teste é dividida em três classes de comandos: +* +* - os de teste genérico, que coordenam e controlam a realização do +* teste. Estes comandos são interpretados por esta função. +* - os de teste e controle de módulos componentes do arcabouço. +* Estes comandos são interpretados por funções de teste específicas +* para cada um dos módulos componentes. +* - os de teste específico do módulo (ou módulos) a ser testado. +* O módulo de teste específico interpreta os comandos projetados +* para realizar os testes do módulo a testar. +* +* A função de teste genérico lê um arquivo de diretivas de teste. +* Cada linha deste arquivo é um comando de teste. +* A função de teste lê uma a uma as linhas do arquivo, limpa os +* caracteres em branco no final da linha e procura interpretar o +* comando. +* +* As funções de teste específicas comunicam os resultados da execução +* de cada comando por meio de uma condição de retorno. +* +* Cada linha do arquivo script de teste corresponde a um comando de +* teste. +* +* Caso seja encontrada uma falha não esperada (ver comando =recuperar) +* os restantes comandos do caso de teste serão ignorados e contados +* como problemas. +* +* A sintaxe utilizada pelos comandos de teste é semelhante a assembler. +* Esta sintaxe facilita a análise: +* +* = +* +* em que: +* = - todos os comandos a serem interpretados iniciam +* com este caractere +* - é o string que identifica o comando +* - são zero ou mais itens a serem utilizados +* pelo comando de teste. Os itens devem, de preferência, +* ser separados um do outro por um caractere "espaço" +* +* Deve ser adotado o seguinte padrão de uso: +* +* - procure sempre utlizar uma das funções TST_CompararXXX, na forma: +* return TST_CompararXXX( valoresperado, funcao a testar , mensagem ) +* +* - as funções de comparação fornecidas sempre geram as mensagens no +* padrão estipulado +* +* - quando não for possível utilizar uma função de comparação, reporte +* a falha, esperadas ou não, através da função +* TST_ImprimirPrefixo( Mensagem ) +* +* - a seguir mostre o valor esperado e o obtido +* +* - Informações relativas a falhas dos testes são sinalizadas por +* uma mensagem iniciando com ">>>" o número da linha do comando de teste +* e o número de falhas encontradas até o momento. +* +* - Informações relativas à execução dos testes são sinalizadas por +* uma mensagem iniciando com "!!!". +* +* $FV Valor retornado +* TST_CondRetErro - caso tenha sido encontrado um ou mais problemas +* TST_CondRetOK - caso o teste tenha terminado com zero problemas +* não esperados. +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* pArqScript - deve referenciar o arquivo script aberto +* pArqLog - deve referenciar o arquivo log aberto +* +***********************************************************************/ + + TST_tpCondRet TST_RealizarTeste( char * Construto ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de casos de teste efetuados +* +* $ED Descrição da função +* Retorna o número de casos de teste lidos. +* Cada caso de teste inicia com o comando "== ". +* +***********************************************************************/ + + int TST_ObterNumCasosTeste( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados +* +* $ED Descrição da função +* Retorna o número de comandos de teste específicos lidos e +* corretamente interpretados. Não conta comandos que retornem não OK +* independentemento do motivo. Também não conta comandos recuperar. +* +***********************************************************************/ + + int ObterNumComandosExecutados( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de problemas encontrados +* +* $ED Descrição da função +* Retorna o número de problemas encontrados. +* O módulo de teste específico sinaliza problemas através de +* uma condição de retorno diferente de TST_CondRetOK. +* São tratados como problema também comandos de teste em erro, +* e todos os comandos de teste de um dado caso de teste ignorados +* em virtude de alguma falha encontrada. +* Portanto, é possível que o número de problemas venha a ser maior do +* que o número de casos de teste existente no script. +* +***********************************************************************/ + + int TST_ObterNumFalhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Incrementar contador de falhas +* +***********************************************************************/ + + void TST_ContarFalhas( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar booleano +* +* $ED Descrição da função +* Compara valor booleano esperado com valor booleano obtido, +* reportamdo uma falha caso não sejam iguais. +* Note que "!= 0" corresponde a TRUE e "== 0" corresponde a FALSE +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for consistente com o obtido +* TST_CondRetOK se os valores forem consistentes +* +***********************************************************************/ + + TST_tpCondRet TST_CompararBool( int ValorEsperado , + int ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar caractere +* +* $ED Descrição da função +* Compara um caractere esperado com um caractere obtido, emitindo mensagem de +* erro caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararChar( char ValorEsperado , + char ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar inteiro +* +* $ED Descrição da função +* Compara valor inteiro long esperado com valor inteiro obtido, +* reportamdo uma falha caso não sejam iguais. +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararInt( long ValorEsperado , + long ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar flutuante +* +* $ED Descrição da função +* Compara valor flutuante esperado com valor flutuante obtido, +* reportando uma falha caso +* 1 - Tolerancia > esperado / obtido ou +* 1 + Tolerancia < esperado / obtido +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* Tolerância - indica os limites da relação entre esperado e obtido. +* Deve ser um valor positivo, menor do que 1. +* Use um valor do tipo 10 ** -n, no qual n é o +* número de dígitos significativos desejado. +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor obtido não estiver dentro do domínio da +* tolerância em torno do valor esperado +* TST_CondRetOK se os valores estiverem dentro da tolerância +* +***********************************************************************/ + + TST_tpCondRet TST_CompararFloat( double ValorEsperado , + double ValorObtido , + double Tolerancia , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar string +* +* $ED Descrição da função +* Compara string esperado com string obtido, reportamdo uma falha +* caso não sejam iguais. Ambos os strings devem obedecer o +* padrão C, terminando em zero. +* +* $EP Parâmetros +* ValorEsperado - é um string fornecido como parâmetro do comando +* de teste. +* ValorObtido - é o string retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararString( char * ValorEsperado , + char * ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar espaço +* +* $ED Descrição da função +* Compara espaços de dados, reportando uma falha caso não sejam iguais. +* Esta função pode ser utilizada para comparar qualquer coisa, +* inclusive valores do tipo "struct" +* O tipo do valor é indefinido e os valores serão exibidos em +* formato hexadecimal, caso não sejam iguais +* +* $EP Parâmetros +* ValorEsperado - ponteiro para o espaço que contém o valor esperado +* ValorObtido - ponteiro para o espaço que contém o valor obtido +* TamEspaco - tamanho do espaço a ser comparado +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , + void * ValorObtido , + int TamEspaco , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro +* +* $ED Descrição da função +* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro nulo +* +* $ED Descrição da função +* Verifica +* - quando ModoEsperado é 0 se o ponteiro é nulo +* - quando ModoEsperado não é 0 se o ponteiro é não nulo +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Assertiva controlada +* +* $ED Descrição da função +* Esta função substitui a função assert de C. +* É utilizada no contexto do arcabouço de teste. +* Ela imprime mensagens mais visíveis tanto no log como na +* janela de comando. +* +* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. +* +* $FV Valor retornado +* Termina a execução do programa com código de retorno == 4 +* +***********************************************************************/ + + #define TST_ASSERT( Expressao ) \ + TST_Assert( Expressao , __LINE__ , __FILE__ ) + + void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Notificar falha +* +* $ED Descrição da função +* Exibe uma mensagem de falha no formato padrão do arcabouço. +* +* $FV Valor retornado +* TST_CondRetErro sempre +* +***********************************************************************/ + + TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir prefixo da mensagem +* +* $ED Descrição da função +* Imprime o prefixo de mensages de falha +* +* $EH Hipóteses assumidas pela função +* O contador de falhas é incrementado somente pela função de teste +* genérica e após à conclusão da interpretação do comando. +* +***********************************************************************/ + + void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char +* +* $EP Parâmetros +* $P tamEspaco - tamanho em bytes do espaço a exibir +* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir +* +***********************************************************************/ + + void TST_ExibirEspacoHexa( int tamEspaco , + void * Ponteiro ) ; + +#undef GENERICO_EXT + +/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ + +#else +#endif diff --git a/DadoPontos/Source/LERPARM.H b/DadoPontos/Source/LERPARM.H new file mode 100644 index 0000000..f12cf3d --- /dev/null +++ b/DadoPontos/Source/LERPARM.H @@ -0,0 +1,463 @@ +#if ! defined( LerParm_ ) +#define LerParm_ +/*************************************************************************** +* +* $MCD Módulo de definição: LER Ler parâmetros de comandos +* +* Arquivo gerado: LerParm.h +* Letras identificadoras: LER +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Provê funções para a leitura e análise léxica dos comandos de teste. +* Pressupõe-se que cada comando de teste esteja integralmente em +* uma linha. +* Cada comando de teste inicia com o caractere '=' seguido de um string +* que identifica o comando. +* Cada comando pode requerer zero ou mais parâmetros que se encontram na +* mesma linha que o comando. +* Parâmetros podem ser literis ou simbólicos. +* Os parâmetros simbólicos precisam ser declarados antes de serem +* utilizados. +* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. +* +* Se for do interesse do programador, módulos de teste específico +* podem ler e processar por conta própria linhas do script. Isto +* pode ser necessário quando um módulo necessita de um grande +* número de parâmetros ou de dados especiais. +* +* $EIU Interface com o usuário pessoa +* Este módulo interpreta os comandos de teste globalmente disponíveis: +* +* =declararparm +* declara o parâmetro do definido com o valor +* pode ser um de: +* i - inteiro (long) +* f - flutuante (double) +* c - caractere +* s - string +* O valor de literal tem que estar em conformidade com o tipo +* +* =exibirdeclaracao +* exibe a declaração do parâmetro em formato "dump de memória" +* +* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. +* +* Estes comandos sempre estarão disponíveis. Os demais comandos de +* teste estão impementados no módulo TESTLER específico para este módulo. +* +***************************************************************************/ + +#if defined( LerParm_OWN ) + #define LerParm_EXT +#else + #define LerParm_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define LER_DIM_NOME 32 +#define LER_DIM_STRING 500 +#define LER_DIM_BUFFER 250 + + +/*********************************************************************** +* +* $TC Tipo de dados: LER Condições de retorno +* +* +***********************************************************************/ + + typedef enum { + + LER_CondRetOK , + /* Ler retorno OK */ + + LER_CondRetNaoAbriu + /* Ler não abriu arquivo */ + + } LER_tpCondRet ; + +/***** Dados exportados pelo módulo *****/ + + /* Estrutura de dados: *LER Dados globais públicos */ + + LerParm_EXT int LER_TamBuffer ; + /* Tamanho do string contido no buffer de leitura + * + *$ED Descrição + * Contém o número total de caracteres do buffer, excluindo o zero. + * Jamais altere este valor. */ + + LerParm_EXT int LER_InxBuffer ; + /* Cursor do buffer de leitura + * + *$ED Descrição + * O cursor de leitura indexa o primeiro caractere não lido contido + * no buffer. + * O cursor é zerado sempre que uma nova linha for lida. + * O cursor é avançado ao ler um parâmetro, sendo colocado no + * primeiro caractere imediatamente após ao parâmetro lido. + * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ + + LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; + /* Buffer de leitura + * + *$ED Descrição + * Contém a linha corrente do script a ser processada. + * Jamais altere o valor do buffer. */ + + +/*********************************************************************** +* +* $FC Função: LER &Inicializar módulo LerParm +* +* $ED Descrição da função +* Inicializa o módulo. +* Deve ser chamada antes de iniciar a análise de comandos. +* Deve ser chamada uma única vez no início ou após terminar o módulo. +* +***********************************************************************/ + + int LER_InicializarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Terminar módulo LerParm +* +* $ED Descrição da função +* Fecha o arquivo de leitura e sinaliza módulo de leitura não +* inicializado. +* Após esta função somente poderá ser chamada a funçãp +* LER_InicializarLeitura +* +***********************************************************************/ + + void LER_TerminarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter nome do arquivo script +* +* $FV Valor retornado +* Retorna o ponteiro para o nome do arquivo script sendo processado. +* Deve-se tomar cuidado para não alterar este nome. +* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. +* +***********************************************************************/ + + char * LER_ObterNomeArqScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter número de linhas lidas até o momento +* +***********************************************************************/ + + int LER_ObterNumLinhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Abrir arquivo script de teste +* +* $ED Descrição da função +* Abre o arquivo que contém o script de teste. +* A extensão default do arquivo de comandos script de teste é +* ".script" e será acrescida ao nome do arquivo caso este não +* contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo contendo o script de teste +* +* $FV Valor retornado +* LER_CondRetOK - caso tenha sido possível abrir o arquivo. +* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. +* Não há discriminação do erro encontrado. +* +***********************************************************************/ + + LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha script eliminando brancos ao final +* +* $ED Descrição da função +* Lê uma linha do arquivo script e elimina os caracteres branco, +* fim de linha, tabulação etc. do final da linha lida. +* +* $FV Valor retornado +* Retorna o tamanho da linha lida. +* Será: +* -1 caso tenha ocorrido fim de arquivo. +* -2 caso tenha ocorrido algum problema de leitura. +* +***********************************************************************/ + + int LER_LerLinhaScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Interpretar comandos de teste +* +* $ED Descrição da função +* Interpreta os comandos de teste disponibilizados pelo módulo +* de leitura. +* +* Ver a descrição do módulo para mais detalhes +* +* $EP Parâmetros +* $P - Comando de teste a ser interpretado +* +* $FV Valor retornado +* TST_CondRetOK - caso tenha interpretado corretamente +* TST_CondRetNaoExecutou - caso o comando de teste a interpretar +* não pertença ao conjunto de LER +* TST_CondRetErro - caso o comando de teste é do conjunto de LER +* e está sintaticamente errado. +* Neste caso é gerada uma mensagem de erro no +* log. +* +***********************************************************************/ + + TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Declarar parâmetro simbólico +* +* $EP Parâmetros +* Interpreta uma linha de comando de teste contendo uma declaração de +* nome simbólico. +* Todas as declarações têm o formato: +* =declararparm +* em que o deve estar consistente com o +* São geradas mensagens de erro no log de teste caso a declaração +* não possa ser realizada. +* +* $FV Valor retornado +* TRUE - se a declaração ocorreu +* FALSE - caso contrário +* +***********************************************************************/ + + int LER_DeclararParametro( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Exibir declaração de símbolo +* +* $ED Descrição da função +* Exibe o Símbolo e o valor associado ao símbolo, sendo que este +* é exibido em hexadecimal. +* +***********************************************************************/ + + void LER_ExibirParametro( char * Simbolo ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha de parâmetros +* +* $ED Descrição da função +* Lê um número variável de parâmetros +* +* $EP Parâmetros +* $P Tipos é um string contendo a identificação dos tipos dos parâmetros +* a serem lidos. +* $P ... Os demais parâmetros são referências (ponteiros) para os +* espaços onde deverão ser armazenados os valores lidos. +* +* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista +* de referência e o string de tipos tenha o mesmo tamanho +* e que os indicadores de tipo sejam consistentes com a referência +* posicionalmente correspondentes. +* +* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já +* declarado. Caso isto seja possível e o tipo esteja correto +* é "lido" o valor contido no parâmetro. +* Caso não seja possível, tenta ler um literal em acordo com o tipo +* dado. +* +* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada +* e tipo inconsistente com o solicitado no correspondente caractere no +* string Tipos. +* +* $FV Valor retornado +* Retorna o número de campos lidos até concluir ou até encontrar +* um erro. +* +***********************************************************************/ + + int LER_LerParametros( char * Tipos , ... ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro caractere +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do caractere lido +* +* $EIU Interface com usuário pessoa +* Um caractere deve vir entre aspas simples. Valem os caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmChar( char * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro inteiro +* +* $EP Parâmetros +* $P Parm é um ponteiro para um int que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do int lido +* +* $EIU Interface com usuário pessoa +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmInt( int * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro flutuante +* +* $EP Parâmetros +* $P Parm é um ponteiro para um double que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do double lido +* +* $EIU Interface com usuário pessoa +* São válidas todas as formas de literal double aceitas pelo scanf. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmDouble( double * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro nome +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o nome lido +* $P tamString é o tamanho do nome que foi lido +* $P dimString é o tamanho máximo que o nome poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do nome lido +* +* $EIU Interface com usuário pessoa +* São válidas as mesmas regras de nomes C. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro string +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o string lido +* $P tamString é o tamanho do string que foi lido +* $P dimString é o tamanho máximo que o string poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do string lido +* +* $EIU Interface com usuário pessoa +* Um string deve vir entre aspas duplas. +* Um string pode conter caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Pular comando de teste +* +* $ED Descrição da função +* Avança o cursor do buffer de leitura por cima de um comando de teste. +* Todos os comandos de teste principiam com o prefixo '=' +* +***********************************************************************/ + + void LER_PularComando( void ) ; + +#undef LerParm_EXT + +/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ + +#else +#endif diff --git a/DadoPonto/TESTDADOPONTOS.c b/DadoPontos/Source/TESTDADOPONTOS.c similarity index 91% rename from DadoPonto/TESTDADOPONTOS.c rename to DadoPontos/Source/TESTDADOPONTOS.c index e7b289b..ef3273c 100644 --- a/DadoPonto/TESTDADOPONTOS.c +++ b/DadoPontos/Source/TESTDADOPONTOS.c @@ -110,7 +110,7 @@ tppDadoPontos P[MAX]; return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar a peca." ); + "Retorno errado ao criar ao criar dadopontos." ); } /* fim ativa: Testar Criar Dado Pontos */ @@ -154,10 +154,10 @@ tppDadoPontos P[MAX]; return Ret ; } /* if */ - return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); + return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o dono do dado"); } - /* fim ativa: Testar DadoPontos Dobrar Dado*/ + /* fim ativa: Testar Obter Dono do DadoPonto*/ /* Testar Dadoponto DobrarDado */ else if ( strcmp( ComandoTeste , DOBRAR_DADO_CMD ) == 0 ) @@ -174,11 +174,11 @@ tppDadoPontos P[MAX]; CondRetObtido = DADPtn_DobrarDado(P[inxpec],corEsperada); return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar a peca." ); + "Retorno errado ao dobrar o valor do dadopontos." ); } /* fim ativa: Fim Dobrar Dado */ - /* Testar Dadoponto Valor Partida */ + /* Testar Dadoponto Obter Valor */ else if ( strcmp( ComandoTeste , OBTER_VALORPARTIDA_CMD ) == 0 ) { @@ -192,14 +192,17 @@ tppDadoPontos P[MAX]; CondRetObtido = DADPtn_ValorPartida(P[inxpec],&ValorPontos); - Ret = TST_CompararChar( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; + Ret = TST_CompararInt( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar a peca." ); - - } /* fim ativa: Fim Dobrar Dado */ + if ( Ret != TST_CondRetOK ) + { + return Ret ; + } + return TST_CompararInt( CondRetObtido, CondRetEsperada , + "Retorno errado ao obter valor do dado pontos." ); + } /* fim ativa: Fim Dobrar Dado */ return TST_CondRetNaoConhec ; diff --git a/DadoPontos/Source/TST_ESPC.H b/DadoPontos/Source/TST_ESPC.H new file mode 100644 index 0000000..987ff8e --- /dev/null +++ b/DadoPontos/Source/TST_ESPC.H @@ -0,0 +1,320 @@ +#if ! defined( Tst_Espc_ ) +#define Tst_Espc_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTE Interface de teste específico +* +* Arquivo gerado: Tst_Espc.h +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Este módulo consta somente do módulo de definição de todos os módulos +* de teste específicos a serem desenvolvidos, e também da especificação +* do tipo de condições de retorno deste módulo. +* +* Ele estabelece a interface a ser utilizada pelo módulo de teste +* genérico com todos os módulos de teste específico a serem +* desenvolvidos. +* +* Os módulos de teste específico devem sempre incluir este módulo +* de definição e, idealmente, não devem adicionar mais itens +* à interface. +* +* O módulo de teste específico contém a função de teste de um +* determinado módulo ou conjunto de módulos. Mais especificamente, +* contém a função que interpreta os comandos de teste que exercitarão +* as funções do(s) módulo(s) em teste. +* +* Poderá conter também diversas funções auxiliares requeridas para +* realizar os testes, vide "contexto" a seguir. +* +* O contexto é formado por variáveis e estruturas auxiliares necessárias +* para que se possa efetuar todos os comandos de teste. +* Por exemplo pode-se desejar testar várias instâncias de uma +* mesma estrutura. Uma forma de resolver isto é criar um vetor +* global static +* de n elementos em que cada elemento aponta para a cabeça de +* uma determinada instância dessa estrutura. Para realizar um +* teste relativo a uma determinada instância, torna-se necessário +* selecioná-la através de um índice contido no comando de teste. +* Este parâmetro, embora seja um índice, é na realidade o identificador +* da instância da estrutura a ser manipulada (idEstrutura). +* +* Caso o módulo em teste requeira um contexto, este deverá ser +* estabelecido no presente módulo. Para tal devem ser declaradas +* variáveis e estruturas encapsuladas e devem ser incluídos comandos +* de teste capazes de manipular o contexto. +* +* Uma das formas para estabelecer o contexto seria a de incluir +* no mçodulo de teste específico comando semelhantes a: +* +* =iniciaXXX que inicializa o contexto do módulo sob teste para +* vazio. Este comando deve ser utilizado uma única vez +* logo ao inciar a execução do teste. +* =reset restaura o contexto para vazio. Este comando usualmente +* assumirá que o contexto a esvaziar esteja correto. +* O comando deverá liberar os espaços alocados aos +* elementos, anular as referências a ele, inicializar +* valores de vetores de referências, etc. +* O comando tem utilidade especial ao segmentar um teste +* em partes estanques e ao controlar vazamento de +* memória. +* =terminaXXX este comando destrói todo o contexto e não o +* reinicializa. O objetivo é poder verificar vazamento +* de memória. +* +* Evidentemente, outra forma seria a de alterar as funções de +* inicialização e término do módulo de teste genérico o que é pouco +* recomendável pois viola o princípio de um mesmo módulo genérico +* servir para testar todos os construtos. +* +* Para cada função do módulo a ser testado deve existir pelo menos +* um comando de teste. Em alguns casos pode ser interessante criar +* comandos que armazenem, alterem ou consultem variáveis de +* estado do próprio módulo de teste. Ver os comentários sobre +* contexto acima. Ou seja, podem existir comandos de teste que +* têm o propósito de agir sobre o contexto e, não, o de efetuar +* um determinado teste. Alguns desses comandos podem inclusive +* realizar verificações entre um resultado esperado e existente +* no contexto. +* +* Todos os controles de consistência dos parâmetros dos comandos +* de teste devem ser realizados no módulo de teste específico. +* Recomenda-se que seja sempre retornado TST_CondRetParm, +* sinalizando erro de sintaxe do comando de teste ou valores +* não permitidos. Deve ser sempre assumido que os parâmetros +* podem estar em erro. Ou seja, o controle da integridade dos +* comando é mandatória. +* +* Caso seja necessário emitir mensagens especiais, +* deve ser utilizada a função genérica "TST_ExibirPrefixo". +* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, +* (prefixo, ou comparar), utilize a função +* fprintf( TST_ObterArqLog( ) , "..." , ... ) +* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") +* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção +* assegura a consistência do aspecto das mensagens com o restante do +* programa de teste. +* +* Cada comando deve ser completamente interpretado pelo seu +* respectivo fragmento de interpretação. Ou seja, não deverá ser +* retornado para o módulo genérico qualquer dado adicional à +* condição de retorno da função de teste específico. Veja +* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes +* à mensagen já exibida. +* +* A função TST_NotificarFalha sempre registra uma falha, enquanto que +* a função TST_ExibirPrefixo pode ser usada para emitir mensagens +* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo +* seja utilizada para sinalizar uma falha, é necessário chamar +* também a função TST_ContarFalha( ) para que seja notificada a falha. +* Isto não é necessário no caso da função TST_NotificarFalha, pois +* esta sempre conta falhas. +* +* As funções a testar que retornem um valor sempre devem ter +* este valor verificado, mesmo que seja uma condição de retorno. +* Utilize para isto uma das funções " Comparar" do arcabouço. +* Caso uma função retorne dois ou mais valores, incluindo +* a condição de retorno, utilize um código semelhante ao +* descrito a seguir. +* +* Seja +* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... +* a função a ser testada e, v1, v2, ... os dados retornados de +* alguma forma (valor retornado, parâmetro por referência, variável +* global). Assumindo que v1 seja o valor retornado. +* +* v1Obtido = FuncATestar( ... +* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* +* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* ... +* +* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; +* +***************************************************************************/ + +#if defined( Tst_Espc_OWN ) + #define Tst_Espc_EXT +#else + #define Tst_Espc_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define SINALIZA_ERRO ">>>" +#define SINALIZA_RECUPERA "<<<" +#define SINALIZA_COMENTARIO "!!!" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste específico +* +* +* $ED Descrição do tipo +* Este tipo enumera todas as condições de retorno que podem ser +* geradas pela função de teste específica. +* +***********************************************************************/ + + typedef enum { + + TST_CondRetOK , + /* Comando de teste executou corretamente */ + + TST_CondRetErro , + /* Comando de teste encontrou uma ou mais falhas + * + *$ED Descrição + * Esta condição sinaliza que um ou mais resultados da execução + * da função sob teste resultou em um valor diferente do esperado. */ + + TST_CondRetParm , + /* Comando de teste está com a sintaxe em erro + * + *$ED Descrição + * A presente condição de retorno deve ser retornada caso a sintaxe + * ou os valores do comando de teste estiverem em erro. + * + * Todos os fragmentos de interpretação devem: + * - realizar a análise dos parâmetros do comando + * - verificar se todos os parâmetros foram lidos + * - verificar se os valores dos parâmetros estão corretos + * por exemplo: verificar se os índices de acesso a elementos + * estão dentro dos limites dos correspondentes vetores. + * - efetuar a função a testar + * - verificar se os resultados retornados por esta função estão + * corretos */ + + TST_CondRetNaoExecutou , + /* Comando de teste não se destina ao presente interpretador + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de comandos de teste relativas a módulos do próprio arcabouço, + * caso não tenha sido encontrado um comando válido. Isso permite + * estabelecer um "daisy chain" de interpretadores em que cada qual + * tenha finalidade específica no contexto do arcabouço. */ + + TST_CondRetNaoConhec , + /* Comando de teste não é conhecido + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de casos de teste específico visando determinado módulo em teste, + * sempre que esse interpretador não consiga identificar o comando. + * + * Cabe salientar a diferença entre TST_CondRetNaoExecutou e + * TST_CondRetNaoConhec. A primeira corresponde à não interpretação + * de um comando possivelmente válido em interpretadores subsequentes. + * A segunda corresponde a comandos não válidos considerando todos + * os interpretadores. */ + + TST_CondRetNaoImplementado , + /* Comando de teste não implementado + * + *$ED Descrição + * Esta condição deve ser retornada ao interpretar um comando de teste + * específico ainda não implementado. + * + * Recomenda-se que o desenvolvimento dos módulos sob teste e do + * correpondente módulo de teste específico se dê incrementalmente. + * Consequentemente diversos comandos não estarão implementados + * no início do desenvolvimento. Esta incompleteza poderá ser + * sinalizada com esta condição de retorno. */ + + TST_CondRetMemoria + /* Faltou memória para executar o comando + * + *$ED Descrição + * Esta condição deve ser retornada caso tenha ocorrido algum erro + * quando o módulo de teste específico tentar alocar memória ou + * outro recurso. */ + + } TST_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: TSTE &Efetuar comandos de teste específicos +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* sendo testado. +* +* Cada módulo de teste específico deve desenvolver esta função. +* Poderá conter diversas outras conforme necessário. No entanto +* estas devem todas ser funções encapsuladas no módulo (static) +* +* Freqüentemente é necessário desenvolver um contexto para o teste. +* Por exemplo, pode ser necessário tratar n elementos disponibilizados +* pelo módulo sob teste. Neste caso deveria ser criado um vetor +* global com referências para estas elemento. Ao iniciar os teste +* este vetor deverá ser inicializado. Ao terminar, os elementos do +* vetor referenciando algum elemento devem ser destruídos. +* +* Todos os controles de consistência devem ser realizados no +* módulo de teste específico. +* +* A função TST_EfetuarComando( ) deve retornar as condições de retorno +* identificadas no tipo TST_tpCondRet. +* +* As funções do módulo sob teste que retornam algum valor sempre +* devem sempre ter este valor verificado, mesmo sendo uma condição de +* retorno. Para fazer a vereficação da corretude, recomenda-se +* utilizar as funções TST_CompararXXX definidas no módulo genérico. +* Assegura-se assim a uniformidade da saída gerada durante o teste. +* +* Para realizar a análise de um comando de teste recomenda-se +* utilizar as funções definidas no módulo LerParm. Elas, além +* de realizarem a análise léxica, permitem o uso intercambiável +* de parâmetros simbólicos ou literais. Também realizam a +* verificação da corretude dos tipos dos parâmetros, contribuindo +* assim para a redução de erros de redação de scripts de teste +* que possam passar despercebidos. +* +* As funções a serem testadas que requeiram algum argumento, devem +* ser chamadas com valores (parâmetros) extraídos do comando de +* teste sendo executado. Use sempre as funções do módulo LerParm +* para realizar a análise sintática. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* TST_CondRetXXX - veja a descriÓcão dos possíveis valores +* retornados na especificação do correspondente +* enum +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; + +#undef Tst_Espc_EXT + +/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ + +#else +#endif diff --git a/DadoPontos/TRAB2-2.exe b/DadoPontos/TRAB2-2.exe new file mode 100644 index 0000000000000000000000000000000000000000..13e96351d106f7e2aa73c23e6b8beb5fa3451f62 GIT binary patch literal 76800 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 SK|0K` logTesteDadoPontos.txt \ No newline at end of file diff --git a/DadoPonto/testescript.script b/DadoPontos/TesteDadoPontos.script similarity index 95% rename from DadoPonto/testescript.script rename to DadoPontos/TesteDadoPontos.script index b1b1fbc..76f8783 100644 --- a/DadoPonto/testescript.script +++ b/DadoPontos/TesteDadoPontos.script @@ -36,12 +36,11 @@ =obterdono 0 'b' 0 == Obter Valor Errado -=obtervalorpartida 0 63 0 +=obtervalorpartida 0 63 1 =recuperar == Obter Valor =obtervalorpartida 0 64 0 - == Destruir DadoPontos =destruirdadoponto 0 0 \ No newline at end of file diff --git a/DadoPontos/logTesteDadoPontos.txt b/DadoPontos/logTesteDadoPontos.txt new file mode 100644 index 0000000..a9a799e --- /dev/null +++ b/DadoPontos/logTesteDadoPontos.txt @@ -0,0 +1,39 @@ + + +LES - Laboratório de Engenharia de Software DI/PUC-Rio + Arcabouço de teste de módulos C (c) 2006 + +--------------------------------------------- + Construto sob teste: TRAB2-2 + + Arquivo de teste: TesteDadoPontos + + +!!! 0 Linha: 1 // SCRIPT DE TESTE PARA O MODULO DADOSPnt + 2 == Criar DadoPontos + 5 == Obter Dono + 8 == Obter Valor + 11 == Dobrar Dado + 14 == Obter Dono + 17 == Obter Valor + 20 == Dobrar Dado + 23 == Dobrar Dado + 26 == Dobrar Dado + 29 == Obter Valor + 32 == Dobrar Dado + 35 == Obter Dono + 38 == Obter Valor Errado +>>> 1 Linha: 39 Valor da Partida Errado Deveria ser: 63 É: 64 +<<< 0 Linha: 40 Falha esperada foi recuperada. + 42 == Obter Valor + 45 == Destruir DadoPontos + +!!! Número de linhas lidas: 46 +!!! Número de casos de teste: 15 +!!! Número comandos corretos: 14 +!!! Número de falhas encontradas: 0 + +!!! Não foram encontrados problemas + + +!!! Numero de espacos ainda alocados: 0 \ No newline at end of file diff --git a/README.txt b/README.txt deleted file mode 100644 index e69de29..0000000 diff --git a/TESTDADOPONTOS.c b/TESTDADOPONTOS.c index e7b289b..e6338a5 100644 --- a/TESTDADOPONTOS.c +++ b/TESTDADOPONTOS.c @@ -110,7 +110,11 @@ tppDadoPontos P[MAX]; return TST_CompararInt( CondRetEsperada , CondRetObtido , +<<<<<<< HEAD "Retorno errado ao criar a peca." ); +======= + "Retorno errado ao criar ao criar dadopontos." ); +>>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e } /* fim ativa: Testar Criar Dado Pontos */ @@ -154,10 +158,17 @@ tppDadoPontos P[MAX]; return Ret ; } /* if */ +<<<<<<< HEAD return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); } /* fim ativa: Testar DadoPontos Dobrar Dado*/ +======= + return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o dono do dado"); + + } + /* fim ativa: Testar Obter Dono do DadoPonto*/ +>>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e /* Testar Dadoponto DobrarDado */ else if ( strcmp( ComandoTeste , DOBRAR_DADO_CMD ) == 0 ) @@ -174,11 +185,19 @@ tppDadoPontos P[MAX]; CondRetObtido = DADPtn_DobrarDado(P[inxpec],corEsperada); return TST_CompararInt( CondRetEsperada , CondRetObtido , +<<<<<<< HEAD "Retorno errado ao criar a peca." ); } /* fim ativa: Fim Dobrar Dado */ /* Testar Dadoponto Valor Partida */ +======= + "Retorno errado ao dobrar o valor do dadopontos." ); + + } /* fim ativa: Fim Dobrar Dado */ + + /* Testar Dadoponto Obter Valor */ +>>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e else if ( strcmp( ComandoTeste , OBTER_VALORPARTIDA_CMD ) == 0 ) { @@ -192,6 +211,7 @@ tppDadoPontos P[MAX]; CondRetObtido = DADPtn_ValorPartida(P[inxpec],&ValorPontos); +<<<<<<< HEAD Ret = TST_CompararChar( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; return TST_CompararInt( CondRetEsperada , CondRetObtido , @@ -200,6 +220,19 @@ tppDadoPontos P[MAX]; } /* fim ativa: Fim Dobrar Dado */ +======= + Ret = TST_CompararInt( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; + + if ( Ret != TST_CondRetOK ) + { + return Ret ; + } + + return TST_CompararInt( CondRetObtido, CondRetEsperada , + "Retorno errado ao obter valor do dado pontos." ); + + } /* fim ativa: Fim Dobrar Dado */ +>>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e return TST_CondRetNaoConhec ; From 158280f9d057596373993ec8e1cff1a659f5d107 Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Wed, 23 Sep 2015 22:43:22 -0300 Subject: [PATCH 10/18] tabuleiro testado e funcionando --- tabuleiro/PECA.C | 3 +- tabuleiro/TABULEIRO.C | 78 ++++++++++++++++-- tabuleiro/TABULEIRO.H | 7 +- tabuleiro/TESTTABULEIRO.C | 161 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 236 insertions(+), 13 deletions(-) create mode 100644 tabuleiro/TESTTABULEIRO.C diff --git a/tabuleiro/PECA.C b/tabuleiro/PECA.C index 696d6a6..35951db 100644 --- a/tabuleiro/PECA.C +++ b/tabuleiro/PECA.C @@ -37,8 +37,6 @@ ***********************************************************************/ typedef struct tgPeca{ - int *posicao; - /*Pontei para a posicao da peca, ainda deve ser alterado pelo tipo correto.*/ char cor; /*Devemos usar um inteiro para facilitar a manipulacao da peça pela cor? Porem a cor tambem determia qual jogador tem a posse da peca*/ @@ -51,6 +49,7 @@ typedef struct tgPeca{ /***** Código das funções exportadas pelo módulo *****/ + /*************************************************************************** * * Função: Pec Criar Peça diff --git a/tabuleiro/TABULEIRO.C b/tabuleiro/TABULEIRO.C index e0ae02a..572c12a 100644 --- a/tabuleiro/TABULEIRO.C +++ b/tabuleiro/TABULEIRO.C @@ -17,7 +17,7 @@ * 3 avs 08/dez/2004 uniformização dos exemplos * 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto * 1 avs 16/abr/2003 início desenvolvimento -* + ***************************************************************************/ #include @@ -104,9 +104,9 @@ TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, for(i = 0; i < 24; i++) LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); - free(vtCasa); - free(vtPecaB); - free(vtPecaP); + //free(vtCasa); + //free(vtPecaB); + //free(vtPecaP); return TAB_CondRetOK; } @@ -115,15 +115,16 @@ TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) { - LIS_tppLista temp; - int i; + //LIS_tppLista temp; +// int i; // Destroi as 24 casas - for(i = 0; i < 24; i++) + //IrFinalLista(pTab->Casas); + /*for(i = 0; i < 24; i++) { temp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); LIS_DestruirLista(temp); LIS_AvancarElementoCorrente(pTab->Casas, -1); - } + }*/ // Destroi a lista principal LIS_DestruirLista(pTab->Casas); // Libera o ponteiro para o tabuleiro @@ -132,6 +133,67 @@ TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) return TAB_CondRetOK; } + TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) + { + tppPeca pecatemp1, pecatemp2; + char cor; + LIS_tppLista listatemp; + int mov = casaDestino - casaOrigem; + + // Ir para a casa de origem + IrInicioLista(pTab->Casas); + LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); + + // Obter referência para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Obter a cor da peca na lista temp + pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); + // se pecatemp1 == NULL entao a lista está vazia + if(pecatemp1 == NULL) + { + printf("casa de origem esta vazia \n"); + return TAB_CondRetErro; + } + else // se nao + { + Pec_ObterCor(pecatemp1, &cor); + } + + // Excluir uma peça da lista temp + if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) + { + printf("Erro ao excluir peca da casa de orgiem\n"); + return TAB_CondRetErro; + } + + // Avança para a casa destino + LIS_AvancarElementoCorrente(pTab->Casas, mov); + + // Obtem a referencia para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Criar uma peça com a mesma cor q a peça antiga + if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) + { + printf("Erro ao criar a peca na casa destino \n"); + return TAB_CondRetErro; + } + + // Adiciona esta peça na casa de destino + if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) + { + printf("Erro ao adicionar peca na casa destino \n"); + return TAB_CondRetErro; + } + + return TAB_CondRetOK; + } + + + + + diff --git a/tabuleiro/TABULEIRO.H b/tabuleiro/TABULEIRO.H index 7b024aa..979688c 100644 --- a/tabuleiro/TABULEIRO.H +++ b/tabuleiro/TABULEIRO.H @@ -80,6 +80,8 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; /* Concluiu corretamente */ TAB_CondRetErro, + TAB_CondRetFaltouMemoria, + } TAB_tpCondRet ; @@ -131,7 +133,7 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * ***********************************************************************/ - void LIS_DestruirTabuleiro( TAB_tppTabuleiro pTab ) ; + TAB_tpCondRet TAB_DestruirTabuleiro( TAB_tppTabuleiro pTab ) ; /*********************************************************************** @@ -147,8 +149,7 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * ***********************************************************************/ - void TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; - + TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; /***********************************************************************/ diff --git a/tabuleiro/TESTTABULEIRO.C b/tabuleiro/TESTTABULEIRO.C new file mode 100644 index 0000000..0618ea5 --- /dev/null +++ b/tabuleiro/TESTTABULEIRO.C @@ -0,0 +1,161 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTPECA.C +* Letras identificadoras: TPec +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); +* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); +* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +***************************************************************************/ + +#include +#include +#include +#include "TST_ESPC.H" +#include "GENERICO.h" +#include "lerparm.h" + +#include "TABULEIRO.H" + +/* Tabela dos nomes dos comandos de teste específicos */ +#define CRIAR_TABULEIRO_CMD "=criartabuleiro" +#define DESTRUIR_TABULEIRO_CMD "=destruirtabuleiro" +#define MOVER_PECA_CMD "=moverpeca" + +TAB_tppTabuleiro Tab; +/***** Código das funções exportadas pelo módulo *****/ + +/***** Protótipos das funções encapuladas no módulo *****/ + + static void DestruirValor( void * pValor ) ; + +/***** Código das funções exportadas pelo módulo *****/ + + +/*********************************************************************** +* +* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Peca sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = TAB_CondRetOK ; + int CondRetEsperada = TAB_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + char corEsperada = 'x'; + + int NumLidos = -1 ; + int i = 0; + int PosicaoReferencia, PosicaoFinal; + + /* Testar Criar Tabuleiro */ + if ( strcmp( ComandoTeste , CRIAR_TABULEIRO_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = TAB_CriarTabuleiro(&Tab, DestruirValor); + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar o tabuleiro." ); + + } /* fim ativa: Testar Criar Tabuleiro */ + + /* Testar Destruir Tabuleiro*/ + else if ( strcmp( ComandoTeste , DESTRUIR_TABULEIRO_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = TAB_DestruirTabuleiro(Tab) ; + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao destruir o tabuleiro" ); + + } /* fim ativa: Testar destruir tabuleiro */ + + /* Testar Tabuleiro Mover Peca*/ + else if ( strcmp( ComandoTeste , MOVER_PECA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "iii" , + &PosicaoReferencia,&PosicaoFinal , &CondRetEsperada ) ; + if ( NumLidos != 3) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = TAB_MoverPeca(Tab, PosicaoReferencia, PosicaoFinal ) ; + + return TST_CompararInt(CondRetObtido, CondRetEsperada, "Retorno errado ao mover a peca"); + + } /* fim ativa: Testar Tabuleiro Mover Peca */ + return TST_CondRetNaoConhec ; + + } /* Fim função: Tab Efetuar operações de teste específicas para Tabuleiro */ + + /*********************************************************************** +* +* $FC Função: TLIS -Destruir valor +* +***********************************************************************/ + +void DestruirValor( void * pValor ) + { + + free( pValor ) ; + + } /* Fim função: TLIS -Destruir valor */ \ No newline at end of file From 02c7a1f8ab730217a5b40132778fdbe14265c406 Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Wed, 23 Sep 2015 23:33:50 -0300 Subject: [PATCH 11/18] Script de teste do modulo tabuleiro completo e funcionando --- tabuleiro/TABULEIRO.C => TABULEIRO.C | 0 tabuleiro/TABULEIRO.H => TABULEIRO.H | 0 tabuleiro/TESTTABULEIRO.C => TESTTABULEIRO.C | 0 tabuleiro/TRAB2-1.exe | Bin 0 -> 82432 bytes tabuleiro/logsaidatabuleiro.txt | 30 +++ tabuleiro/{ => source}/ArcaboucoTeste.lib | Bin tabuleiro/{ => source}/DADO.H | 0 tabuleiro/{ => source}/DADO.c | 0 tabuleiro/{ => source}/GENERICO.H | 0 tabuleiro/{ => source}/LERPARM.H | 0 tabuleiro/{ => source}/LISTA.C | 0 tabuleiro/{ => source}/LISTA.H | 0 tabuleiro/{ => source}/PECA.C | 0 tabuleiro/{ => source}/PECA.h | 0 tabuleiro/source/TABULEIRO.C | 205 +++++++++++++++++++ tabuleiro/source/TABULEIRO.H | 163 +++++++++++++++ tabuleiro/source/TESTTABULEIRO.C | 161 +++++++++++++++ tabuleiro/{ => source}/TST_ESPC.H | 0 tabuleiro/testetabuleiro.bat | 1 + tabuleiro/testetabuleiroscript.script | 17 ++ teste1wz.txt | 0 21 files changed, 577 insertions(+) rename tabuleiro/TABULEIRO.C => TABULEIRO.C (100%) rename tabuleiro/TABULEIRO.H => TABULEIRO.H (100%) rename tabuleiro/TESTTABULEIRO.C => TESTTABULEIRO.C (100%) create mode 100644 tabuleiro/TRAB2-1.exe create mode 100644 tabuleiro/logsaidatabuleiro.txt rename tabuleiro/{ => source}/ArcaboucoTeste.lib (100%) rename tabuleiro/{ => source}/DADO.H (100%) rename tabuleiro/{ => source}/DADO.c (100%) rename tabuleiro/{ => source}/GENERICO.H (100%) rename tabuleiro/{ => source}/LERPARM.H (100%) rename tabuleiro/{ => source}/LISTA.C (100%) rename tabuleiro/{ => source}/LISTA.H (100%) rename tabuleiro/{ => source}/PECA.C (100%) rename tabuleiro/{ => source}/PECA.h (100%) create mode 100644 tabuleiro/source/TABULEIRO.C create mode 100644 tabuleiro/source/TABULEIRO.H create mode 100644 tabuleiro/source/TESTTABULEIRO.C rename tabuleiro/{ => source}/TST_ESPC.H (100%) create mode 100644 tabuleiro/testetabuleiro.bat create mode 100644 tabuleiro/testetabuleiroscript.script delete mode 100644 teste1wz.txt diff --git a/tabuleiro/TABULEIRO.C b/TABULEIRO.C similarity index 100% rename from tabuleiro/TABULEIRO.C rename to TABULEIRO.C diff --git a/tabuleiro/TABULEIRO.H b/TABULEIRO.H similarity index 100% rename from tabuleiro/TABULEIRO.H rename to TABULEIRO.H diff --git a/tabuleiro/TESTTABULEIRO.C b/TESTTABULEIRO.C similarity index 100% rename from tabuleiro/TESTTABULEIRO.C rename to TESTTABULEIRO.C diff --git a/tabuleiro/TRAB2-1.exe b/tabuleiro/TRAB2-1.exe new file mode 100644 index 0000000000000000000000000000000000000000..bf3fdb233a290dfece6a061aec12115e98ed16d0 GIT binary patch literal 82432 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%0DuY+@IyVS*NLQROeP`bwbZ$Z}b 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 1 Linha: 10 Retorno errado ao mover a peca Deveria ser: 1 É: 0 +<<< 0 Linha: 11 Falha esperada foi recuperada. + 13 == Mover Peca da casa 23 para a 0 + 16 == Destruir Tabuleiro + +!!! Número de linhas lidas: 17 +!!! Número de casos de teste: 5 +!!! Número comandos corretos: 4 +!!! Número de falhas encontradas: 0 + +!!! Não foram encontrados problemas + + +!!! Numero de espacos ainda alocados: 0 \ No newline at end of file diff --git a/tabuleiro/ArcaboucoTeste.lib b/tabuleiro/source/ArcaboucoTeste.lib similarity index 100% rename from tabuleiro/ArcaboucoTeste.lib rename to tabuleiro/source/ArcaboucoTeste.lib diff --git a/tabuleiro/DADO.H b/tabuleiro/source/DADO.H similarity index 100% rename from tabuleiro/DADO.H rename to tabuleiro/source/DADO.H diff --git a/tabuleiro/DADO.c b/tabuleiro/source/DADO.c similarity index 100% rename from tabuleiro/DADO.c rename to tabuleiro/source/DADO.c diff --git a/tabuleiro/GENERICO.H b/tabuleiro/source/GENERICO.H similarity index 100% rename from tabuleiro/GENERICO.H rename to tabuleiro/source/GENERICO.H diff --git a/tabuleiro/LERPARM.H b/tabuleiro/source/LERPARM.H similarity index 100% rename from tabuleiro/LERPARM.H rename to tabuleiro/source/LERPARM.H diff --git a/tabuleiro/LISTA.C b/tabuleiro/source/LISTA.C similarity index 100% rename from tabuleiro/LISTA.C rename to tabuleiro/source/LISTA.C diff --git a/tabuleiro/LISTA.H b/tabuleiro/source/LISTA.H similarity index 100% rename from tabuleiro/LISTA.H rename to tabuleiro/source/LISTA.H diff --git a/tabuleiro/PECA.C b/tabuleiro/source/PECA.C similarity index 100% rename from tabuleiro/PECA.C rename to tabuleiro/source/PECA.C diff --git a/tabuleiro/PECA.h b/tabuleiro/source/PECA.h similarity index 100% rename from tabuleiro/PECA.h rename to tabuleiro/source/PECA.h diff --git a/tabuleiro/source/TABULEIRO.C b/tabuleiro/source/TABULEIRO.C new file mode 100644 index 0000000..572c12a --- /dev/null +++ b/tabuleiro/source/TABULEIRO.C @@ -0,0 +1,205 @@ +/*************************************************************************** +* $MCI Módulo de implementação: LIS Lista duplamente encadeada +* +* Arquivo gerado: LISTA.c +* Letras identificadoras: LIS +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento + +***************************************************************************/ + +#include +#include +#include +#include +#include + +#define TABULEIRO_OWN +#include "LISTA.H" +#include "GENERICO.H" +#include "PECA.h" +#include "TABULEIRO.H" + +#undef TABULEIRO_OWN + +/*********************************************************************** +* +* $TC Tipo de dados: TAB Tabuleiro +* +* +***********************************************************************/ + +typedef struct TAB_tagTabuleiro { + + LIS_tppLista Casas; + +} TAB_tpTabuleiro; + + +/***** Código das funções exportadas pelo módulo *****/ + +/*************************************************************************** +* +* Função: LIS &Criar Tabuleiro +* ****/ + +TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, + void ( * ExcluirValor ) ( void * pDado ) ) +{ + LIS_tppLista vtCasa[24]; // vetor de casas auxiliar + tppPeca vtPecaB[15]; // vetor de peças brancas + tppPeca vtPecaP[15]; //vetor de peças pretas + int i, jb = 0,jp = 0; + + *pTab = (TAB_tppTabuleiro)malloc(sizeof(TAB_tpTabuleiro)); + (*pTab)->Casas = LIS_CriarLista(ExcluirValor); + + /* Cria 15 peças brancas */ + for(i = 0; i < 15; i++) + if(Pec_CriarPeca(&vtPecaB[i], 'b')!=Pec_CondRetOK) + return TAB_CondRetErro; + /* Cria 15 peças pretas */ + for(i = 0; i < 15; i++) + if(Pec_CriarPeca(&vtPecaP[i], 'p')!=Pec_CondRetOK) + return TAB_CondRetErro; + /* Cria 24 listas que representam cada casa do tabuleiro*/ + for(i = 0; i < 24; i++) + vtCasa[i] = LIS_CriarLista(ExcluirValor); + + // Pretas + LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; + LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; + // Brancas + LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; + LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; + for(i = 0; i < 5; i++) + { + // Pretas + LIS_InserirElementoApos(vtCasa[5], vtPecaP[jp]); jp++; + LIS_InserirElementoApos(vtCasa[12], vtPecaP[jp]); jp++; + // Brancas + LIS_InserirElementoApos(vtCasa[11], vtPecaB[jb]); jb++; + LIS_InserirElementoApos(vtCasa[18], vtPecaB[jb]); jb++; + } + for(i = 0; i < 3; i++) + { + // Pretas + LIS_InserirElementoApos(vtCasa[7], vtPecaP[jp]); jp++; + // Brancas + LIS_InserirElementoApos(vtCasa[16], vtPecaB[jb]); jb++; + } + // Alocar as 24 casas na lista do tabuleiro + for(i = 0; i < 24; i++) + LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); + + //free(vtCasa); + //free(vtPecaB); + //free(vtPecaP); + + return TAB_CondRetOK; +} + +/* Destuir Tabuleiro */ + +TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) +{ + //LIS_tppLista temp; +// int i; + // Destroi as 24 casas + //IrFinalLista(pTab->Casas); + /*for(i = 0; i < 24; i++) + { + temp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + LIS_DestruirLista(temp); + LIS_AvancarElementoCorrente(pTab->Casas, -1); + }*/ + // Destroi a lista principal + LIS_DestruirLista(pTab->Casas); + // Libera o ponteiro para o tabuleiro + free(pTab); + + return TAB_CondRetOK; +} + + TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) + { + tppPeca pecatemp1, pecatemp2; + char cor; + LIS_tppLista listatemp; + int mov = casaDestino - casaOrigem; + + // Ir para a casa de origem + IrInicioLista(pTab->Casas); + LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); + + // Obter referência para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Obter a cor da peca na lista temp + pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); + // se pecatemp1 == NULL entao a lista está vazia + if(pecatemp1 == NULL) + { + printf("casa de origem esta vazia \n"); + return TAB_CondRetErro; + } + else // se nao + { + Pec_ObterCor(pecatemp1, &cor); + } + + // Excluir uma peça da lista temp + if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) + { + printf("Erro ao excluir peca da casa de orgiem\n"); + return TAB_CondRetErro; + } + + // Avança para a casa destino + LIS_AvancarElementoCorrente(pTab->Casas, mov); + + // Obtem a referencia para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Criar uma peça com a mesma cor q a peça antiga + if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) + { + printf("Erro ao criar a peca na casa destino \n"); + return TAB_CondRetErro; + } + + // Adiciona esta peça na casa de destino + if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) + { + printf("Erro ao adicionar peca na casa destino \n"); + return TAB_CondRetErro; + } + + return TAB_CondRetOK; + } + + + + + + + + + + + + + + diff --git a/tabuleiro/source/TABULEIRO.H b/tabuleiro/source/TABULEIRO.H new file mode 100644 index 0000000..979688c --- /dev/null +++ b/tabuleiro/source/TABULEIRO.H @@ -0,0 +1,163 @@ +#if ! defined( TABULEIRO_ ) +#define TABULEIRO_ +/*************************************************************************** +* +* $MCD Módulo de definição: LIS Lista duplamente encadeada +* +* Arquivo gerado: LISTA.h +* Letras identificadoras: LIS +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Implementa listas genéricas duplamente encadeadas. +* Podem existir n listas em operação simultaneamente. +* As listas possuem uma cabeça encapsulando o seu estado. +* +* Cada lista é homogênea quanto ao tipo dos dados que armazena. +* Cada elemento da lista referencia o valor que contém. +* +* Os ponteiros para os dados são copiados para elementos da lista. +* Não é copiado o valor apontado por estes ponteiros. +* +* O controle da destruição do valor de um elemento a ser excluído +* é realizado por uma função fornecida pelo usuário. +* +* Cada lista referencia uma função que determina como devem ser +* desalocados os dados nela contidos. +* +* A função de liberação dos valores contidos nos elementos deve +* assegurar a liberação de todos os espaços referênciados pelo +* valor contido em um elemento. +* Esta função é chamada antes de se desalocar um elemento +* de uma lista. +* Caso não seja necessário desalocar o valor referenciado pelo +* elemento, o ponteiro para a função de liberação poderá ser NULL . +* Caso o elemento da lista seja a única âncora do valor referenciado, +* esta função deve promover a destruição (free) desse valor e +* de todos os dados nele ancorados. +* +***************************************************************************/ + +#if defined( LISTA_OWN ) + #define LISTA_EXT +#else + #define LISTA_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +/* Tipo referência para uma lista */ + +typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; + + +/*********************************************************************** +* +* $TC Tipo de dados: LIS Condições de retorno +* +* +* $ED Descrição do tipo +* Condições de retorno das funções da lista +* +***********************************************************************/ + + typedef enum { + + TAB_CondRetOK , + /* Concluiu corretamente */ + TAB_CondRetErro, + + TAB_CondRetFaltouMemoria, + + } TAB_tpCondRet ; + + + + +/*********************************************************************** +* +* $FC Função: TAB &Criar Tabuleiro +* +* $ED Descrição da função +* Cria uma lista genérica duplamente encadeada. +* Os possíveis tipos são desconhecidos a priori. +* A tipagem é implicita. +* Não existe identificador de tipo associado à lista. +* +* $EP Parâmetros +* ExcluirValor - ponteiro para a função que processa a +* exclusão do valor referenciado pelo elemento +* a ser excluído. +* Ver descrição do módulo. +* +* $FV Valor retornado +* Se executou corretamente retorna o ponteiro para a lista. +* Este ponteiro será utilizado pelas funções que manipulem esta lista. +* +* Se ocorreu algum erro, por exemplo falta de memória ou dados errados, +* a função retornará NULL. +* Não será dada mais informação quanto ao problema ocorrido. +* +***********************************************************************/ + + TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, + void ( * ExcluirValor ) ( void * pDado ) ) ; + + +/*********************************************************************** +* +* $FC Função: TAB &Destruir Tabuleiro +* +* $ED Descrição da função +* Destrói a lista fornecida. +* O parâmetro ponteiro para a lista não é modificado. +* Se ocorrer algum erro durante a destruição, a lista resultará +* estruturalmente incorreta. +* OBS. não existe previsão para possíveis falhas de execução. +* +* $FV Valor retornado +* LIS_CondRetOK - destruiu sem problemas +* +***********************************************************************/ + + TAB_tpCondRet TAB_DestruirTabuleiro( TAB_tppTabuleiro pTab ) ; + + +/*********************************************************************** +* +* $FC Função: TAB &Mover Peça do Tabuleiro +* +* $ED Descrição da função + +* +* $FV Valor retornado +* LIS_CondRetOK - Moveu sem problemas +* TAB_CondRetOK - Nao moveu a peça +* +***********************************************************************/ + + TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; + +/***********************************************************************/ + + + +#undef TABULEIRO_EXT + +/********** Fim do módulo de definição: LIS Lista duplamente encadeada **********/ + +#else +#endif \ No newline at end of file diff --git a/tabuleiro/source/TESTTABULEIRO.C b/tabuleiro/source/TESTTABULEIRO.C new file mode 100644 index 0000000..0618ea5 --- /dev/null +++ b/tabuleiro/source/TESTTABULEIRO.C @@ -0,0 +1,161 @@ +/*************************************************************************** +* $MCI Módulo de implementação: Módulo de teste específico + +* Módulo modificado para operar matrizes que armazenam listas! +* +* Arquivo gerado: TESTPECA.C +* Letras identificadoras: TPec +* +* Nome da base de software: Exemplo de teste automatizado +* +* Projeto: Disciplinas INF 1628 / 1301 +* Gestor: DI/PUC-Rio +* Autores: avs - Arndt von Staa + fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão +* +* $HA Histórico de evolução: +* Versão Autor Data Observações + 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes +* 3.00 avs 28/02/2003 Uniformização da interface das funções e +* de todas as condições de retorno. +* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação +* 1.00 avs 15/08/2001 Início do desenvolvimento +* +* $ED Descrição do módulo +* Este módulo contém as funções específicas para o teste do +* módulo Matriz. Ilustra como redigir um interpretador de comandos +* de teste específicos utilizando o arcabouço de teste para C. +* +* $EIU Interface com o usuário pessoa +* Comandos de teste específicos para testar o módulo Matriz: +* +* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); +* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); +* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +***************************************************************************/ + +#include +#include +#include +#include "TST_ESPC.H" +#include "GENERICO.h" +#include "lerparm.h" + +#include "TABULEIRO.H" + +/* Tabela dos nomes dos comandos de teste específicos */ +#define CRIAR_TABULEIRO_CMD "=criartabuleiro" +#define DESTRUIR_TABULEIRO_CMD "=destruirtabuleiro" +#define MOVER_PECA_CMD "=moverpeca" + +TAB_tppTabuleiro Tab; +/***** Código das funções exportadas pelo módulo *****/ + +/***** Protótipos das funções encapuladas no módulo *****/ + + static void DestruirValor( void * pValor ) ; + +/***** Código das funções exportadas pelo módulo *****/ + + +/*********************************************************************** +* +* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* Peca sendo testado. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* Ver TST_tpCondRet definido em TST_ESPC.H +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) + { + + int CondRetObtido = TAB_CondRetOK ; + int CondRetEsperada = TAB_CondRetFaltouMemoria ; + /* inicializa para qualquer coisa */ + char ValorEsperado = '?' ; + char ValorObtido = '!' ; + char ValorDado = '\0' ; + char corEsperada = 'x'; + + int NumLidos = -1 ; + int i = 0; + int PosicaoReferencia, PosicaoFinal; + + /* Testar Criar Tabuleiro */ + if ( strcmp( ComandoTeste , CRIAR_TABULEIRO_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = TAB_CriarTabuleiro(&Tab, DestruirValor); + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao criar o tabuleiro." ); + + } /* fim ativa: Testar Criar Tabuleiro */ + + /* Testar Destruir Tabuleiro*/ + else if ( strcmp( ComandoTeste , DESTRUIR_TABULEIRO_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1 ) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = TAB_DestruirTabuleiro(Tab) ; + + return TST_CompararInt( CondRetEsperada , CondRetObtido , + "Retorno errado ao destruir o tabuleiro" ); + + } /* fim ativa: Testar destruir tabuleiro */ + + /* Testar Tabuleiro Mover Peca*/ + else if ( strcmp( ComandoTeste , MOVER_PECA_CMD ) == 0 ) + { + + NumLidos = LER_LerParametros( "iii" , + &PosicaoReferencia,&PosicaoFinal , &CondRetEsperada ) ; + if ( NumLidos != 3) + { + return TST_CondRetParm ; + } /* if */ + + CondRetObtido = TAB_MoverPeca(Tab, PosicaoReferencia, PosicaoFinal ) ; + + return TST_CompararInt(CondRetObtido, CondRetEsperada, "Retorno errado ao mover a peca"); + + } /* fim ativa: Testar Tabuleiro Mover Peca */ + return TST_CondRetNaoConhec ; + + } /* Fim função: Tab Efetuar operações de teste específicas para Tabuleiro */ + + /*********************************************************************** +* +* $FC Função: TLIS -Destruir valor +* +***********************************************************************/ + +void DestruirValor( void * pValor ) + { + + free( pValor ) ; + + } /* Fim função: TLIS -Destruir valor */ \ No newline at end of file diff --git a/tabuleiro/TST_ESPC.H b/tabuleiro/source/TST_ESPC.H similarity index 100% rename from tabuleiro/TST_ESPC.H rename to tabuleiro/source/TST_ESPC.H diff --git a/tabuleiro/testetabuleiro.bat b/tabuleiro/testetabuleiro.bat new file mode 100644 index 0000000..b3b77ea --- /dev/null +++ b/tabuleiro/testetabuleiro.bat @@ -0,0 +1 @@ +TRAB2-1 /stestetabuleiroscript > logsaidatabuleiro.txt \ No newline at end of file diff --git a/tabuleiro/testetabuleiroscript.script b/tabuleiro/testetabuleiroscript.script new file mode 100644 index 0000000..71a856e --- /dev/null +++ b/tabuleiro/testetabuleiroscript.script @@ -0,0 +1,17 @@ +//Teste do Módulo Tabuleiro + +== Criar tabuleiro +=criartabuleiro 0 + +== Mover Peca da casa 1 para casa 2 +=moverpeca 0 1 0 + +== Mover Peca da casa 10 (vazia) para qualquer casa (errado) +=moverpeca 10 23 0 +=recuperar + +== Mover Peca da casa 23 para a 0 +=moverpeca 23 0 0 + +== Destruir Tabuleiro +=destruirtabuleiro 0 \ No newline at end of file diff --git a/teste1wz.txt b/teste1wz.txt deleted file mode 100644 index e69de29..0000000 From bcccafec41e114e629fb91cddee269fc75f9b35b Mon Sep 17 00:00:00 2001 From: Felipe VieiraCortes Date: Fri, 25 Sep 2015 22:02:44 -0300 Subject: [PATCH 12/18] O grande Commit! --- DADO.H | 10 +- DADO.c | 34 +- Dado/Source Dado/DADO.H | 10 +- Dado/Source Dado/DADO.c | 34 +- Dado/Source Dado/TESTDADO.c | 48 +-- Dado/TRAB2-2.exe | Bin 76800 -> 121344 bytes Dado/logtestedado.txt | 10 +- DadoPontos/Source/ArcaboucoTeste.lib | Bin 0 -> 89288 bytes DadoPontos/Source/DADOPONTOS.c | 18 +- DadoPontos/Source/DADOPONTOS.h | 15 +- DadoPontos/Source/TESTDADOPONTOS.c | 76 ++-- DadoPontos/TRAB2-2.exe | Bin 76800 -> 0 bytes DadoPontos/TRAB2-4.exe | Bin 0 -> 122368 bytes DadoPontos/TesteDadoPontos.bat | 2 +- DadoPontos/TesteDadoPontos.script | 74 +++- DadoPontos/logTesteDadoPontos.txt | 40 +- TESTDADO.c | 45 +- peca/TRAB2-3.exe | Bin 77312 -> 121856 bytes peca/logtestepeca.txt | 2 +- peca/peca source/PECA.C | 11 +- peca/peca source/PECA.h | 9 +- peca/peca source/TESTPECA.C | 6 +- peca/testepecascript.script | 46 -- sourcemaster/ArcaboucoTeste.lib | Bin 0 -> 89288 bytes sourcemaster/GENERICO.H | 588 ++++++++++++++++++++++++++ sourcemaster/LERPARM.H | 463 ++++++++++++++++++++ sourcemaster/TST_ESPC.H | 320 ++++++++++++++ tabuleiro/TRAB2-1.exe | Bin 82432 -> 46080 bytes tabuleiro/logsaidatabuleiro.txt | 9 +- tabuleiro/source/TABULEIRO.C | 172 ++++---- tabuleiro/source/TABULEIRO.H | 88 ++-- tabuleiro/source/TESTTABULEIRO.C | 35 +- tabuleiro/testetabuleiroscript.script | 29 +- 33 files changed, 1744 insertions(+), 450 deletions(-) create mode 100644 DadoPontos/Source/ArcaboucoTeste.lib delete mode 100644 DadoPontos/TRAB2-2.exe create mode 100644 DadoPontos/TRAB2-4.exe create mode 100644 sourcemaster/ArcaboucoTeste.lib create mode 100644 sourcemaster/GENERICO.H create mode 100644 sourcemaster/LERPARM.H create mode 100644 sourcemaster/TST_ESPC.H diff --git a/DADO.H b/DADO.H index 5a2f0df..019e64d 100644 --- a/DADO.H +++ b/DADO.H @@ -9,15 +9,13 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão - * * $HA Histórico de evolução: * Versão Autor Data Observações -* 1.00 avs 15/08/2001 Início do desenvolvimento +* 1.00 fvc 15/08/2001 Início e término do desenvolvimento * * $ED Descrição do módulo * Este módulo implementa um conjunto simples de funções para gerar o resultado @@ -33,7 +31,7 @@ /*********************************************************************** * -* $TC Tipo de dados: MAT Condicoes de retorno +* $TC Tipo de dados: DAD Condicoes de retorno * * ***********************************************************************/ @@ -56,7 +54,7 @@ /*********************************************************************** * -* $FC Função: DAD &Gerar o numero de casas a serem paladas +* $FC Função: DAD &Gerar o numero de casas a serem puladas * * $ED Descrição da função * Retorno o numero da casas a serem andadas diff --git a/DADO.c b/DADO.c index 18832fc..5b7a67e 100644 --- a/DADO.c +++ b/DADO.c @@ -9,14 +9,14 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * * $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.0 tbm 02/set/2015 Início do desenvolvimento +* Versão Autor Data Observações +* 1.0 tbm, fvc 02/set/2015 Início do desenvolvimento + * ***************************************************************************/ @@ -36,39 +36,37 @@ * ****/ -/* Funcao do Modulo */ -int dadorand(void); +/***** Código das funções encapsuladas no módulo *****/ + +int randint(int n); + +/***** Código das funções exportadas pelo módulo *****/ -/* fim funcao do modulo */ +/*************************************************************************** +* +* Função: DAD &Gera numero aleatório +* ****/ DAD_tpCondRet DAD_NumPular(int *NumeroCasas) { *NumeroCasas = randint(6); return DAD_CondRetOK; -}/*Fim da função DAD_NumPular */ -/* Função usada pelo módulo */ +}/*Fim da função DAD_NumPular */ -/* Returns an integer in the range [1, n]. - * - * Uses rand(), and so is affected-by/affects the same seed. - */ +/* Função usada pelo módulo */ +/* Returns an integer in the range [1, n]*/ int randint(int n) { int r; if ((n - 1) == RAND_MAX) { return rand(); } else { - // Chop off all of the values that would cause skew... long end = RAND_MAX / n; // truncate skew assert (end > 0L); end *= n; - - // ... and ignore results from rand() that fall above that limit. - // (Worst case the loop condition should succeed 50% of the time, - // so we can expect to bail out of this loop pretty quickly. while ((r = rand()) >= end); r = (r|time(NULL)); diff --git a/Dado/Source Dado/DADO.H b/Dado/Source Dado/DADO.H index 5a2f0df..019e64d 100644 --- a/Dado/Source Dado/DADO.H +++ b/Dado/Source Dado/DADO.H @@ -9,15 +9,13 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão - * * $HA Histórico de evolução: * Versão Autor Data Observações -* 1.00 avs 15/08/2001 Início do desenvolvimento +* 1.00 fvc 15/08/2001 Início e término do desenvolvimento * * $ED Descrição do módulo * Este módulo implementa um conjunto simples de funções para gerar o resultado @@ -33,7 +31,7 @@ /*********************************************************************** * -* $TC Tipo de dados: MAT Condicoes de retorno +* $TC Tipo de dados: DAD Condicoes de retorno * * ***********************************************************************/ @@ -56,7 +54,7 @@ /*********************************************************************** * -* $FC Função: DAD &Gerar o numero de casas a serem paladas +* $FC Função: DAD &Gerar o numero de casas a serem puladas * * $ED Descrição da função * Retorno o numero da casas a serem andadas diff --git a/Dado/Source Dado/DADO.c b/Dado/Source Dado/DADO.c index 18832fc..5b7a67e 100644 --- a/Dado/Source Dado/DADO.c +++ b/Dado/Source Dado/DADO.c @@ -9,14 +9,14 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * * $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.0 tbm 02/set/2015 Início do desenvolvimento +* Versão Autor Data Observações +* 1.0 tbm, fvc 02/set/2015 Início do desenvolvimento + * ***************************************************************************/ @@ -36,39 +36,37 @@ * ****/ -/* Funcao do Modulo */ -int dadorand(void); +/***** Código das funções encapsuladas no módulo *****/ + +int randint(int n); + +/***** Código das funções exportadas pelo módulo *****/ -/* fim funcao do modulo */ +/*************************************************************************** +* +* Função: DAD &Gera numero aleatório +* ****/ DAD_tpCondRet DAD_NumPular(int *NumeroCasas) { *NumeroCasas = randint(6); return DAD_CondRetOK; -}/*Fim da função DAD_NumPular */ -/* Função usada pelo módulo */ +}/*Fim da função DAD_NumPular */ -/* Returns an integer in the range [1, n]. - * - * Uses rand(), and so is affected-by/affects the same seed. - */ +/* Função usada pelo módulo */ +/* Returns an integer in the range [1, n]*/ int randint(int n) { int r; if ((n - 1) == RAND_MAX) { return rand(); } else { - // Chop off all of the values that would cause skew... long end = RAND_MAX / n; // truncate skew assert (end > 0L); end *= n; - - // ... and ignore results from rand() that fall above that limit. - // (Worst case the loop condition should succeed 50% of the time, - // so we can expect to bail out of this loop pretty quickly. while ((r = rand()) >= end); r = (r|time(NULL)); diff --git a/Dado/Source Dado/TESTDADO.c b/Dado/Source Dado/TESTDADO.c index f74a38b..316f85d 100644 --- a/Dado/Source Dado/TESTDADO.c +++ b/Dado/Source Dado/TESTDADO.c @@ -1,53 +1,29 @@ /*************************************************************************** * $MCI Módulo de implementação: Módulo de teste específico - -* Módulo modificado para operar matrizes que armazenam listas! * -* Arquivo gerado: TESTMAT.C -* Letras identificadoras: TMAT +* Arquivo gerado: TESTDADO.C +* Letras identificadoras: TDADO * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa - fvc - Felipe Vieira Cortes +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * * $HA Histórico de evolução: * Versão Autor Data Observações - 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes -* 3.00 avs 28/02/2003 Uniformização da interface das funções e -* de todas as condições de retorno. -* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação -* 1.00 avs 15/08/2001 Início do desenvolvimento + 1.00 fvc 14/09/2015 Início e término do deselvolvimento * * $ED Descrição do módulo * Este módulo contém as funções específicas para o teste do -* módulo Matriz. Ilustra como redigir um interpretador de comandos -* de teste específicos utilizando o arcabouço de teste para C. +* módulo Dados, que gera um número aleatório de 1 a 6 * * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: * -* =criarmatriz - Chama a função MAT_CriarMatriz( linha, coluna, vtMatriz[inxmat]) -* =criarlista - Chama a função MAT_CriarLista( lista ) -* =avancar - Chama a função MAT_Avancar(vtMatriz[inxmat], direcao ) -* e avança a célula corrente da matriz de acordo com a direção dada. - as direções são: norte, nordeste, leste, sudeste, sul, sudoeste, oeste e noroeste -* =inscharantes" - Chama a função MAT_InserirCharAntes( lista ) e insere o char na posição posterior ao corrente -* =inschardepois" - Chama a função MAT_InserirCharDepois( lista ) e insere o char na posição anterior ao corrente -* "=inslista" - chama a função MAT_InserirLista(vtMatriz[inxmat], linha, coluna ) - e insere a lista na posição linhaXcoluna da matriz -* "=excluirelem" - Chama a função MAT_ExcluirElemento( lista ) e exclui o elemento corrente da lista -* "=irinicio" - chama a função MAT_IrInicio( lista ) -* "=irfinal" - chama a função MAT_IrIFinal( lista ) -* "=obtervalorelem" - Chama a função MAT_ObterValor( lista, charRecebido ) - e compara o charRecebido com o valor -* "=avancarelem" - chama a função MAT_AvancarElementoCorrente( lista, numElem ) -* -* "=destruirmatriz" - Chama a função MAT_DestruirMatriz( vtMatriz[inxmat] ) +* =jogardado chama a função DAD_tpCondRet DAD_NumPular(int* NumPular) e retorna um valor inteiro de 1 a 6 e imprime na tela ***************************************************************************/ #include @@ -64,14 +40,13 @@ /* Tabela dos nomes dos comandos de teste específicos */ #define JOGAR_DADO_CMD "=jogardado" -#define INI_DADO_CMD "=inicializardado" /***** Código das funções exportadas pelo módulo *****/ /*********************************************************************** * -* $FC Função: TMAT Efetuar operações de teste específicas para Matrizes +* $FC Função: TDADO Efetuar operações de teste específicas para um dado de 6 faces * * $ED Descrição da função * Efetua os diversos comandos de teste específicos para o módulo @@ -99,7 +74,7 @@ int NumLidos = -1 ; int i = 0; int valorDado; - /* Testar MAT Criar Matriz */ + /* Testar DADO Jogar Dado */ if ( strcmp( ComandoTeste , JOGAR_DADO_CMD ) == 0 ) { @@ -109,17 +84,14 @@ return TST_CondRetParm ; } /* if */ - while( i < 60) { CondRetObtido = DAD_NumPular(&valorDado) ; printf(" \n dado: %d\n", valorDado); - i++; - } return TST_CondRetOK; - } /* fim ativa: Testar MAT Criar Matriz */ + } /* fim ativa: Testar DADO Jogar Dado */ return TST_CondRetNaoConhec ; - } /* Fim função: TMAT Efetuar operações de teste específicas para árvore */ \ No newline at end of file + } /* Fim função: TDADO Efetuar operações de teste específicas para um dado de 6 faces*/ \ No newline at end of file diff --git a/Dado/TRAB2-2.exe b/Dado/TRAB2-2.exe index af8fdf274720af76e9b050fca89f8de89f2b65e5..0e98174eb969af995178514e0554fa1081bb0cc7 100644 GIT binary patch literal 121344 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%0AG@7u<0`tLqHjeD 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 diff --git a/Dado/logtestedado.txt b/Dado/logtestedado.txt index 7be1abb..21ecdb7 100644 --- a/Dado/logtestedado.txt +++ b/Dado/logtestedado.txt @@ -16,21 +16,21 @@ LES - Laborat dado: 1 - dado: 6 + dado: 2 - dado: 6 + dado: 4 dado: 4 - dado: 1 + dado: 3 - dado: 6 + dado: 2 dado: 3 dado: 6 - dado: 6 + dado: 2 !!! Número de linhas lidas: 14 diff --git a/DadoPontos/Source/ArcaboucoTeste.lib b/DadoPontos/Source/ArcaboucoTeste.lib new file mode 100644 index 0000000000000000000000000000000000000000..41ba1990924bce9779c6bdfa6b21565e71e10993 GIT binary patch literal 89288 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

(+lxk=fk>%<99^g>Amgv#<{Lp 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 = DadoDobrar->valor * 2; - DadoDobrar->CorDoJogador = CorNovoDono; /*Pega o valor atual do dado e multiplica por 2*/ + DadoDobrar->CorDoJogador = CorNovoDono; return DADPnt_CondRetOK; } @@ -91,7 +91,7 @@ DADPnt_tpCondRet DADPtn_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono) * Função: DADPnt Gerar Valor da Partida * ****/ -DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos DadoAtual, int * valorjogo) +DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos DadoAtual, int * valorjogo) { if(DadoAtual->CorDoJogador == 's' ) *valorjogo = 2; @@ -111,7 +111,7 @@ DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos DadoAtual, int * valorjogo) * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_ObterDono(tppDadoPontos DadoPonto, char * CorDonoAtual) +DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos DadoPonto, char * CorDonoAtual) { *CorDonoAtual = DadoPonto->CorDoJogador; return DADPnt_CondRetOK; @@ -122,7 +122,7 @@ DADPnt_tpCondRet DADPtn_ObterDono(tppDadoPontos DadoPonto, char * CorDonoAtual) * Função: DADPnt Destruir Dado de Pontos * ****/ -DADPnt_tpCondRet DADPtn_DestruirDado(tppDadoPontos Dado) +DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado) { if(Dado == NULL) return DADPnt_CondRetDadoPontosNaoExiste; diff --git a/DadoPontos/Source/DADOPONTOS.h b/DadoPontos/Source/DADOPONTOS.h index 31e9c32..decba33 100644 --- a/DadoPontos/Source/DADOPONTOS.h +++ b/DadoPontos/Source/DADOPONTOS.h @@ -9,8 +9,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão @@ -37,7 +36,7 @@ typedef struct tgDadoPontos * tppDadoPontos; typedef struct tgPlayers * tppPlayers; /*********************************************************************** * -* $TC Tipo de dados: MAT Condicoes de retorno +* $TC Tipo de dados: DADPnt Condicoes de retorno * * ***********************************************************************/ @@ -71,7 +70,7 @@ typedef struct tgPlayers * tppPlayers; * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_CriarDado(tppDadoPontos * DadoCriado); +DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoCriado); /*************************************************************************** * @@ -85,7 +84,7 @@ DADPnt_tpCondRet DADPtn_CriarDado(tppDadoPontos * DadoCriado); * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); +DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); /*************************************************************************** * @@ -98,7 +97,7 @@ DADPnt_tpCondRet DADPtn_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos Dado, int * valorjogo); +DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos Dado, int * valorjogo); /*************************************************************************** * @@ -111,7 +110,7 @@ DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos Dado, int * valorjogo); * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_ObterDono(tppDadoPontos Dado, char * corRecebida); +DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos Dado, char * corRecebida); /*************************************************************************** * @@ -125,7 +124,7 @@ DADPnt_tpCondRet DADPtn_ObterDono(tppDadoPontos Dado, char * corRecebida); * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_DestruirDado(tppDadoPontos Dado); +DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado); #undef DADOPONTOS_EXT diff --git a/DadoPontos/Source/TESTDADOPONTOS.c b/DadoPontos/Source/TESTDADOPONTOS.c index ef3273c..138d65e 100644 --- a/DadoPontos/Source/TESTDADOPONTOS.c +++ b/DadoPontos/Source/TESTDADOPONTOS.c @@ -4,17 +4,17 @@ * Módulo modificado para operar matrizes que armazenam listas! * * Arquivo gerado: TESTDADOPONTOS.C -* Letras identificadoras: TPec +* Letras identificadoras: TDADPnt * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão -* + * $HA Histórico de evolução: * Versão Autor Data Observações 4.00 tbm 23/08/2015 Módulo modificado para operar dadospontos @@ -31,9 +31,11 @@ * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: * -* =criardadoponto - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); -* =destruirdadoponto - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); -* =obtervalorjogo - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +* =criardadoponto - Chama a função DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoCriado); +* =destruirdadoponto - Chama a função DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado); +* =obtervalorjogo - Chama a função DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos Dado, int * valorjogo); +* =dobrardado - Chama a função DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); +* =obterdono - B Chama a função DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos Dado, char * corRecebida); ***************************************************************************/ #include @@ -55,16 +57,16 @@ #define OBTER_DONO_CMD "=obterdono" -tppDadoPontos P[MAX]; +tppDadoPontos DadoPnt; /***** Código das funções exportadas pelo módulo *****/ /*********************************************************************** * -* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* $FC Função: TDADPnt Efetuar operações de teste específicas para o Modulo DadoPontos * * $ED Descrição da função * Efetua os diversos comandos de teste específicos para o módulo -* Peca sendo testado. +* DadoPontos sendo testado. * * $EP Parâmetros * $P ComandoTeste - String contendo o comando @@ -90,23 +92,21 @@ tppDadoPontos P[MAX]; int i = 0; int ValorPontos,valoresperado; char corRecebida; - int inxpec; TST_tpCondRet Ret; - /* Testar Pec Criar Dado Pontos */ + /* Testar TDADPnt &Criar Dado Pontos */ if ( strcmp( ComandoTeste , CRIAR_DADOPONTOS_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ici" , - &inxpec,&corEsperada, &CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1) { return TST_CondRetParm ; } /* if */ - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - CondRetObtido = DADPtn_CriarDado(&P[inxpec]); + CondRetObtido = DADPnt_CriarDado(&DadoPnt); return TST_CompararInt( CondRetEsperada , CondRetObtido , @@ -115,18 +115,18 @@ tppDadoPontos P[MAX]; } /* fim ativa: Testar Criar Dado Pontos */ - /* Testar Pec Destruir DadoPontos */ + /* Testar TDADPnt &Destruir DadoPontos */ else if ( strcmp( ComandoTeste , DESTRUIR_DADOPONTOS_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ii" , - &inxpec, &CondRetEsperada ) ; - if ( NumLidos != 2 ) + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1 ) { return TST_CondRetParm ; } /* if */ - CondRetObtido = DADPtn_DestruirDado(P[inxpec]) ; + CondRetObtido = DADPnt_DestruirDado(DadoPnt) ; return TST_CompararInt( CondRetEsperada , CondRetObtido , "Retorno errado ao destruir o dadopontos." ); @@ -134,17 +134,17 @@ tppDadoPontos P[MAX]; } /* fim ativa: Testar DadoPontos Destruir*/ - /* Testar Obter Dono do DadoPonto */ + /* Testar TDADPnt &Obter Dono do DadoPonto */ else if ( strcmp( ComandoTeste , OBTER_DONO_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ici" , - &inxpec, &corEsperada ,&CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "ci" , + &corEsperada ,&CondRetEsperada ) ; + if ( NumLidos != 2 ) { return TST_CondRetParm ; } /* if */ - CondRetObtido = DADPtn_ObterDono(P[inxpec],&corRecebida) ; + CondRetObtido = DADPnt_ObterDono(DadoPnt,&corRecebida) ; Ret = TST_CompararChar( corRecebida , corEsperada , "Cor do jogador errado, diferente do esperado" ) ; @@ -159,38 +159,36 @@ tppDadoPontos P[MAX]; } /* fim ativa: Testar Obter Dono do DadoPonto*/ - /* Testar Dadoponto DobrarDado */ + /* Testar TDADPnt &Dadoponto DobrarDado */ else if ( strcmp( ComandoTeste , DOBRAR_DADO_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ici" , - &inxpec,&corEsperada, &CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "ci" , + &corEsperada, &CondRetEsperada ) ; + if ( NumLidos != 2 ) { return TST_CondRetParm ; } /* if */ - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - CondRetObtido = DADPtn_DobrarDado(P[inxpec],corEsperada); + CondRetObtido = DADPnt_DobrarDado(DadoPnt, corEsperada ); return TST_CompararInt( CondRetEsperada , CondRetObtido , "Retorno errado ao dobrar o valor do dadopontos." ); } /* fim ativa: Fim Dobrar Dado */ - /* Testar Dadoponto Obter Valor */ + /* Testar TDADPnt &Dadoponto Obter Valor */ else if ( strcmp( ComandoTeste , OBTER_VALORPARTIDA_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "iii" , - &inxpec,&valoresperado, &CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "ii" , + &valoresperado, &CondRetEsperada ) ; + if ( NumLidos != 2 ) { return TST_CondRetParm ; } /* if */ - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - CondRetObtido = DADPtn_ValorPartida(P[inxpec],&ValorPontos); + CondRetObtido = DADPnt_ValorPartida(DadoPnt,&ValorPontos); Ret = TST_CompararInt( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; @@ -207,4 +205,4 @@ tppDadoPontos P[MAX]; return TST_CondRetNaoConhec ; - } /* Fim função: TPec Efetuar operações de teste específicas para DadoPonto */ \ No newline at end of file + } /* Fim função: TDADPnt Efetuar operações de teste específicas para DadoPonto */ \ No newline at end of file diff --git a/DadoPontos/TRAB2-2.exe b/DadoPontos/TRAB2-2.exe deleted file mode 100644 index 13e96351d106f7e2aa73c23e6b8beb5fa3451f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76800 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 z 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 A+yDRo literal 0 HcmV?d00001 diff --git a/DadoPontos/TesteDadoPontos.bat b/DadoPontos/TesteDadoPontos.bat index 9a42476..a113068 100644 --- a/DadoPontos/TesteDadoPontos.bat +++ b/DadoPontos/TesteDadoPontos.bat @@ -1 +1 @@ -TRAB2-2 /sTesteDadoPontos > logTesteDadoPontos.txt \ No newline at end of file +TRAB2-4 /sTesteDadoPontos > logTesteDadoPontos.txt \ No newline at end of file diff --git a/DadoPontos/TesteDadoPontos.script b/DadoPontos/TesteDadoPontos.script index 76f8783..753e59e 100644 --- a/DadoPontos/TesteDadoPontos.script +++ b/DadoPontos/TesteDadoPontos.script @@ -1,46 +1,90 @@ // SCRIPT DE TESTE PARA O MODULO DADOSPnt + == Criar DadoPontos -=criardadopontos 0 's' 0 + +=criardadopontos 0 + + == Obter Dono -=obterdono 0 's' 0 + +=obterdono 's' 0 + + == Obter Valor -=obtervalorpartida 0 2 0 + +=obtervalorpartida 2 0 + + == Dobrar Dado -=dobrardado 0 'b' 0 + +=dobrardado 'b' 0 + + == Obter Dono -=obterdono 0 'b' 0 + +=obterdono 'b' 0 + + == Obter Valor -=obtervalorpartida 0 4 0 + +=obtervalorpartida 4 0 + + == Dobrar Dado -=dobrardado 0 'p' 0 + +=dobrardado 'p' 0 + + == Dobrar Dado -=dobrardado 0 'b' 0 + +=dobrardado 'b' 0 + + == Dobrar Dado -=dobrardado 0 'p' 0 + +=dobrardado 'p' 0 + + == Obter Valor -=obtervalorpartida 0 32 0 + +=obtervalorpartida 32 0 + + == Dobrar Dado -=dobrardado 0 'b' 0 + +=dobrardado 'b' 0 + + == Obter Dono -=obterdono 0 'b' 0 + +=obterdono 'b' 0 + + == Obter Valor Errado -=obtervalorpartida 0 63 1 + +=obtervalorpartida 63 0 =recuperar + + == Obter Valor -=obtervalorpartida 0 64 0 + +=obtervalorpartida 64 0 + + == Destruir DadoPontos -=destruirdadoponto 0 0 \ No newline at end of file + +=destruirdadoponto 0 \ No newline at end of file diff --git a/DadoPontos/logTesteDadoPontos.txt b/DadoPontos/logTesteDadoPontos.txt index a9a799e..9b5c35d 100644 --- a/DadoPontos/logTesteDadoPontos.txt +++ b/DadoPontos/logTesteDadoPontos.txt @@ -4,31 +4,31 @@ LES - Laborat Arcabouço de teste de módulos C (c) 2006 --------------------------------------------- - Construto sob teste: TRAB2-2 + Construto sob teste: TRAB2-4 Arquivo de teste: TesteDadoPontos !!! 0 Linha: 1 // SCRIPT DE TESTE PARA O MODULO DADOSPnt - 2 == Criar DadoPontos - 5 == Obter Dono - 8 == Obter Valor - 11 == Dobrar Dado - 14 == Obter Dono - 17 == Obter Valor - 20 == Dobrar Dado - 23 == Dobrar Dado - 26 == Dobrar Dado - 29 == Obter Valor - 32 == Dobrar Dado - 35 == Obter Dono - 38 == Obter Valor Errado ->>> 1 Linha: 39 Valor da Partida Errado Deveria ser: 63 É: 64 -<<< 0 Linha: 40 Falha esperada foi recuperada. - 42 == Obter Valor - 45 == Destruir DadoPontos - -!!! Número de linhas lidas: 46 + 3 == Criar DadoPontos + 9 == Obter Dono + 15 == Obter Valor + 21 == Dobrar Dado + 27 == Obter Dono + 33 == Obter Valor + 39 == Dobrar Dado + 45 == Dobrar Dado + 51 == Dobrar Dado + 57 == Obter Valor + 63 == Dobrar Dado + 69 == Obter Dono + 75 == Obter Valor Errado +>>> 1 Linha: 77 Valor da Partida Errado Deveria ser: 63 É: 64 +<<< 0 Linha: 78 Falha esperada foi recuperada. + 82 == Obter Valor + 88 == Destruir DadoPontos + +!!! Número de linhas lidas: 90 !!! Número de casos de teste: 15 !!! Número comandos corretos: 14 !!! Número de falhas encontradas: 0 diff --git a/TESTDADO.c b/TESTDADO.c index 73689be..316f85d 100644 --- a/TESTDADO.c +++ b/TESTDADO.c @@ -1,53 +1,29 @@ /*************************************************************************** * $MCI Módulo de implementação: Módulo de teste específico - -* Módulo modificado para operar matrizes que armazenam listas! * -* Arquivo gerado: TESTMAT.C -* Letras identificadoras: TMAT +* Arquivo gerado: TESTDADO.C +* Letras identificadoras: TDADO * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa - fvc - Felipe Vieira Cortes +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * * $HA Histórico de evolução: * Versão Autor Data Observações - 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes -* 3.00 avs 28/02/2003 Uniformização da interface das funções e -* de todas as condições de retorno. -* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação -* 1.00 avs 15/08/2001 Início do desenvolvimento + 1.00 fvc 14/09/2015 Início e término do deselvolvimento * * $ED Descrição do módulo * Este módulo contém as funções específicas para o teste do -* módulo Matriz. Ilustra como redigir um interpretador de comandos -* de teste específicos utilizando o arcabouço de teste para C. +* módulo Dados, que gera um número aleatório de 1 a 6 * * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: * -* =criarmatriz - Chama a função MAT_CriarMatriz( linha, coluna, vtMatriz[inxmat]) -* =criarlista - Chama a função MAT_CriarLista( lista ) -* =avancar - Chama a função MAT_Avancar(vtMatriz[inxmat], direcao ) -* e avança a célula corrente da matriz de acordo com a direção dada. - as direções são: norte, nordeste, leste, sudeste, sul, sudoeste, oeste e noroeste -* =inscharantes" - Chama a função MAT_InserirCharAntes( lista ) e insere o char na posição posterior ao corrente -* =inschardepois" - Chama a função MAT_InserirCharDepois( lista ) e insere o char na posição anterior ao corrente -* "=inslista" - chama a função MAT_InserirLista(vtMatriz[inxmat], linha, coluna ) - e insere a lista na posição linhaXcoluna da matriz -* "=excluirelem" - Chama a função MAT_ExcluirElemento( lista ) e exclui o elemento corrente da lista -* "=irinicio" - chama a função MAT_IrInicio( lista ) -* "=irfinal" - chama a função MAT_IrIFinal( lista ) -* "=obtervalorelem" - Chama a função MAT_ObterValor( lista, charRecebido ) - e compara o charRecebido com o valor -* "=avancarelem" - chama a função MAT_AvancarElementoCorrente( lista, numElem ) -* -* "=destruirmatriz" - Chama a função MAT_DestruirMatriz( vtMatriz[inxmat] ) +* =jogardado chama a função DAD_tpCondRet DAD_NumPular(int* NumPular) e retorna um valor inteiro de 1 a 6 e imprime na tela ***************************************************************************/ #include @@ -64,14 +40,13 @@ /* Tabela dos nomes dos comandos de teste específicos */ #define JOGAR_DADO_CMD "=jogardado" -#define INI_DADO_CMD "=inicializardado" /***** Código das funções exportadas pelo módulo *****/ /*********************************************************************** * -* $FC Função: TMAT Efetuar operações de teste específicas para Matrizes +* $FC Função: TDADO Efetuar operações de teste específicas para um dado de 6 faces * * $ED Descrição da função * Efetua os diversos comandos de teste específicos para o módulo @@ -99,7 +74,7 @@ int NumLidos = -1 ; int i = 0; int valorDado; - /* Testar MAT Criar Matriz */ + /* Testar DADO Jogar Dado */ if ( strcmp( ComandoTeste , JOGAR_DADO_CMD ) == 0 ) { @@ -115,8 +90,8 @@ return TST_CondRetOK; - } /* fim ativa: Testar MAT Criar Matriz */ + } /* fim ativa: Testar DADO Jogar Dado */ return TST_CondRetNaoConhec ; - } /* Fim função: TMAT Efetuar operações de teste específicas para árvore */ \ No newline at end of file + } /* Fim função: TDADO Efetuar operações de teste específicas para um dado de 6 faces*/ \ No newline at end of file diff --git a/peca/TRAB2-3.exe b/peca/TRAB2-3.exe index f6c655bd3c505f0e6b22d35b09d3d1b8b24648a8..f8e240cc01d333694827feac9a806e25d247ba2e 100644 GIT binary patch literal 121856 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%0A|3ul`SnE?Xfm*DHn8x@aQxge@li{3~>{GP$K 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 literal 77312 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 diff --git a/peca/logtestepeca.txt b/peca/logtestepeca.txt index 7f41f51..7888ec3 100644 --- a/peca/logtestepeca.txt +++ b/peca/logtestepeca.txt @@ -19,7 +19,7 @@ LES - Laborat 15 == Testar obter a cor da peca 1 (branca) 18 == Destruir as duas pecas -!!! Número de linhas lidas: 21 +!!! Número de linhas lidas: 20 !!! Número de casos de teste: 5 !!! Número comandos corretos: 6 !!! Número de falhas encontradas: 0 diff --git a/peca/peca source/PECA.C b/peca/peca source/PECA.C index 696d6a6..bf24f92 100644 --- a/peca/peca source/PECA.C +++ b/peca/peca source/PECA.C @@ -8,8 +8,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * @@ -37,17 +36,13 @@ ***********************************************************************/ typedef struct tgPeca{ - int *posicao; - /*Pontei para a posicao da peca, ainda deve ser alterado pelo tipo correto.*/ char cor; - /*Devemos usar um inteiro para facilitar a manipulacao da peça pela cor? Porem a cor tambem determia qual jogador - tem a posse da peca*/ - //struct tpp * jogador; } tpPeca; /***** Dados encapsulados no módulo *****/ +// vazio /***** Código das funções exportadas pelo módulo *****/ @@ -75,6 +70,8 @@ Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado, char CorDaNovaPeca) Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca) { + + free(Peca); return Pec_CondRetOK; } diff --git a/peca/peca source/PECA.h b/peca/peca source/PECA.h index a63d488..2458e5e 100644 --- a/peca/peca source/PECA.h +++ b/peca/peca source/PECA.h @@ -9,8 +9,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão @@ -58,7 +57,7 @@ typedef struct tgPeca * tppPeca; /*********************************************************************** * -* $FC Função: DADPnt Criar Peça +* $FC Função: PEC Criar Peça * * $ED Descrição da função * Cria uma nova peça @@ -72,7 +71,7 @@ typedef struct tgPeca * tppPeca; /*********************************************************************** * -* $FC Função: DADPnt Destruir Peça +* $FC Função: PEC Destruir Peça * * $ED Descrição da função * Destroi uma peça @@ -86,7 +85,7 @@ typedef struct tgPeca * tppPeca; /*********************************************************************** * -* $FC Função: DADPnt Obter Cor +* $FC Função: PEC Obter Cor * * $ED Descrição da função * Obtem cor de uma peca diff --git a/peca/peca source/TESTPECA.C b/peca/peca source/TESTPECA.C index 199f11b..26cd1af 100644 --- a/peca/peca source/TESTPECA.C +++ b/peca/peca source/TESTPECA.C @@ -10,8 +10,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa - fvc - Felipe Vieira Cortes +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * @@ -25,8 +24,7 @@ * * $ED Descrição do módulo * Este módulo contém as funções específicas para o teste do -* módulo Matriz. Ilustra como redigir um interpretador de comandos -* de teste específicos utilizando o arcabouço de teste para C. +* módulo Peca. * * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: diff --git a/peca/testepecascript.script b/peca/testepecascript.script index 0f0da63..8b40864 100644 --- a/peca/testepecascript.script +++ b/peca/testepecascript.script @@ -1,7 +1,6 @@ // TESTE DO MODULO PECA // TESTE COMPLETO -<<<<<<< HEAD == Testar criar 2 pecas =criarpeca 0 'p' 0 =criarpeca 1 'b' 0 @@ -19,48 +18,3 @@ == Destruir as duas pecas =destruirpeca 1 0 =destruirpeca 0 0 - -======= - -== Testar criar 3 pecas - -=criarpeca 0 'p' 0 - -=criarpeca 1 'b' 0 -=criarpeca 2 'b' 0 - - - -== Testar obter a cor da peca 0 (preta) - -=obtercorpeca 0 'p' 0 - - - -== Testar obter a cor da peca 1 errada (branca) - -=obtercorpeca 1 'p' 0 - -=recuperar - - - -== Testar obter a cor da peca 1 (branca) - -=obtercorpeca 1 'b' 0 - - - - -== Testar obter cor da peca 2 (branca) -=obtercorpeca 2 'b' 0 - -== Destruir as duas pecas - -=destruirpeca 2 0 - -=destruirpeca 1 0 - - -=destruitpeca 0 0 ->>>>>>> master diff --git a/sourcemaster/ArcaboucoTeste.lib b/sourcemaster/ArcaboucoTeste.lib new file mode 100644 index 0000000000000000000000000000000000000000..41ba1990924bce9779c6bdfa6b21565e71e10993 GIT binary patch literal 89288 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

(+lxk=fk>%<99^g>Amgv#<{Lp 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 esperado / obtido ou +* 1 + Tolerancia < esperado / obtido +* +* $EP Parâmetros +* ValorEsperado - é um valor fornecido como parâmetro do comando +* de teste +* ValorObtido - é o valor retornado pela função em teste +* Tolerância - indica os limites da relação entre esperado e obtido. +* Deve ser um valor positivo, menor do que 1. +* Use um valor do tipo 10 ** -n, no qual n é o +* número de dígitos significativos desejado. +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor obtido não estiver dentro do domínio da +* tolerância em torno do valor esperado +* TST_CondRetOK se os valores estiverem dentro da tolerância +* +***********************************************************************/ + + TST_tpCondRet TST_CompararFloat( double ValorEsperado , + double ValorObtido , + double Tolerancia , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar string +* +* $ED Descrição da função +* Compara string esperado com string obtido, reportamdo uma falha +* caso não sejam iguais. Ambos os strings devem obedecer o +* padrão C, terminando em zero. +* +* $EP Parâmetros +* ValorEsperado - é um string fornecido como parâmetro do comando +* de teste. +* ValorObtido - é o string retornado pela função em teste +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararString( char * ValorEsperado , + char * ValorObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar espaço +* +* $ED Descrição da função +* Compara espaços de dados, reportando uma falha caso não sejam iguais. +* Esta função pode ser utilizada para comparar qualquer coisa, +* inclusive valores do tipo "struct" +* O tipo do valor é indefinido e os valores serão exibidos em +* formato hexadecimal, caso não sejam iguais +* +* $EP Parâmetros +* ValorEsperado - ponteiro para o espaço que contém o valor esperado +* ValorObtido - ponteiro para o espaço que contém o valor obtido +* TamEspaco - tamanho do espaço a ser comparado +* pMensagem - mensagem explanatória da falha encontrada +* +* $FV Valor retornado +* TST_CondRetErro se o valor esperado não for igual ao obtido +* TST_CondRetOK se os valores forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , + void * ValorObtido , + int TamEspaco , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro +* +* $ED Descrição da função +* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Comparar ponteiro nulo +* +* $ED Descrição da função +* Verifica +* - quando ModoEsperado == 0 se o PonteiroObtido é nulo +* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo +* +* $FV Valor retornado +* TST_CondRetErro se os dois ponteiros forem diferentes +* TST_CondRetOK se forem iguais +* +***********************************************************************/ + + TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , + void * PonteiroObtido , + char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Assertiva controlada +* +* $ED Descrição da função +* Esta função substitui a função assert de C. +* É utilizada no contexto do arcabouço de teste. +* Ela imprime mensagens mais visíveis tanto no log como na +* janela de comando. +* +* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. +* +* $FV Valor retornado +* Termina a execução do programa com código de retorno == 4 +* +***********************************************************************/ + + #define TST_ASSERT( Expressao ) \ + TST_Assert( Expressao , __LINE__ , __FILE__ ) + + void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir prefixo da mensagem +* +* $ED Descrição da função +* Imprime o prefixo de mensages de falha ou de informação. +* Não incrementa o contador de falhas. +* Esta função estabelece o padrão de saída das mensagens geradas +* durante os testes. +* +* $EP Parâmetros +* $P Indicador - informa a natureza da mensagem, +* Utilize preferenciamente as constantes definidas em +* TST_ESPEC.H: +* SINALIZA_ERRO ">>>" +* SINALIZA_RECUPERA "<<<" +* SINALIZA_COMENTARIO "!!!" +* $P pMensagem - é a mensagem prefixo a ser gerada. +* +* $EIU Interface com usuário pessoa +* Podem ser acrescentadas mensagens ao prefixo. A função +* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso +* (stdout ou definido pelo usuário) +* +***********************************************************************/ + + void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Notificar falha +* +* $ED Descrição da função +* Exibe uma mensagem de falha no formato padrão do arcabouço. +* A função não exibe os valores esperado e obtido. +* +* $EP Parâmetros +* $P pMensagem - mensdagem explicativa da falha. +* +* $FV Valor retornado +* TST_CondRetErro sempre +* +***********************************************************************/ + + TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Incrementar contador de falhas +* +* $ED Descrição da função +* Esta função deve ser usada quando, por alguma razão, precisar-se +* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. +* As outras funções (comparação, TST_NotificarFalha, etc.) +* incrementam o contador automaticamente. +* +***********************************************************************/ + + void TST_ContarFalhas( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de casos de teste efetuados +* +* $ED Descrição da função +* Retorna o número de casos de teste lidos. +* Cada caso de teste inicia com o comando "== ". +* +***********************************************************************/ + + int TST_ObterNumCasosTeste( ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados +* +* $ED Descrição da função +* Retorna o número de comandos de teste específicos lidos e +* corretamente interpretados. +* Não conta comandos que retornem não OK independentemento do motivo, +* inclusive os comandos saltados após uma falha. +* Também não conta comandos recuperar. +* +***********************************************************************/ + + int TST_ObterNumComandosExecutados( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter número de falhas encontradas +* +* $ED Descrição da função +* Retorna o número de falhas encontrados. +* O módulo de teste específico sinaliza falhas através de +* uma condição de retorno diferente de TST_CondRetOK. +* Além de comparações em erro, são tratados como falhas: +* - comandos de teste em erro, +* - comandos de teste de um dado caso de teste ignorados (saltados) +* - erros encontrados nos instrumentos +* - erros de sintaxe dos comandos de teste +* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. +* Portanto, é possível que o número de falhas venha a ser maior do +* que o número de casos de teste existente no script. +* +***********************************************************************/ + + int TST_ObterNumFalhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter origem do nome da extensão de arquivo +* +* $ED Descrição da função +* Procura o início do nome da extensão contido no nome do arquivo +* dado por parâmetro +* +* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". +* Isto pode confundir no caso de se desejar a adição de algum nome +* de extensão padrão. +* +* $EP Parâmetros +* $P NomeArqParm - nome de arquivo a ser analisado +* +* $FV Valor retornado +* Ponteiro para o caractere '.' que separa a extensão. +* Será NULL caso o nome do arquivo não contenha extensão. +* +***********************************************************************/ + + char * TST_ObterInicioExtensao( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Obter ponteiro para arquivo LOG +* +* $ED Descrição da função +* Retorna o ponteiro para o FILE do log em uso no momento. +* Será stdout caso não seja definido explicitamente ao chamar a funcao +* TST_ControlarSessaoTeste +* +* $FV Valor retornado +* Ponteiro válido para um arquivo de texto de saída +* +***********************************************************************/ + + FILE * TST_ObterArqLog( void ) ; + + +/*********************************************************************** +* +* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char +* +* $ED Descrição da função +* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém +* uma coluna em hexadecimal e outra em ASCII +* São exibidos 16 bytes por linha. +* +* $EP Parâmetros +* $P tamEspaco - tamanho em bytes do espaço a exibir +* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir +* +***********************************************************************/ + + void TST_ExibirEspacoHexa( int tamEspaco , + void * Ponteiro ) ; + +#undef GENERICO_EXT + +/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ + +#else +#endif diff --git a/sourcemaster/LERPARM.H b/sourcemaster/LERPARM.H new file mode 100644 index 0000000..f12cf3d --- /dev/null +++ b/sourcemaster/LERPARM.H @@ -0,0 +1,463 @@ +#if ! defined( LerParm_ ) +#define LerParm_ +/*************************************************************************** +* +* $MCD Módulo de definição: LER Ler parâmetros de comandos +* +* Arquivo gerado: LerParm.h +* Letras identificadoras: LER +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Provê funções para a leitura e análise léxica dos comandos de teste. +* Pressupõe-se que cada comando de teste esteja integralmente em +* uma linha. +* Cada comando de teste inicia com o caractere '=' seguido de um string +* que identifica o comando. +* Cada comando pode requerer zero ou mais parâmetros que se encontram na +* mesma linha que o comando. +* Parâmetros podem ser literis ou simbólicos. +* Os parâmetros simbólicos precisam ser declarados antes de serem +* utilizados. +* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. +* +* Se for do interesse do programador, módulos de teste específico +* podem ler e processar por conta própria linhas do script. Isto +* pode ser necessário quando um módulo necessita de um grande +* número de parâmetros ou de dados especiais. +* +* $EIU Interface com o usuário pessoa +* Este módulo interpreta os comandos de teste globalmente disponíveis: +* +* =declararparm +* declara o parâmetro do definido com o valor +* pode ser um de: +* i - inteiro (long) +* f - flutuante (double) +* c - caractere +* s - string +* O valor de literal tem que estar em conformidade com o tipo +* +* =exibirdeclaracao +* exibe a declaração do parâmetro em formato "dump de memória" +* +* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. +* +* Estes comandos sempre estarão disponíveis. Os demais comandos de +* teste estão impementados no módulo TESTLER específico para este módulo. +* +***************************************************************************/ + +#if defined( LerParm_OWN ) + #define LerParm_EXT +#else + #define LerParm_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define LER_DIM_NOME 32 +#define LER_DIM_STRING 500 +#define LER_DIM_BUFFER 250 + + +/*********************************************************************** +* +* $TC Tipo de dados: LER Condições de retorno +* +* +***********************************************************************/ + + typedef enum { + + LER_CondRetOK , + /* Ler retorno OK */ + + LER_CondRetNaoAbriu + /* Ler não abriu arquivo */ + + } LER_tpCondRet ; + +/***** Dados exportados pelo módulo *****/ + + /* Estrutura de dados: *LER Dados globais públicos */ + + LerParm_EXT int LER_TamBuffer ; + /* Tamanho do string contido no buffer de leitura + * + *$ED Descrição + * Contém o número total de caracteres do buffer, excluindo o zero. + * Jamais altere este valor. */ + + LerParm_EXT int LER_InxBuffer ; + /* Cursor do buffer de leitura + * + *$ED Descrição + * O cursor de leitura indexa o primeiro caractere não lido contido + * no buffer. + * O cursor é zerado sempre que uma nova linha for lida. + * O cursor é avançado ao ler um parâmetro, sendo colocado no + * primeiro caractere imediatamente após ao parâmetro lido. + * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ + + LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; + /* Buffer de leitura + * + *$ED Descrição + * Contém a linha corrente do script a ser processada. + * Jamais altere o valor do buffer. */ + + +/*********************************************************************** +* +* $FC Função: LER &Inicializar módulo LerParm +* +* $ED Descrição da função +* Inicializa o módulo. +* Deve ser chamada antes de iniciar a análise de comandos. +* Deve ser chamada uma única vez no início ou após terminar o módulo. +* +***********************************************************************/ + + int LER_InicializarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Terminar módulo LerParm +* +* $ED Descrição da função +* Fecha o arquivo de leitura e sinaliza módulo de leitura não +* inicializado. +* Após esta função somente poderá ser chamada a funçãp +* LER_InicializarLeitura +* +***********************************************************************/ + + void LER_TerminarLeitura( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter nome do arquivo script +* +* $FV Valor retornado +* Retorna o ponteiro para o nome do arquivo script sendo processado. +* Deve-se tomar cuidado para não alterar este nome. +* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. +* +***********************************************************************/ + + char * LER_ObterNomeArqScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Obter número de linhas lidas até o momento +* +***********************************************************************/ + + int LER_ObterNumLinhas( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Abrir arquivo script de teste +* +* $ED Descrição da função +* Abre o arquivo que contém o script de teste. +* A extensão default do arquivo de comandos script de teste é +* ".script" e será acrescida ao nome do arquivo caso este não +* contenha nome de extensão. +* +* $EP Parâmetros +* $P NomeArqParm - nome do arquivo contendo o script de teste +* +* $FV Valor retornado +* LER_CondRetOK - caso tenha sido possível abrir o arquivo. +* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. +* Não há discriminação do erro encontrado. +* +***********************************************************************/ + + LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha script eliminando brancos ao final +* +* $ED Descrição da função +* Lê uma linha do arquivo script e elimina os caracteres branco, +* fim de linha, tabulação etc. do final da linha lida. +* +* $FV Valor retornado +* Retorna o tamanho da linha lida. +* Será: +* -1 caso tenha ocorrido fim de arquivo. +* -2 caso tenha ocorrido algum problema de leitura. +* +***********************************************************************/ + + int LER_LerLinhaScript( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Interpretar comandos de teste +* +* $ED Descrição da função +* Interpreta os comandos de teste disponibilizados pelo módulo +* de leitura. +* +* Ver a descrição do módulo para mais detalhes +* +* $EP Parâmetros +* $P - Comando de teste a ser interpretado +* +* $FV Valor retornado +* TST_CondRetOK - caso tenha interpretado corretamente +* TST_CondRetNaoExecutou - caso o comando de teste a interpretar +* não pertença ao conjunto de LER +* TST_CondRetErro - caso o comando de teste é do conjunto de LER +* e está sintaticamente errado. +* Neste caso é gerada uma mensagem de erro no +* log. +* +***********************************************************************/ + + TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Declarar parâmetro simbólico +* +* $EP Parâmetros +* Interpreta uma linha de comando de teste contendo uma declaração de +* nome simbólico. +* Todas as declarações têm o formato: +* =declararparm +* em que o deve estar consistente com o +* São geradas mensagens de erro no log de teste caso a declaração +* não possa ser realizada. +* +* $FV Valor retornado +* TRUE - se a declaração ocorreu +* FALSE - caso contrário +* +***********************************************************************/ + + int LER_DeclararParametro( void ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Exibir declaração de símbolo +* +* $ED Descrição da função +* Exibe o Símbolo e o valor associado ao símbolo, sendo que este +* é exibido em hexadecimal. +* +***********************************************************************/ + + void LER_ExibirParametro( char * Simbolo ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler linha de parâmetros +* +* $ED Descrição da função +* Lê um número variável de parâmetros +* +* $EP Parâmetros +* $P Tipos é um string contendo a identificação dos tipos dos parâmetros +* a serem lidos. +* $P ... Os demais parâmetros são referências (ponteiros) para os +* espaços onde deverão ser armazenados os valores lidos. +* +* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista +* de referência e o string de tipos tenha o mesmo tamanho +* e que os indicadores de tipo sejam consistentes com a referência +* posicionalmente correspondentes. +* +* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já +* declarado. Caso isto seja possível e o tipo esteja correto +* é "lido" o valor contido no parâmetro. +* Caso não seja possível, tenta ler um literal em acordo com o tipo +* dado. +* +* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada +* e tipo inconsistente com o solicitado no correspondente caractere no +* string Tipos. +* +* $FV Valor retornado +* Retorna o número de campos lidos até concluir ou até encontrar +* um erro. +* +***********************************************************************/ + + int LER_LerParametros( char * Tipos , ... ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro caractere +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do caractere lido +* +* $EIU Interface com usuário pessoa +* Um caractere deve vir entre aspas simples. Valem os caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmChar( char * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro inteiro +* +* $EP Parâmetros +* $P Parm é um ponteiro para um int que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do int lido +* +* $EIU Interface com usuário pessoa +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmInt( int * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro flutuante +* +* $EP Parâmetros +* $P Parm é um ponteiro para um double que receberá o valor lido +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do double lido +* +* $EIU Interface com usuário pessoa +* São válidas todas as formas de literal double aceitas pelo scanf. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmDouble( double * Parm ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro nome +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o nome lido +* $P tamString é o tamanho do nome que foi lido +* $P dimString é o tamanho máximo que o nome poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do nome lido +* +* $EIU Interface com usuário pessoa +* São válidas as mesmas regras de nomes C. +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Ler parâmetro string +* +* $EP Parâmetros +* $P Parm é um ponteiro para um caractere que receberá o string lido +* $P tamString é o tamanho do string que foi lido +* $P dimString é o tamanho máximo que o string poderá ter, já +* descontado o zero final +* +* $FV Valor retornado +* TRUE - se leu +* FALSE - se ocorreu algum erro +* +* $FGP Tipos e Variáveis globais externas do próprio módulo +* inxBuffer - é avançado para o primeiro caractere branco imediatamente +* a seguir do string lido +* +* $EIU Interface com usuário pessoa +* Um string deve vir entre aspas duplas. +* Um string pode conter caracteres de controle +* \n \r \t \a \v \f \\ \' \" \? e \0 +* +* São geradas mensagens de erro no log +* +***********************************************************************/ + + int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; + + +/*********************************************************************** +* +* $FC Função: LER &Pular comando de teste +* +* $ED Descrição da função +* Avança o cursor do buffer de leitura por cima de um comando de teste. +* Todos os comandos de teste principiam com o prefixo '=' +* +***********************************************************************/ + + void LER_PularComando( void ) ; + +#undef LerParm_EXT + +/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ + +#else +#endif diff --git a/sourcemaster/TST_ESPC.H b/sourcemaster/TST_ESPC.H new file mode 100644 index 0000000..987ff8e --- /dev/null +++ b/sourcemaster/TST_ESPC.H @@ -0,0 +1,320 @@ +#if ! defined( Tst_Espc_ ) +#define Tst_Espc_ +/*************************************************************************** +* +* $MCD Módulo de definição: TSTE Interface de teste específico +* +* Arquivo gerado: Tst_Espc.h +* +* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C +* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW +* +* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C +* Gestor: LES/DI/PUC-Rio +* Autores: avs +* +* $HA Histórico de evolução: +* Versão Autor Data Observações +* 4 avs 01/fev/2006 criar linguagem script simbólica +* 3 avs 08/dez/2004 uniformização dos exemplos +* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto +* 1 avs 16/abr/2003 início desenvolvimento +* +* $ED Descrição do módulo +* Este módulo consta somente do módulo de definição de todos os módulos +* de teste específicos a serem desenvolvidos, e também da especificação +* do tipo de condições de retorno deste módulo. +* +* Ele estabelece a interface a ser utilizada pelo módulo de teste +* genérico com todos os módulos de teste específico a serem +* desenvolvidos. +* +* Os módulos de teste específico devem sempre incluir este módulo +* de definição e, idealmente, não devem adicionar mais itens +* à interface. +* +* O módulo de teste específico contém a função de teste de um +* determinado módulo ou conjunto de módulos. Mais especificamente, +* contém a função que interpreta os comandos de teste que exercitarão +* as funções do(s) módulo(s) em teste. +* +* Poderá conter também diversas funções auxiliares requeridas para +* realizar os testes, vide "contexto" a seguir. +* +* O contexto é formado por variáveis e estruturas auxiliares necessárias +* para que se possa efetuar todos os comandos de teste. +* Por exemplo pode-se desejar testar várias instâncias de uma +* mesma estrutura. Uma forma de resolver isto é criar um vetor +* global static +* de n elementos em que cada elemento aponta para a cabeça de +* uma determinada instância dessa estrutura. Para realizar um +* teste relativo a uma determinada instância, torna-se necessário +* selecioná-la através de um índice contido no comando de teste. +* Este parâmetro, embora seja um índice, é na realidade o identificador +* da instância da estrutura a ser manipulada (idEstrutura). +* +* Caso o módulo em teste requeira um contexto, este deverá ser +* estabelecido no presente módulo. Para tal devem ser declaradas +* variáveis e estruturas encapsuladas e devem ser incluídos comandos +* de teste capazes de manipular o contexto. +* +* Uma das formas para estabelecer o contexto seria a de incluir +* no mçodulo de teste específico comando semelhantes a: +* +* =iniciaXXX que inicializa o contexto do módulo sob teste para +* vazio. Este comando deve ser utilizado uma única vez +* logo ao inciar a execução do teste. +* =reset restaura o contexto para vazio. Este comando usualmente +* assumirá que o contexto a esvaziar esteja correto. +* O comando deverá liberar os espaços alocados aos +* elementos, anular as referências a ele, inicializar +* valores de vetores de referências, etc. +* O comando tem utilidade especial ao segmentar um teste +* em partes estanques e ao controlar vazamento de +* memória. +* =terminaXXX este comando destrói todo o contexto e não o +* reinicializa. O objetivo é poder verificar vazamento +* de memória. +* +* Evidentemente, outra forma seria a de alterar as funções de +* inicialização e término do módulo de teste genérico o que é pouco +* recomendável pois viola o princípio de um mesmo módulo genérico +* servir para testar todos os construtos. +* +* Para cada função do módulo a ser testado deve existir pelo menos +* um comando de teste. Em alguns casos pode ser interessante criar +* comandos que armazenem, alterem ou consultem variáveis de +* estado do próprio módulo de teste. Ver os comentários sobre +* contexto acima. Ou seja, podem existir comandos de teste que +* têm o propósito de agir sobre o contexto e, não, o de efetuar +* um determinado teste. Alguns desses comandos podem inclusive +* realizar verificações entre um resultado esperado e existente +* no contexto. +* +* Todos os controles de consistência dos parâmetros dos comandos +* de teste devem ser realizados no módulo de teste específico. +* Recomenda-se que seja sempre retornado TST_CondRetParm, +* sinalizando erro de sintaxe do comando de teste ou valores +* não permitidos. Deve ser sempre assumido que os parâmetros +* podem estar em erro. Ou seja, o controle da integridade dos +* comando é mandatória. +* +* Caso seja necessário emitir mensagens especiais, +* deve ser utilizada a função genérica "TST_ExibirPrefixo". +* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, +* (prefixo, ou comparar), utilize a função +* fprintf( TST_ObterArqLog( ) , "..." , ... ) +* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") +* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção +* assegura a consistência do aspecto das mensagens com o restante do +* programa de teste. +* +* Cada comando deve ser completamente interpretado pelo seu +* respectivo fragmento de interpretação. Ou seja, não deverá ser +* retornado para o módulo genérico qualquer dado adicional à +* condição de retorno da função de teste específico. Veja +* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes +* à mensagen já exibida. +* +* A função TST_NotificarFalha sempre registra uma falha, enquanto que +* a função TST_ExibirPrefixo pode ser usada para emitir mensagens +* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo +* seja utilizada para sinalizar uma falha, é necessário chamar +* também a função TST_ContarFalha( ) para que seja notificada a falha. +* Isto não é necessário no caso da função TST_NotificarFalha, pois +* esta sempre conta falhas. +* +* As funções a testar que retornem um valor sempre devem ter +* este valor verificado, mesmo que seja uma condição de retorno. +* Utilize para isto uma das funções " Comparar" do arcabouço. +* Caso uma função retorne dois ou mais valores, incluindo +* a condição de retorno, utilize um código semelhante ao +* descrito a seguir. +* +* Seja +* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... +* a função a ser testada e, v1, v2, ... os dados retornados de +* alguma forma (valor retornado, parâmetro por referência, variável +* global). Assumindo que v1 seja o valor retornado. +* +* v1Obtido = FuncATestar( ... +* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* +* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; +* if ( CondRet != TST_CondRetOK ) +* { +* return CondRet ; +* } +* ... +* +* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; +* +***************************************************************************/ + +#if defined( Tst_Espc_OWN ) + #define Tst_Espc_EXT +#else + #define Tst_Espc_EXT extern +#endif + +/***** Declarações exportadas pelo módulo *****/ + +#define SINALIZA_ERRO ">>>" +#define SINALIZA_RECUPERA "<<<" +#define SINALIZA_COMENTARIO "!!!" + + +/*********************************************************************** +* +* $TC Tipo de dados: TST Cond ret módulo de teste específico +* +* +* $ED Descrição do tipo +* Este tipo enumera todas as condições de retorno que podem ser +* geradas pela função de teste específica. +* +***********************************************************************/ + + typedef enum { + + TST_CondRetOK , + /* Comando de teste executou corretamente */ + + TST_CondRetErro , + /* Comando de teste encontrou uma ou mais falhas + * + *$ED Descrição + * Esta condição sinaliza que um ou mais resultados da execução + * da função sob teste resultou em um valor diferente do esperado. */ + + TST_CondRetParm , + /* Comando de teste está com a sintaxe em erro + * + *$ED Descrição + * A presente condição de retorno deve ser retornada caso a sintaxe + * ou os valores do comando de teste estiverem em erro. + * + * Todos os fragmentos de interpretação devem: + * - realizar a análise dos parâmetros do comando + * - verificar se todos os parâmetros foram lidos + * - verificar se os valores dos parâmetros estão corretos + * por exemplo: verificar se os índices de acesso a elementos + * estão dentro dos limites dos correspondentes vetores. + * - efetuar a função a testar + * - verificar se os resultados retornados por esta função estão + * corretos */ + + TST_CondRetNaoExecutou , + /* Comando de teste não se destina ao presente interpretador + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de comandos de teste relativas a módulos do próprio arcabouço, + * caso não tenha sido encontrado um comando válido. Isso permite + * estabelecer um "daisy chain" de interpretadores em que cada qual + * tenha finalidade específica no contexto do arcabouço. */ + + TST_CondRetNaoConhec , + /* Comando de teste não é conhecido + * + *$ED Descrição + * Esta condição deve ser retornada por todas as funções de interpretação + * de casos de teste específico visando determinado módulo em teste, + * sempre que esse interpretador não consiga identificar o comando. + * + * Cabe salientar a diferença entre TST_CondRetNaoExecutou e + * TST_CondRetNaoConhec. A primeira corresponde à não interpretação + * de um comando possivelmente válido em interpretadores subsequentes. + * A segunda corresponde a comandos não válidos considerando todos + * os interpretadores. */ + + TST_CondRetNaoImplementado , + /* Comando de teste não implementado + * + *$ED Descrição + * Esta condição deve ser retornada ao interpretar um comando de teste + * específico ainda não implementado. + * + * Recomenda-se que o desenvolvimento dos módulos sob teste e do + * correpondente módulo de teste específico se dê incrementalmente. + * Consequentemente diversos comandos não estarão implementados + * no início do desenvolvimento. Esta incompleteza poderá ser + * sinalizada com esta condição de retorno. */ + + TST_CondRetMemoria + /* Faltou memória para executar o comando + * + *$ED Descrição + * Esta condição deve ser retornada caso tenha ocorrido algum erro + * quando o módulo de teste específico tentar alocar memória ou + * outro recurso. */ + + } TST_tpCondRet ; + + +/*********************************************************************** +* +* $FC Função: TSTE &Efetuar comandos de teste específicos +* +* $ED Descrição da função +* Efetua os diversos comandos de teste específicos para o módulo +* sendo testado. +* +* Cada módulo de teste específico deve desenvolver esta função. +* Poderá conter diversas outras conforme necessário. No entanto +* estas devem todas ser funções encapsuladas no módulo (static) +* +* Freqüentemente é necessário desenvolver um contexto para o teste. +* Por exemplo, pode ser necessário tratar n elementos disponibilizados +* pelo módulo sob teste. Neste caso deveria ser criado um vetor +* global com referências para estas elemento. Ao iniciar os teste +* este vetor deverá ser inicializado. Ao terminar, os elementos do +* vetor referenciando algum elemento devem ser destruídos. +* +* Todos os controles de consistência devem ser realizados no +* módulo de teste específico. +* +* A função TST_EfetuarComando( ) deve retornar as condições de retorno +* identificadas no tipo TST_tpCondRet. +* +* As funções do módulo sob teste que retornam algum valor sempre +* devem sempre ter este valor verificado, mesmo sendo uma condição de +* retorno. Para fazer a vereficação da corretude, recomenda-se +* utilizar as funções TST_CompararXXX definidas no módulo genérico. +* Assegura-se assim a uniformidade da saída gerada durante o teste. +* +* Para realizar a análise de um comando de teste recomenda-se +* utilizar as funções definidas no módulo LerParm. Elas, além +* de realizarem a análise léxica, permitem o uso intercambiável +* de parâmetros simbólicos ou literais. Também realizam a +* verificação da corretude dos tipos dos parâmetros, contribuindo +* assim para a redução de erros de redação de scripts de teste +* que possam passar despercebidos. +* +* As funções a serem testadas que requeiram algum argumento, devem +* ser chamadas com valores (parâmetros) extraídos do comando de +* teste sendo executado. Use sempre as funções do módulo LerParm +* para realizar a análise sintática. +* +* $EP Parâmetros +* $P ComandoTeste - String contendo o comando +* +* $FV Valor retornado +* TST_CondRetXXX - veja a descriÓcão dos possíveis valores +* retornados na especificação do correspondente +* enum +* +***********************************************************************/ + + TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; + +#undef Tst_Espc_EXT + +/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ + +#else +#endif diff --git a/tabuleiro/TRAB2-1.exe b/tabuleiro/TRAB2-1.exe index bf3fdb233a290dfece6a061aec12115e98ed16d0..5997b50f698f5f4e141341cef91cd2217c1eccc3 100644 GIT binary patch literal 46080 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 Dr;jT~ literal 82432 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%0DuY+@IyVS*NLQROeP`bwbZ$Z}b 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 1 Linha: 10 Retorno errado ao mover a peca Deveria ser: 1 É: 0 <<< 0 Linha: 11 Falha esperada foi recuperada. 13 == Mover Peca da casa 23 para a 0 - 16 == Destruir Tabuleiro + 16 == Mover uma peça por todas as casas do tabuleiro de 0 a 23 + 43 == Destruir Tabuleiro -!!! Número de linhas lidas: 17 -!!! Número de casos de teste: 5 -!!! Número comandos corretos: 4 +!!! Número de linhas lidas: 44 +!!! Número de casos de teste: 6 +!!! Número comandos corretos: 27 !!! Número de falhas encontradas: 0 !!! Não foram encontrados problemas diff --git a/tabuleiro/source/TABULEIRO.C b/tabuleiro/source/TABULEIRO.C index 572c12a..72a415e 100644 --- a/tabuleiro/source/TABULEIRO.C +++ b/tabuleiro/source/TABULEIRO.C @@ -1,22 +1,21 @@ /*************************************************************************** -* $MCI Módulo de implementação: LIS Lista duplamente encadeada +* $MCI Módulo de implementação: TAB Tabuleiro de Gamão * -* Arquivo gerado: LISTA.c -* Letras identificadoras: LIS +* Arquivo gerado: TABULEIRO.C +* Letras identificadoras: TAB * * Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW * * Projeto: INF 1301 / 1628 Automatização dos testes de módulos C * Gestor: LES/DI/PUC-Rio -* Autores: avs +* Autores: fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão * * $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento +* Versão Autor Data Observações +* 2 fvc, tbm 23/set/2015 término do deselvolvimento +* 1 fvc, tbm 21/set/2015 início desenvolvimento ***************************************************************************/ @@ -52,7 +51,7 @@ typedef struct TAB_tagTabuleiro { /*************************************************************************** * -* Função: LIS &Criar Tabuleiro +* Função: TAB &Criar Tabuleiro * ****/ TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, @@ -104,28 +103,17 @@ TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, for(i = 0; i < 24; i++) LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); - //free(vtCasa); - //free(vtPecaB); - //free(vtPecaP); - return TAB_CondRetOK; } -/* Destuir Tabuleiro */ +/*************************************************************************** +* +* Função: TAB &Destruir Tabuleiro +* ****/ TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) { - //LIS_tppLista temp; -// int i; - // Destroi as 24 casas - //IrFinalLista(pTab->Casas); - /*for(i = 0; i < 24; i++) - { - temp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - LIS_DestruirLista(temp); - LIS_AvancarElementoCorrente(pTab->Casas, -1); - }*/ - // Destroi a lista principal + LIS_DestruirLista(pTab->Casas); // Libera o ponteiro para o tabuleiro free(pTab); @@ -133,62 +121,80 @@ TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) return TAB_CondRetOK; } - TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) - { - tppPeca pecatemp1, pecatemp2; - char cor; - LIS_tppLista listatemp; - int mov = casaDestino - casaOrigem; - - // Ir para a casa de origem - IrInicioLista(pTab->Casas); - LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); - - // Obter referência para a lista nela armazenada - listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - - // Obter a cor da peca na lista temp - pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); - // se pecatemp1 == NULL entao a lista está vazia - if(pecatemp1 == NULL) - { - printf("casa de origem esta vazia \n"); - return TAB_CondRetErro; - } - else // se nao - { - Pec_ObterCor(pecatemp1, &cor); - } - - // Excluir uma peça da lista temp - if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) - { - printf("Erro ao excluir peca da casa de orgiem\n"); - return TAB_CondRetErro; - } - - // Avança para a casa destino - LIS_AvancarElementoCorrente(pTab->Casas, mov); - - // Obtem a referencia para a lista nela armazenada - listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - - // Criar uma peça com a mesma cor q a peça antiga - if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) - { - printf("Erro ao criar a peca na casa destino \n"); - return TAB_CondRetErro; - } - - // Adiciona esta peça na casa de destino - if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) - { - printf("Erro ao adicionar peca na casa destino \n"); - return TAB_CondRetErro; - } - - return TAB_CondRetOK; - } +/*************************************************************************** +* +* Função: TAB &Mover Peças tabuleiro +* ****/ + +TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) +{ + tppPeca pecatemp1, pecatemp2; + char cor; + LIS_tppLista listatemp; + int mov = casaDestino - casaOrigem; + + // Checa a validade das casas de origem e destino + if((casaOrigem < 0) || (casaOrigem > 23)) + { + printf("casaOrigem inválida \n"); + return TAB_CondRetErro; + } + if((casaDestino < 0) || (casaDestino > 23)) + { + printf("casaDestino inválida \n"); + return TAB_CondRetErro; + } + + // Ir para a casa de origem + IrInicioLista(pTab->Casas); + LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); + + // Obter referência para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Obter a cor da peca na lista temp + pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); + + // se pecatemp1 == NULL entao a lista está vazia + if(pecatemp1 == NULL) + { + printf("casa de origem esta vazia \n"); + return TAB_CondRetErro; + } + else // se nao + { + Pec_ObterCor(pecatemp1, &cor); + } + + // Excluir uma peça da lista temp + if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) + { + printf("Erro ao excluir peca da casa de orgiem\n"); + return TAB_CondRetErro; + } + + // Avança para a casa destino + LIS_AvancarElementoCorrente(pTab->Casas, mov); + + // Obtem a referencia para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Criar uma peça com a mesma cor q a peça antiga + if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) + { + printf("Erro ao criar a peca na casa destino \n"); + return TAB_CondRetErro; + } + + // Adiciona esta peça na casa de destino + if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) + { + printf("Erro ao adicionar peca na casa destino \n"); + return TAB_CondRetErro; + } + + return TAB_CondRetOK; +} diff --git a/tabuleiro/source/TABULEIRO.H b/tabuleiro/source/TABULEIRO.H index 979688c..ec7371c 100644 --- a/tabuleiro/source/TABULEIRO.H +++ b/tabuleiro/source/TABULEIRO.H @@ -2,59 +2,34 @@ #define TABULEIRO_ /*************************************************************************** * -* $MCD Módulo de definição: LIS Lista duplamente encadeada +* $MCD Módulo de definição: TAB Tabuleiro de Gamão * -* Arquivo gerado: LISTA.h -* Letras identificadoras: LIS +* Arquivo gerado: TABULEIRO.H +* Letras identificadoras: TAB * * Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW * * Projeto: INF 1301 / 1628 Automatização dos testes de módulos C * Gestor: LES/DI/PUC-Rio -* Autores: avs +* Autores: fvc + tbm * * $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento +* Versão Autor Data Observações +* 2 fvc, tbm 23/set/2015 Ajustes e Término do desenvolvimento +* 1 fvc 21/set/2015 início desenvolvimento * * $ED Descrição do módulo -* Implementa listas genéricas duplamente encadeadas. -* Podem existir n listas em operação simultaneamente. -* As listas possuem uma cabeça encapsulando o seu estado. -* -* Cada lista é homogênea quanto ao tipo dos dados que armazena. -* Cada elemento da lista referencia o valor que contém. -* -* Os ponteiros para os dados são copiados para elementos da lista. -* Não é copiado o valor apontado por estes ponteiros. -* -* O controle da destruição do valor de um elemento a ser excluído -* é realizado por uma função fornecida pelo usuário. -* -* Cada lista referencia uma função que determina como devem ser -* desalocados os dados nela contidos. -* -* A função de liberação dos valores contidos nos elementos deve -* assegurar a liberação de todos os espaços referênciados pelo -* valor contido em um elemento. -* Esta função é chamada antes de se desalocar um elemento -* de uma lista. -* Caso não seja necessário desalocar o valor referenciado pelo -* elemento, o ponteiro para a função de liberação poderá ser NULL . -* Caso o elemento da lista seja a única âncora do valor referenciado, -* esta função deve promover a destruição (free) desse valor e -* de todos os dados nele ancorados. +* O módulo implementa um simples tabuleiro de gamão +* e permite que peças sejam movimentadas pelo tabuleiro +* sem nenhuma restrição nem regras do gamão. * ***************************************************************************/ -#if defined( LISTA_OWN ) - #define LISTA_EXT +#if defined( TABULEIRO_OWN ) + #define TABULEIRO_EXT #else - #define LISTA_EXT extern + #define TABULEIRO_EXT extern #endif /***** Declarações exportadas pelo módulo *****/ @@ -66,11 +41,11 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; /*********************************************************************** * -* $TC Tipo de dados: LIS Condições de retorno +* $TC Tipo de dados: TAB Condições de retorno * * * $ED Descrição do tipo -* Condições de retorno das funções da lista +* Condições de retorno das funções do Tabuleiro * ***********************************************************************/ @@ -92,24 +67,20 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * $FC Função: TAB &Criar Tabuleiro * * $ED Descrição da função -* Cria uma lista genérica duplamente encadeada. -* Os possíveis tipos são desconhecidos a priori. -* A tipagem é implicita. -* Não existe identificador de tipo associado à lista. +* Cria um tabuleiro inicializado com as peças +* pretas e brancas no lugar correto como no início +* de um jogo de gamão * * $EP Parâmetros * ExcluirValor - ponteiro para a função que processa a * exclusão do valor referenciado pelo elemento * a ser excluído. -* Ver descrição do módulo. * * $FV Valor retornado -* Se executou corretamente retorna o ponteiro para a lista. -* Este ponteiro será utilizado pelas funções que manipulem esta lista. +* Se executou corretamente retorna TAB_CondRetOK * * Se ocorreu algum erro, por exemplo falta de memória ou dados errados, -* a função retornará NULL. -* Não será dada mais informação quanto ao problema ocorrido. +* a função retornará TAB_CondRetErro * ***********************************************************************/ @@ -122,14 +93,10 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * $FC Função: TAB &Destruir Tabuleiro * * $ED Descrição da função -* Destrói a lista fornecida. -* O parâmetro ponteiro para a lista não é modificado. -* Se ocorrer algum erro durante a destruição, a lista resultará -* estruturalmente incorreta. -* OBS. não existe previsão para possíveis falhas de execução. +* Destrói o Tabuleiro dado * * $FV Valor retornado -* LIS_CondRetOK - destruiu sem problemas +* TAB_CondRetOK - destruiu sem problemas * ***********************************************************************/ @@ -141,11 +108,12 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * $FC Função: TAB &Mover Peça do Tabuleiro * * $ED Descrição da função - +* Move a peça da casa de origem para a casa de destino. +* As casas variam de 0 a 23. * * $FV Valor retornado -* LIS_CondRetOK - Moveu sem problemas -* TAB_CondRetOK - Nao moveu a peça +* TAB_CondRetOK - Moveu sem problemas +* TAB_CondRetErro - Nao moveu a peça * ***********************************************************************/ @@ -157,7 +125,7 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; #undef TABULEIRO_EXT -/********** Fim do módulo de definição: LIS Lista duplamente encadeada **********/ +/********** Fim do módulo de definição: TAB Tabuleiro de Gamão **********/ #else #endif \ No newline at end of file diff --git a/tabuleiro/source/TESTTABULEIRO.C b/tabuleiro/source/TESTTABULEIRO.C index 0618ea5..80b8a8c 100644 --- a/tabuleiro/source/TESTTABULEIRO.C +++ b/tabuleiro/source/TESTTABULEIRO.C @@ -1,27 +1,21 @@ /*************************************************************************** -* $MCI Módulo de implementação: Módulo de teste específico - -* Módulo modificado para operar matrizes que armazenam listas! +* $MCI Módulo de implementação: TAB Tabuleiro de Gamão * -* Arquivo gerado: TESTPECA.C -* Letras identificadoras: TPec +* Arquivo gerado: TABULEIRO.C +* Letras identificadoras: TTAB * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa - fvc - Felipe Vieira Cortes +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * * $HA Histórico de evolução: -* Versão Autor Data Observações - 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes -* 3.00 avs 28/02/2003 Uniformização da interface das funções e -* de todas as condições de retorno. -* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação -* 1.00 avs 15/08/2001 Início do desenvolvimento +* Versão Autor Data Observações +* 2 fvc, tbm 23/set/2015 término do deselvolvimento +* 1 fvc, tbm 21/set/2015 início desenvolvimento * * $ED Descrição do módulo * Este módulo contém as funções específicas para o teste do @@ -31,9 +25,9 @@ * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: * -* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); -* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); -* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +* =criartabuleiro - Chama a função TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, void ( * ExcluirValor ) ( void * pDado ) ) ; +* =destruirtabuleiro - Chama a função TAB_tpCondRet TAB_DestruirTabuleiro( TAB_tppTabuleiro pTab ); +* =moverpeca - Chama a função TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; ***************************************************************************/ #include @@ -51,7 +45,6 @@ #define MOVER_PECA_CMD "=moverpeca" TAB_tppTabuleiro Tab; -/***** Código das funções exportadas pelo módulo *****/ /***** Protótipos das funções encapuladas no módulo *****/ @@ -62,11 +55,11 @@ TAB_tppTabuleiro Tab; /*********************************************************************** * -* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* $FC Função: TTAB Efetuar operações de teste específicas para o Modulo Tabuleiro * * $ED Descrição da função * Efetua os diversos comandos de teste específicos para o módulo -* Peca sendo testado. +* de Tabuleiro de gamão. * * $EP Parâmetros * $P ComandoTeste - String contendo o comando @@ -149,7 +142,7 @@ TAB_tppTabuleiro Tab; /*********************************************************************** * -* $FC Função: TLIS -Destruir valor +* $FC Função: TTAB -Destruir valor * ***********************************************************************/ @@ -158,4 +151,4 @@ void DestruirValor( void * pValor ) free( pValor ) ; - } /* Fim função: TLIS -Destruir valor */ \ No newline at end of file + } /* Fim função: TTAB-Destruir valor */ \ No newline at end of file diff --git a/tabuleiro/testetabuleiroscript.script b/tabuleiro/testetabuleiroscript.script index 71a856e..6d7b4b5 100644 --- a/tabuleiro/testetabuleiroscript.script +++ b/tabuleiro/testetabuleiroscript.script @@ -11,7 +11,34 @@ =recuperar == Mover Peca da casa 23 para a 0 -=moverpeca 23 0 0 +=moverpeca 23 0 0 + +== Mover uma peça por todas as casas do tabuleiro de 0 a 23 + +=moverpeca 0 1 0 +=moverpeca 1 2 0 +=moverpeca 2 3 0 +=moverpeca 3 4 0 +=moverpeca 4 5 0 +=moverpeca 5 6 0 +=moverpeca 6 7 0 +=moverpeca 7 8 0 +=moverpeca 8 9 0 +=moverpeca 9 10 0 +=moverpeca 10 11 0 +=moverpeca 11 12 0 +=moverpeca 12 13 0 +=moverpeca 13 14 0 +=moverpeca 14 15 0 +=moverpeca 15 16 0 +=moverpeca 16 17 0 +=moverpeca 17 18 0 +=moverpeca 18 19 0 +=moverpeca 19 20 0 +=moverpeca 20 21 0 +=moverpeca 21 22 0 +=moverpeca 22 23 0 + == Destruir Tabuleiro =destruirtabuleiro 0 \ No newline at end of file From 62496cd9c30b90e84a662e7eed010a11473999a7 Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Fri, 25 Sep 2015 22:35:50 -0300 Subject: [PATCH 13/18] =?UTF-8?q?Tudo=20atualizado,=20execut=C3=A1veis=20e?= =?UTF-8?q?m=20deployment,=20sources=20corretos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DADOPONTOS.c | 79 ++-- DADOPONTOS.h | 32 +- Dado/TRAB2-2.exe | Bin 121344 -> 121344 bytes Dado/logtestedado.txt | 16 +- DadoPontos/TRAB2-4.exe | Bin 122368 -> 122368 bytes DadoPontos/TesteDadoPontos.script | 42 -- DadoPontos/logTesteDadoPontos.txt | 36 +- GERAALT.C | 123 ------ GERAALT.H | 169 -------- PECA.C | 11 +- PECA.h | 9 +- TABULEIRO.C | 172 ++++---- TABULEIRO.H | 88 ++-- TESTDADOPONTOS.c | 106 ++--- TESTPECA.C | 6 +- TESTTABULEIRO.C | 35 +- peca/TRAB2-3.exe | Bin 121856 -> 121856 bytes sourcemaster/ArcaboucoTeste.lib | Bin 89288 -> 0 bytes sourcemaster/GENERICO.H | 588 -------------------------- sourcemaster/LERPARM.H | 463 -------------------- sourcemaster/TST_ESPC.H | 320 -------------- tabuleiro/TRAB2-1.exe | Bin 46080 -> 123904 bytes tabuleiro/logsaidatabuleiro.txt | 12 +- tabuleiro/source/DADO.H | 72 ---- tabuleiro/source/DADO.c | 86 ---- tabuleiro/source/TABULEIRO.C | 2 +- tabuleiro/testetabuleiroscript.script | 3 +- 27 files changed, 269 insertions(+), 2201 deletions(-) delete mode 100644 GERAALT.C delete mode 100644 GERAALT.H delete mode 100644 sourcemaster/ArcaboucoTeste.lib delete mode 100644 sourcemaster/GENERICO.H delete mode 100644 sourcemaster/LERPARM.H delete mode 100644 sourcemaster/TST_ESPC.H delete mode 100644 tabuleiro/source/DADO.H delete mode 100644 tabuleiro/source/DADO.c diff --git a/DADOPONTOS.c b/DADOPONTOS.c index 14006e1..94cc6f1 100644 --- a/DADOPONTOS.c +++ b/DADOPONTOS.c @@ -2,14 +2,14 @@ * $MCI Módulo de implementação: Gerador de numeroes aleatorios restrito ao * numero de faces * -* Arquivo gerado: DADO.c -* Letras identificadoras: DAD +* Arquivo gerado: DADOPONTOS.c +* Letras identificadoras: DADPnt * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa +* Autores: * fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão @@ -21,9 +21,10 @@ ***************************************************************************/ #include -#include -#include "DADO.H" -#include "GERAALT.H" +#include +#include +#include +#include "GENERICO.H" #define DADO_OWN #include "DADOPONTOS.h" @@ -40,17 +41,12 @@ typedef struct tgDadoPontos { int valor; /*Valor atual do dado de pontos*/ - char * CorDoJogador; + char CorDoJogador; /*Ponteiro para o jogador que pode usar o dado *$EED Assertivas Estruturais * É NULL se o jogo esta no começo e ninguem fez nenhuma dobra */ } tpDadoPontos ; -/* - typedef struct tgPlayers { - int id; - } tpPlayers; - /*Struct Temporaria*/ /***** Dados encapsulados no módulo *****/ @@ -62,53 +58,62 @@ * Função: DADPnt Criar Dado de Pontos * ****/ -DADPnt_tpCondRet DADPtn_CriarDado(tppDadoPontos * DadoCriado) +DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoPontoCriado) { - struct tgDadoPontos * DadoNovo; - DadoNovo = (tpDadoPontos*)malloc(sizeof(tpDadoPontos)); - if(DadoNovo = NULL) + + *DadoPontoCriado = (tpDadoPontos*)malloc(sizeof(tpDadoPontos)); + + if(DadoPontoCriado == NULL) return DADPnt_CondRetFaltouMemoria; - DadoNovo->valor = 2; + + (*DadoPontoCriado)->valor = 2; /*Valor Inicial do Dado de Pontos*/ - DadoNovo->CorDoJogador = NULL; - /*Quando o dado é criado, todos os jogadores podem usa-lo o inicio*/ - (*DadoCriado) = DadoNovo; + (*DadoPontoCriado)->CorDoJogador = 's'; + /*Quando o dado é criado, todos os jogadores podem usa-lo o inicio + s determinado que qualquer jogador pode usar*/ return DADPnt_CondRetOK; } /*************************************************************************** * -* Função: DADPnt Dobrar Dado de Pontos +* Função: DADPnt Dobrar Dado de Pontos e Mudar "Dono" do Dado de Pontos * ****/ -DADPnt_tpCondRet DADPtn_DobrarDado(tppDadoPontos DadoDobrar) +DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono) { DadoDobrar->valor = DadoDobrar->valor * 2; /*Pega o valor atual do dado e multiplica por 2*/ + DadoDobrar->CorDoJogador = CorNovoDono; return DADPnt_CondRetOK; } + /*************************************************************************** * -* Função: DADPnt Mudar "Dono" do Dado de Pontos +* Função: DADPnt Gerar Valor da Partida * ****/ -DADPnt_tpCondRet DADPtn_MudDono(tppDadoPontos DadoDono, char * cor) +DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos DadoAtual, int * valorjogo) { - DadoDono->CorDoJogador = cor; - /*Troca o jogador que pode realizar a dobra*/ - return DADPnt_CondRetOK; + if(DadoAtual->CorDoJogador == 's' ) + *valorjogo = 2; + else + *valorjogo = DadoAtual->valor; + return DADPnt_CondRetOK; } /*************************************************************************** * -* Função: DADPnt Gerar Valor da Partida -* ****/ +* $FC Função: DADPnt Obter "Dono" do dado de pontos atual +* +* $ED Descrição da função +* Retorno o dono do Dado +* $FV Valor retonado +* DADPnt_CondRetOK +* +***********************************************************************/ -DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos Dado, int * valorjogo) +DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos DadoPonto, char * CorDonoAtual) { - if(Dado->CorDoJogador == NULL) - *valorjogo = 1; - else - *valorjogo = Dado->valor; + *CorDonoAtual = DadoPonto->CorDoJogador; return DADPnt_CondRetOK; } @@ -117,10 +122,10 @@ DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos Dado, int * valorjogo) * Função: DADPnt Destruir Dado de Pontos * ****/ -DADPnt_tpCondRet DADPtn_DestruirDado(tppDadoPontos Dado) +DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado) { - Dado->CorDoJogador = NULL; - Dado->valor = 0; + if(Dado == NULL) + return DADPnt_CondRetDadoPontosNaoExiste; free(Dado); return DADPnt_CondRetOK; } diff --git a/DADOPONTOS.h b/DADOPONTOS.h index 3bdd603..decba33 100644 --- a/DADOPONTOS.h +++ b/DADOPONTOS.h @@ -9,8 +9,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão @@ -31,11 +30,13 @@ #define DADOPONTOS_EXT extern #endif +#include "Generico.h" + typedef struct tgDadoPontos * tppDadoPontos; typedef struct tgPlayers * tppPlayers; /*********************************************************************** * -* $TC Tipo de dados: MAT Condicoes de retorno +* $TC Tipo de dados: DADPnt Condicoes de retorno * * ***********************************************************************/ @@ -48,7 +49,7 @@ typedef struct tgPlayers * tppPlayers; DADPnt_CondRetErro = 1 , /* Estrutura do DadoPontos está errada */ - DADPnt_CondRetMatrizNaoExiste = 2 , + DADPnt_CondRetDadoPontosNaoExiste = 2 , /* DadoPontos não existe */ DADPnt_CondRetFaltouMemoria = 3 @@ -69,48 +70,47 @@ typedef struct tgPlayers * tppPlayers; * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_CriarDado(tppDadoPontos * DadoCriado); +DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoCriado); /*************************************************************************** * -* $FC Função: DADPnt Dobrar Dado de Pontos +* $FC Função: DADPnt Dobrar Dado de Pontos e Mudar "Dono" do Dado de Pontos * * $ED Descrição da função -* Dobra o valor da partida +* Dobra o valor da partida e Muda o jogador que possa usar o Dado de Pontos * $FV Valor retonado * DADPnt_CondRetOK * DADPnt_CondRetFaltouMemoria * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_DobrarDado(tppDadoPontos DadoDobrar); +DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); /*************************************************************************** * -* $FC Função: DADPnt Mudar "Dono" do Dado de Pontos +* $FC Função: DADPnt Valor da partida * * $ED Descrição da função -* Muda o jogador que possa usar o Dado de Pontos +* Gera o valor atual da partida * $FV Valor retonado * DADPnt_CondRetOK -* DADPnt_CondRetFaltouMemoria * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_MudDono(tppDadoPontos DadoDono, char * cor); +DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos Dado, int * valorjogo); /*************************************************************************** * -* $FC Função: DADPnt Valor da partida +* $FC Função: DADPnt Obter "Dono" do dado de pontos atual * * $ED Descrição da função -* Gera o valor atual da partida +* Retorno o dono do Dado * $FV Valor retonado * DADPnt_CondRetOK * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos Dado, int * valorjogo); +DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos Dado, char * corRecebida); /*************************************************************************** * @@ -124,7 +124,7 @@ DADPnt_tpCondRet DADPtn_ValorPartida(tppDadoPontos Dado, int * valorjogo); * ***********************************************************************/ -DADPnt_tpCondRet DADPtn_DestruirDado(tppDadoPontos Dado); +DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado); #undef DADOPONTOS_EXT diff --git a/Dado/TRAB2-2.exe b/Dado/TRAB2-2.exe index 0e98174eb969af995178514e0554fa1081bb0cc7..30a7029e87c86b178bebaac42f613944cd013f2a 100644 GIT binary patch delta 20743 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 delta 20853 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 Bop%5L diff --git a/Dado/logtestedado.txt b/Dado/logtestedado.txt index 21ecdb7..9c0ab8a 100644 --- a/Dado/logtestedado.txt +++ b/Dado/logtestedado.txt @@ -14,23 +14,23 @@ LES - Laborat 4 == Jogar o dado 10 vezes dado: 2 - dado: 1 + dado: 5 - dado: 2 + dado: 6 - dado: 4 + dado: 6 dado: 4 - dado: 3 + dado: 5 - dado: 2 + dado: 4 - dado: 3 + dado: 5 - dado: 6 + dado: 4 - dado: 2 + dado: 4 !!! Número de linhas lidas: 14 diff --git a/DadoPontos/TRAB2-4.exe b/DadoPontos/TRAB2-4.exe index fb7f52b21b76851c8be7990f9f3dc27a91590922..fe3098dc2e0208f6dd950c8dd324bf801e5d4bd0 100644 GIT binary patch delta 13239 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 delta 13317 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 Y82gDfTo>> 1 Linha: 77 Valor da Partida Errado Deveria ser: 63 É: 64 -<<< 0 Linha: 78 Falha esperada foi recuperada. - 82 == Obter Valor - 88 == Destruir DadoPontos - -!!! Número de linhas lidas: 90 + 7 == Obter Dono + 10 == Obter Valor + 13 == Dobrar Dado + 16 == Obter Dono + 19 == Obter Valor + 22 == Dobrar Dado + 25 == Dobrar Dado + 28 == Dobrar Dado + 31 == Obter Valor + 34 == Dobrar Dado + 37 == Obter Dono + 40 == Obter Valor Errado +>>> 1 Linha: 41 Valor da Partida Errado Deveria ser: 63 É: 64 +<<< 0 Linha: 42 Falha esperada foi recuperada. + 44 == Obter Valor + 47 == Destruir DadoPontos + +!!! Número de linhas lidas: 48 !!! Número de casos de teste: 15 !!! Número comandos corretos: 14 !!! Número de falhas encontradas: 0 diff --git a/GERAALT.C b/GERAALT.C deleted file mode 100644 index 869519a..0000000 --- a/GERAALT.C +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: ALT Gerador de números aleatórios -* -* Arquivo gerado: GERAALT.c -* Letras identificadoras: ALT -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -***************************************************************************/ - -#include -#include - -#define GERAALT_OWN -#include "GERAALT.h" -#undef GERAALT_OWN - -/***** Código das funções exportadas pelo módulo *****/ - -/*************************************************************************** -* -* Função: ALT &Inicializar o gerador de números aleatórios -* ****/ - - void ALT_Inicializar( unsigned int Base ) - { - - if ( Base == 0 ) - { - srand( 3141592653 ) ; - } else if ( Base == 1 ) - { - srand( 3141592653 | ( unsigned int ) time( NULL )) ; - } else - { - srand( Base ) ; - } /* if */ - - } /* Fim função: ALT &Inicializar o gerador de números aleatórios */ - -/*************************************************************************** -* -* Função: ALT &Gerar inteiro em uniformemente distribuído -* ****/ - - int ALT_GerarDistUniforme( int Inf , int Sup ) - { - - double x ; - int i ; - do - { - x = rand( ) ; /* converte para flutuante */ - x /= RAND_MAX ; /* 0.0000 <= x <= 1.0000 */ - } while ( x == 1.0 ); /* evitar valor == 1 */ - - #pragma warning(disable:4244) - i = ( Sup - Inf + 1 ) * x ; /* converte/trunca de volta para inteiro */ - #pragma warning(default:4244) - return Inf + i ; - - } /* Fim função: ALT &Gerar inteiro em uniformemente distribuído */ - -/*************************************************************************** -* -* Função: ALT &Gerar distribuição dada por tabela de freqüências -* ****/ - - int ALT_GerarFrequencia( int numElem , int * vetElem , int Limite ) - { - - int i , - j ; - - i = ALT_GerarDistUniforme( 0 , Limite ) ; - for( j = 0 ; j < numElem ; j++ ) - { - if ( i <= vetElem[ j ] ) - { - return j ; - } /* if */ - } /* for */ - return numElem ; - - } /* Fim função: ALT &Gerar distribuição dada por tabela de freqüências */ - -/*************************************************************************** -* -* Função: ALT &Gerar permutação randômica uniformemente distribuída -* ****/ - - void ALT_GerarPermutacao( int tamVetor , - int * Vetor ) - { - - int Temp , - inx , - i ; - - for( i = tamVetor - 1 ; i >= 1 ; i-- ) - { - inx = ALT_GerarDistUniforme( 0 , i ) ; - Temp = Vetor[ inx ] ; - Vetor[ inx ] = Vetor[ i ] ; - Vetor[ i ] = Temp ; - } /* for */ - - } /* Fim função: ALT &Gerar permutação randômica uniformemente distribuída */ - -/********** Fim do módulo de implementação: ALT Gerador de números aleatórios **********/ - diff --git a/GERAALT.H b/GERAALT.H deleted file mode 100644 index dac322d..0000000 --- a/GERAALT.H +++ /dev/null @@ -1,169 +0,0 @@ -#if ! defined( GERAALT_ ) -#define GERAALT_ -/*************************************************************************** -* -* $MCD Módulo de definição: ALT Gerador de números aleatórios -* -* Arquivo gerado: GERAALT.h -* Letras identificadoras: ALT -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* Implementa um pequeno conjunto de geradores de números aleatórios. -* -* $EIM Interface com outros módulos -* Antes de gerar qualquer número deve ser chamada a função -* ALT_Inicializar. -* -***************************************************************************/ - -#if defined( GERAALT_OWN ) - #define GERAALT_EXT -#else - #define GERAALT_EXT extern -#endif - - -/*********************************************************************** -* -* $FC Função: ALT &Inicializar o gerador de números aleatórios -* -* $ED Descrição da função -* Inicializa o gerador de números aleatórios. -* Esta função deve ser chamada antes de qualquer outra do módulo GERAALT -* -* $EP Parâmetros -* Base - se == 0 utiliza a semente normal (PI 3141592653 ) -* isto gerará a mesma seqüência de números aleatórios -* a seguir da inicialização. Esta semente é tida como -* uma boa semente, a distribuição é virtualmente uniforme -* e a cardinalidade é a maior possível. -* se == 1 utiliza a PI | time( ) -* isto gera uma seqüência de números aleatórios -* diferente a cada inicialização -* outros - utiliza o valor fornecido como semente -* deve ser tomado cuidado pois uma semente mal escolhida -* pode levar à geração de uma seqüência não aleatória, -* ou de cardinalidade limitada. -* -* $ER Requisitos -* Esta função deve ser chamada uma única vez e isso antes de gerar -* o primeiro número aleatório -* -***********************************************************************/ - - void ALT_Inicializar( unsigned int Base ) ; - - -/*********************************************************************** -* -* $FC Função: ALT &Gerar inteiro em uniformemente distribuído -* -* $ED Descrição da função -* Gerar um número inteiro uniformemente distribuído em um -* intervalo dado -* -* $EP Parâmetros -* $P Inf - limite inferior, inclusive -* $P Sup - limite superior, inclusive -* -* $FV Valor retornado -* Inf <= x <= Sup -* -* $EAE Assertivas de entradas esperadas -* Inf <= Sup -* Dados errados provocarão um comportamento errático no programa. -* -***********************************************************************/ - - int ALT_GerarDistUniforme( int Inf , int Sup ) ; - - -/*********************************************************************** -* -* $FC Função: ALT &Gerar distribuição dada por tabela de freqüências -* -* $ED Descrição da função -* Gerar distribuição segundo tabela de freqüências -* -* $EP Parâmetros -* $P numElem - número de elementos (intervalos) da tabela -* o número de intervalos é na realidade igual a numElem + 1 -* $P vetElem - vetor de elementos da tabela -* Os valores dos elementos são números entre 0 e Limite - 1 -* Os elementos devem estar em ordem crescente. -* Os elementos correspondem a uma função cumulativa -* Exemplo, se forem desejados as freqüências -* 10% 30% e 60% -* devem ser fornecidos os dados 2 {10 , 40} 100 -* $P Limite - é o limite superior da distribuição de freqüências -* Permite chegar a freqüências muito pequenas, por exemplo -* para uma distribuição de freqüências 9999/10000 e -* 1/10000 forneça os parâmetros -* 1 9999 10000 -* -* $FV Valor retornado -* O índice da freqüência 0 <= indice <= numElem, com uma probabilidade -* igual ao correspondente intervalo. -* -* A probabilidade x é dada por -* x = ( vetElem[ i ] - vetElem[ i - 1 ] ) / Limite -* para todos i , 0 <= i <= numElem -* sendo que vetElem[ -1 ] é assumido igual a 0 -* sendo que vetElem[ numElem ] é assumido igual a Limite -* -* $EAE Assertivas de entradas esperadas -* numElem >= 1 -* vetElem[ numElem - 1 ] < Limite -* para todos i, 0 <= i < numElem : vetElem[ i - 1 ] < vetElem[ i ] -* sendo que vetElem[ -1 ] é considerado igual a 0 -* Dados errados provocarão um comportamento errático no programa. -* -***********************************************************************/ - - int ALT_GerarFrequencia( int numElem , int * vetElem , int Limite ) ; - - -/*********************************************************************** -* -* $FC Função: ALT &Gerar permutação randômica uniformemente distribuída -* -* $ED Descrição da função -* Gera uma permutação de n elementos uniformemente distribuída. -* O algoritmo utilizado é o "Knuth shuffle" descrito na Wikipedia. -* -* $EP Parâmetros -* $P tamVetor - número de elementos a serem embaralhados -* $P Vetor - elementos a serem embaralhados. O vetor deve conter -* pelo menos tamVetor elementos. Caso não contenha, os -* resultados serão impreditíveis, possivelmente -* desastrosos. -* O vetor deve estar inicializado com os elementos a -* serem permutados. Por exemplo, no caso de um baralho, -* o vetor deve ser inicializado com a seqüência de -* índices das cartas (0 a 51). -* -***********************************************************************/ - - void ALT_GerarPermutacao( int tamVetor , - int * Vetor ) ; - -#undef GERAALT_EXT - -/********** Fim do módulo de definição: ALT Gerador de números aleatórios **********/ - -#else -#endif diff --git a/PECA.C b/PECA.C index 696d6a6..bf24f92 100644 --- a/PECA.C +++ b/PECA.C @@ -8,8 +8,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * @@ -37,17 +36,13 @@ ***********************************************************************/ typedef struct tgPeca{ - int *posicao; - /*Pontei para a posicao da peca, ainda deve ser alterado pelo tipo correto.*/ char cor; - /*Devemos usar um inteiro para facilitar a manipulacao da peça pela cor? Porem a cor tambem determia qual jogador - tem a posse da peca*/ - //struct tpp * jogador; } tpPeca; /***** Dados encapsulados no módulo *****/ +// vazio /***** Código das funções exportadas pelo módulo *****/ @@ -75,6 +70,8 @@ Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado, char CorDaNovaPeca) Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca) { + + free(Peca); return Pec_CondRetOK; } diff --git a/PECA.h b/PECA.h index a63d488..2458e5e 100644 --- a/PECA.h +++ b/PECA.h @@ -9,8 +9,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes +* Autores: fvc - Felipe Vieira Côrtes * tbm - Tássio Borges de Miranda * db - Daniela Brazão @@ -58,7 +57,7 @@ typedef struct tgPeca * tppPeca; /*********************************************************************** * -* $FC Função: DADPnt Criar Peça +* $FC Função: PEC Criar Peça * * $ED Descrição da função * Cria uma nova peça @@ -72,7 +71,7 @@ typedef struct tgPeca * tppPeca; /*********************************************************************** * -* $FC Função: DADPnt Destruir Peça +* $FC Função: PEC Destruir Peça * * $ED Descrição da função * Destroi uma peça @@ -86,7 +85,7 @@ typedef struct tgPeca * tppPeca; /*********************************************************************** * -* $FC Função: DADPnt Obter Cor +* $FC Função: PEC Obter Cor * * $ED Descrição da função * Obtem cor de uma peca diff --git a/TABULEIRO.C b/TABULEIRO.C index 572c12a..a1c0b5f 100644 --- a/TABULEIRO.C +++ b/TABULEIRO.C @@ -1,22 +1,21 @@ /*************************************************************************** -* $MCI Módulo de implementação: LIS Lista duplamente encadeada +* $MCI Módulo de implementação: TAB Tabuleiro de Gamão * -* Arquivo gerado: LISTA.c -* Letras identificadoras: LIS +* Arquivo gerado: TABULEIRO.C +* Letras identificadoras: TAB * * Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW * * Projeto: INF 1301 / 1628 Automatização dos testes de módulos C * Gestor: LES/DI/PUC-Rio -* Autores: avs +* Autores: fvc - Felipe Vieira Cortes +* tbm - Tássio Borges de Miranda +* db - Daniela Brazão * * $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento +* Versão Autor Data Observações +* 2 fvc, tbm 23/set/2015 término do deselvolvimento +* 1 fvc, tbm 21/set/2015 início desenvolvimento ***************************************************************************/ @@ -52,7 +51,7 @@ typedef struct TAB_tagTabuleiro { /*************************************************************************** * -* Função: LIS &Criar Tabuleiro +* Função: TAB &Criar Tabuleiro * ****/ TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, @@ -104,28 +103,17 @@ TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, for(i = 0; i < 24; i++) LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); - //free(vtCasa); - //free(vtPecaB); - //free(vtPecaP); - return TAB_CondRetOK; } -/* Destuir Tabuleiro */ +/*************************************************************************** +* +* Função: TAB &Destruir Tabuleiro +* ****/ TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) { - //LIS_tppLista temp; -// int i; - // Destroi as 24 casas - //IrFinalLista(pTab->Casas); - /*for(i = 0; i < 24; i++) - { - temp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - LIS_DestruirLista(temp); - LIS_AvancarElementoCorrente(pTab->Casas, -1); - }*/ - // Destroi a lista principal + LIS_DestruirLista(pTab->Casas); // Libera o ponteiro para o tabuleiro free(pTab); @@ -133,62 +121,80 @@ TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) return TAB_CondRetOK; } - TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) - { - tppPeca pecatemp1, pecatemp2; - char cor; - LIS_tppLista listatemp; - int mov = casaDestino - casaOrigem; - - // Ir para a casa de origem - IrInicioLista(pTab->Casas); - LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); - - // Obter referência para a lista nela armazenada - listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - - // Obter a cor da peca na lista temp - pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); - // se pecatemp1 == NULL entao a lista está vazia - if(pecatemp1 == NULL) - { - printf("casa de origem esta vazia \n"); - return TAB_CondRetErro; - } - else // se nao - { - Pec_ObterCor(pecatemp1, &cor); - } - - // Excluir uma peça da lista temp - if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) - { - printf("Erro ao excluir peca da casa de orgiem\n"); - return TAB_CondRetErro; - } - - // Avança para a casa destino - LIS_AvancarElementoCorrente(pTab->Casas, mov); - - // Obtem a referencia para a lista nela armazenada - listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - - // Criar uma peça com a mesma cor q a peça antiga - if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) - { - printf("Erro ao criar a peca na casa destino \n"); - return TAB_CondRetErro; - } - - // Adiciona esta peça na casa de destino - if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) - { - printf("Erro ao adicionar peca na casa destino \n"); - return TAB_CondRetErro; - } - - return TAB_CondRetOK; - } +/*************************************************************************** +* +* Função: TAB &Mover Peças tabuleiro +* ****/ + +TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) +{ + tppPeca pecatemp1, pecatemp2; + char cor; + LIS_tppLista listatemp; + int mov = casaDestino - casaOrigem; + + // Checa a validade das casas de origem e destino + if((casaOrigem < 0) || (casaOrigem > 23)) + { + printf("casaOrigem inválida \n"); + return TAB_CondRetErro; + } + if((casaDestino < 0) || (casaDestino > 23)) + { + printf("casaDestino inválida \n"); + return TAB_CondRetErro; + } + + // Ir para a casa de origem + IrInicioLista(pTab->Casas); + LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); + + // Obter referência para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Obter a cor da peca na lista temp + pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); + + // se pecatemp1 == NULL entao a lista está vazia + if(pecatemp1 == NULL) + { + printf("casa de origem esta vazia \n"); + return TAB_CondRetErro; + } + else // se nao + { + Pec_ObterCor(pecatemp1, &cor); + } + + // Excluir uma peça da lista temp + if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) + { + printf("Erro ao excluir peca da casa de orgiem\n"); + return TAB_CondRetErro; + } + + // Avança para a casa destino. + LIS_AvancarElementoCorrente(pTab->Casas, mov); + + // Obtem a referencia para a lista nela armazenada + listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); + + // Criar uma peça com a mesma cor q a peça antiga + if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) + { + printf("Erro ao criar a peca na casa destino \n"); + return TAB_CondRetErro; + } + + // Adiciona esta peça na casa de destino + if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) + { + printf("Erro ao adicionar peca na casa destino \n"); + return TAB_CondRetErro; + } + + return TAB_CondRetOK; +} diff --git a/TABULEIRO.H b/TABULEIRO.H index 979688c..ec7371c 100644 --- a/TABULEIRO.H +++ b/TABULEIRO.H @@ -2,59 +2,34 @@ #define TABULEIRO_ /*************************************************************************** * -* $MCD Módulo de definição: LIS Lista duplamente encadeada +* $MCD Módulo de definição: TAB Tabuleiro de Gamão * -* Arquivo gerado: LISTA.h -* Letras identificadoras: LIS +* Arquivo gerado: TABULEIRO.H +* Letras identificadoras: TAB * * Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW * * Projeto: INF 1301 / 1628 Automatização dos testes de módulos C * Gestor: LES/DI/PUC-Rio -* Autores: avs +* Autores: fvc + tbm * * $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento +* Versão Autor Data Observações +* 2 fvc, tbm 23/set/2015 Ajustes e Término do desenvolvimento +* 1 fvc 21/set/2015 início desenvolvimento * * $ED Descrição do módulo -* Implementa listas genéricas duplamente encadeadas. -* Podem existir n listas em operação simultaneamente. -* As listas possuem uma cabeça encapsulando o seu estado. -* -* Cada lista é homogênea quanto ao tipo dos dados que armazena. -* Cada elemento da lista referencia o valor que contém. -* -* Os ponteiros para os dados são copiados para elementos da lista. -* Não é copiado o valor apontado por estes ponteiros. -* -* O controle da destruição do valor de um elemento a ser excluído -* é realizado por uma função fornecida pelo usuário. -* -* Cada lista referencia uma função que determina como devem ser -* desalocados os dados nela contidos. -* -* A função de liberação dos valores contidos nos elementos deve -* assegurar a liberação de todos os espaços referênciados pelo -* valor contido em um elemento. -* Esta função é chamada antes de se desalocar um elemento -* de uma lista. -* Caso não seja necessário desalocar o valor referenciado pelo -* elemento, o ponteiro para a função de liberação poderá ser NULL . -* Caso o elemento da lista seja a única âncora do valor referenciado, -* esta função deve promover a destruição (free) desse valor e -* de todos os dados nele ancorados. +* O módulo implementa um simples tabuleiro de gamão +* e permite que peças sejam movimentadas pelo tabuleiro +* sem nenhuma restrição nem regras do gamão. * ***************************************************************************/ -#if defined( LISTA_OWN ) - #define LISTA_EXT +#if defined( TABULEIRO_OWN ) + #define TABULEIRO_EXT #else - #define LISTA_EXT extern + #define TABULEIRO_EXT extern #endif /***** Declarações exportadas pelo módulo *****/ @@ -66,11 +41,11 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; /*********************************************************************** * -* $TC Tipo de dados: LIS Condições de retorno +* $TC Tipo de dados: TAB Condições de retorno * * * $ED Descrição do tipo -* Condições de retorno das funções da lista +* Condições de retorno das funções do Tabuleiro * ***********************************************************************/ @@ -92,24 +67,20 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * $FC Função: TAB &Criar Tabuleiro * * $ED Descrição da função -* Cria uma lista genérica duplamente encadeada. -* Os possíveis tipos são desconhecidos a priori. -* A tipagem é implicita. -* Não existe identificador de tipo associado à lista. +* Cria um tabuleiro inicializado com as peças +* pretas e brancas no lugar correto como no início +* de um jogo de gamão * * $EP Parâmetros * ExcluirValor - ponteiro para a função que processa a * exclusão do valor referenciado pelo elemento * a ser excluído. -* Ver descrição do módulo. * * $FV Valor retornado -* Se executou corretamente retorna o ponteiro para a lista. -* Este ponteiro será utilizado pelas funções que manipulem esta lista. +* Se executou corretamente retorna TAB_CondRetOK * * Se ocorreu algum erro, por exemplo falta de memória ou dados errados, -* a função retornará NULL. -* Não será dada mais informação quanto ao problema ocorrido. +* a função retornará TAB_CondRetErro * ***********************************************************************/ @@ -122,14 +93,10 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * $FC Função: TAB &Destruir Tabuleiro * * $ED Descrição da função -* Destrói a lista fornecida. -* O parâmetro ponteiro para a lista não é modificado. -* Se ocorrer algum erro durante a destruição, a lista resultará -* estruturalmente incorreta. -* OBS. não existe previsão para possíveis falhas de execução. +* Destrói o Tabuleiro dado * * $FV Valor retornado -* LIS_CondRetOK - destruiu sem problemas +* TAB_CondRetOK - destruiu sem problemas * ***********************************************************************/ @@ -141,11 +108,12 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; * $FC Função: TAB &Mover Peça do Tabuleiro * * $ED Descrição da função - +* Move a peça da casa de origem para a casa de destino. +* As casas variam de 0 a 23. * * $FV Valor retornado -* LIS_CondRetOK - Moveu sem problemas -* TAB_CondRetOK - Nao moveu a peça +* TAB_CondRetOK - Moveu sem problemas +* TAB_CondRetErro - Nao moveu a peça * ***********************************************************************/ @@ -157,7 +125,7 @@ typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; #undef TABULEIRO_EXT -/********** Fim do módulo de definição: LIS Lista duplamente encadeada **********/ +/********** Fim do módulo de definição: TAB Tabuleiro de Gamão **********/ #else #endif \ No newline at end of file diff --git a/TESTDADOPONTOS.c b/TESTDADOPONTOS.c index e6338a5..138d65e 100644 --- a/TESTDADOPONTOS.c +++ b/TESTDADOPONTOS.c @@ -4,17 +4,17 @@ * Módulo modificado para operar matrizes que armazenam listas! * * Arquivo gerado: TESTDADOPONTOS.C -* Letras identificadoras: TPec +* Letras identificadoras: TDADPnt * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão -* + * $HA Histórico de evolução: * Versão Autor Data Observações 4.00 tbm 23/08/2015 Módulo modificado para operar dadospontos @@ -31,9 +31,11 @@ * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: * -* =criardadoponto - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); -* =destruirdadoponto - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); -* =obtervalorjogo - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +* =criardadoponto - Chama a função DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoCriado); +* =destruirdadoponto - Chama a função DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado); +* =obtervalorjogo - Chama a função DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos Dado, int * valorjogo); +* =dobrardado - Chama a função DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); +* =obterdono - B Chama a função DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos Dado, char * corRecebida); ***************************************************************************/ #include @@ -55,16 +57,16 @@ #define OBTER_DONO_CMD "=obterdono" -tppDadoPontos P[MAX]; +tppDadoPontos DadoPnt; /***** Código das funções exportadas pelo módulo *****/ /*********************************************************************** * -* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* $FC Função: TDADPnt Efetuar operações de teste específicas para o Modulo DadoPontos * * $ED Descrição da função * Efetua os diversos comandos de teste específicos para o módulo -* Peca sendo testado. +* DadoPontos sendo testado. * * $EP Parâmetros * $P ComandoTeste - String contendo o comando @@ -90,47 +92,41 @@ tppDadoPontos P[MAX]; int i = 0; int ValorPontos,valoresperado; char corRecebida; - int inxpec; TST_tpCondRet Ret; - /* Testar Pec Criar Dado Pontos */ + /* Testar TDADPnt &Criar Dado Pontos */ if ( strcmp( ComandoTeste , CRIAR_DADOPONTOS_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ici" , - &inxpec,&corEsperada, &CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1) { return TST_CondRetParm ; } /* if */ - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - CondRetObtido = DADPtn_CriarDado(&P[inxpec]); + CondRetObtido = DADPnt_CriarDado(&DadoPnt); return TST_CompararInt( CondRetEsperada , CondRetObtido , -<<<<<<< HEAD - "Retorno errado ao criar a peca." ); -======= "Retorno errado ao criar ao criar dadopontos." ); ->>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e } /* fim ativa: Testar Criar Dado Pontos */ - /* Testar Pec Destruir DadoPontos */ + /* Testar TDADPnt &Destruir DadoPontos */ else if ( strcmp( ComandoTeste , DESTRUIR_DADOPONTOS_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ii" , - &inxpec, &CondRetEsperada ) ; - if ( NumLidos != 2 ) + NumLidos = LER_LerParametros( "i" , + &CondRetEsperada ) ; + if ( NumLidos != 1 ) { return TST_CondRetParm ; } /* if */ - CondRetObtido = DADPtn_DestruirDado(P[inxpec]) ; + CondRetObtido = DADPnt_DestruirDado(DadoPnt) ; return TST_CompararInt( CondRetEsperada , CondRetObtido , "Retorno errado ao destruir o dadopontos." ); @@ -138,17 +134,17 @@ tppDadoPontos P[MAX]; } /* fim ativa: Testar DadoPontos Destruir*/ - /* Testar Obter Dono do DadoPonto */ + /* Testar TDADPnt &Obter Dono do DadoPonto */ else if ( strcmp( ComandoTeste , OBTER_DONO_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ici" , - &inxpec, &corEsperada ,&CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "ci" , + &corEsperada ,&CondRetEsperada ) ; + if ( NumLidos != 2 ) { return TST_CondRetParm ; } /* if */ - CondRetObtido = DADPtn_ObterDono(P[inxpec],&corRecebida) ; + CondRetObtido = DADPnt_ObterDono(DadoPnt,&corRecebida) ; Ret = TST_CompararChar( corRecebida , corEsperada , "Cor do jogador errado, diferente do esperado" ) ; @@ -158,69 +154,42 @@ tppDadoPontos P[MAX]; return Ret ; } /* if */ -<<<<<<< HEAD - return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); - - } - /* fim ativa: Testar DadoPontos Dobrar Dado*/ -======= return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o dono do dado"); } /* fim ativa: Testar Obter Dono do DadoPonto*/ ->>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e - /* Testar Dadoponto DobrarDado */ + /* Testar TDADPnt &Dadoponto DobrarDado */ else if ( strcmp( ComandoTeste , DOBRAR_DADO_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "ici" , - &inxpec,&corEsperada, &CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "ci" , + &corEsperada, &CondRetEsperada ) ; + if ( NumLidos != 2 ) { return TST_CondRetParm ; } /* if */ - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - CondRetObtido = DADPtn_DobrarDado(P[inxpec],corEsperada); + CondRetObtido = DADPnt_DobrarDado(DadoPnt, corEsperada ); return TST_CompararInt( CondRetEsperada , CondRetObtido , -<<<<<<< HEAD - "Retorno errado ao criar a peca." ); - - } /* fim ativa: Fim Dobrar Dado */ - - /* Testar Dadoponto Valor Partida */ -======= "Retorno errado ao dobrar o valor do dadopontos." ); } /* fim ativa: Fim Dobrar Dado */ - /* Testar Dadoponto Obter Valor */ ->>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e + /* Testar TDADPnt &Dadoponto Obter Valor */ else if ( strcmp( ComandoTeste , OBTER_VALORPARTIDA_CMD ) == 0 ) { - NumLidos = LER_LerParametros( "iii" , - &inxpec,&valoresperado, &CondRetEsperada ) ; - if ( NumLidos != 3 ) + NumLidos = LER_LerParametros( "ii" , + &valoresperado, &CondRetEsperada ) ; + if ( NumLidos != 2 ) { return TST_CondRetParm ; } /* if */ - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - - CondRetObtido = DADPtn_ValorPartida(P[inxpec],&ValorPontos); - -<<<<<<< HEAD - Ret = TST_CompararChar( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar a peca." ); - - } /* fim ativa: Fim Dobrar Dado */ + CondRetObtido = DADPnt_ValorPartida(DadoPnt,&ValorPontos); -======= Ret = TST_CompararInt( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; if ( Ret != TST_CondRetOK ) @@ -232,9 +201,8 @@ tppDadoPontos P[MAX]; "Retorno errado ao obter valor do dado pontos." ); } /* fim ativa: Fim Dobrar Dado */ ->>>>>>> b28b4c52796df7303d083d4685da86f57afaf00e return TST_CondRetNaoConhec ; - } /* Fim função: TPec Efetuar operações de teste específicas para DadoPonto */ \ No newline at end of file + } /* Fim função: TDADPnt Efetuar operações de teste específicas para DadoPonto */ \ No newline at end of file diff --git a/TESTPECA.C b/TESTPECA.C index 199f11b..26cd1af 100644 --- a/TESTPECA.C +++ b/TESTPECA.C @@ -10,8 +10,7 @@ * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa - fvc - Felipe Vieira Cortes +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * @@ -25,8 +24,7 @@ * * $ED Descrição do módulo * Este módulo contém as funções específicas para o teste do -* módulo Matriz. Ilustra como redigir um interpretador de comandos -* de teste específicos utilizando o arcabouço de teste para C. +* módulo Peca. * * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: diff --git a/TESTTABULEIRO.C b/TESTTABULEIRO.C index 0618ea5..80b8a8c 100644 --- a/TESTTABULEIRO.C +++ b/TESTTABULEIRO.C @@ -1,27 +1,21 @@ /*************************************************************************** -* $MCI Módulo de implementação: Módulo de teste específico - -* Módulo modificado para operar matrizes que armazenam listas! +* $MCI Módulo de implementação: TAB Tabuleiro de Gamão * -* Arquivo gerado: TESTPECA.C -* Letras identificadoras: TPec +* Arquivo gerado: TABULEIRO.C +* Letras identificadoras: TTAB * * Nome da base de software: Exemplo de teste automatizado * * Projeto: Disciplinas INF 1628 / 1301 * Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa - fvc - Felipe Vieira Cortes +* Autores: fvc - Felipe Vieira Cortes * tbm - Tássio Borges de Miranda * db - Daniela Brazão * * $HA Histórico de evolução: -* Versão Autor Data Observações - 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes -* 3.00 avs 28/02/2003 Uniformização da interface das funções e -* de todas as condições de retorno. -* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação -* 1.00 avs 15/08/2001 Início do desenvolvimento +* Versão Autor Data Observações +* 2 fvc, tbm 23/set/2015 término do deselvolvimento +* 1 fvc, tbm 21/set/2015 início desenvolvimento * * $ED Descrição do módulo * Este módulo contém as funções específicas para o teste do @@ -31,9 +25,9 @@ * $EIU Interface com o usuário pessoa * Comandos de teste específicos para testar o módulo Matriz: * -* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); -* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); -* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); +* =criartabuleiro - Chama a função TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, void ( * ExcluirValor ) ( void * pDado ) ) ; +* =destruirtabuleiro - Chama a função TAB_tpCondRet TAB_DestruirTabuleiro( TAB_tppTabuleiro pTab ); +* =moverpeca - Chama a função TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; ***************************************************************************/ #include @@ -51,7 +45,6 @@ #define MOVER_PECA_CMD "=moverpeca" TAB_tppTabuleiro Tab; -/***** Código das funções exportadas pelo módulo *****/ /***** Protótipos das funções encapuladas no módulo *****/ @@ -62,11 +55,11 @@ TAB_tppTabuleiro Tab; /*********************************************************************** * -* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca +* $FC Função: TTAB Efetuar operações de teste específicas para o Modulo Tabuleiro * * $ED Descrição da função * Efetua os diversos comandos de teste específicos para o módulo -* Peca sendo testado. +* de Tabuleiro de gamão. * * $EP Parâmetros * $P ComandoTeste - String contendo o comando @@ -149,7 +142,7 @@ TAB_tppTabuleiro Tab; /*********************************************************************** * -* $FC Função: TLIS -Destruir valor +* $FC Função: TTAB -Destruir valor * ***********************************************************************/ @@ -158,4 +151,4 @@ void DestruirValor( void * pValor ) free( pValor ) ; - } /* Fim função: TLIS -Destruir valor */ \ No newline at end of file + } /* Fim função: TTAB-Destruir valor */ \ No newline at end of file diff --git a/peca/TRAB2-3.exe b/peca/TRAB2-3.exe index f8e240cc01d333694827feac9a806e25d247ba2e..fb98d773ec6c35263e54d3947cbd9a1f17bc59fd 100644 GIT binary patch delta 14044 zcmd^mc~n!^_wPNIDM~aTgA6LDC@Kyi6PXiK6vswUgbEH-G2)0MR{Ir!hNv;3=uxj) z+d8(`TB{;rTL%;?TCHQX&eBTlL1?9|1FdM@J~t8jeZTkCdjCJx+IN5MKKo4j?6c2s zL&0Icg2R3#T2!+}H^4M@SNYJuQ@6uk(~<-8!lm%OW+rv9F&ie@E<4^m6nCGzam`8 z1|0BKOhy4^3Ddj~>W?*9SxAhxXT_od{9RUWc1HsKe0~}>P4{PiSK`d+9Z@d+&-Ap2 zb4rFuPv2pAl*rgCt(~&HQyubxe-asT0RJ}KDjKO_m;#;nMk2#ld`JY&F)Pq2Tx#x( zCgW@7WMsgdX7p_z09xspRkq4#lPe@_ULuoOl`S-z@RS*`>~RHNIU^dS;4fy#1K&0< zjO~=Leuv3r4M-hF7T~{T81uC!jLZ(xiA1K_XAC?ghmC;J06narC<9OwFPj8tImmWQ z1yJo{hUdXbsxk}EPF{H)AYUF?0IfY_WU8F5vCamv!R2z<@&vRSw}&#!?VmH<3Fa;M zK(;|WPz_zE$`+7!R1`Q}sboeJ!#EpLNkV&uNhM!M>9b)teg4Ql&qFb(q#Vc1G=>(A zgk1JYOKX=^;0jr8No3N=oguhzW)#|hx6PFGZ0}JJW;5ArHscDJ2NsuBf}x_#^Hzhs zpLJmvs9st2YGzy1-jo34L0RPJOWN!J#v*`3HSRjQq}v7w!}wR%4}3OAXtO9&$rKs1 z!`Vc1P(>;^BW4&AnT>DE?u$yW-<1sLvu%=G%T1W4-`T* zwll7?RjMSR^=3(*LC%UZ~un}RbJ>|pOrDP!MF^+KC)`g?io^~q&7-s^?XVC=QH7d60Q zdEd3u8KyX?$wWqH^J68l-$zvP1g!O1@;xtUHj(9c&0=Zj3CNNT!)jfvN@@}nX&^O~ z%*3}AcaX03B#G?l(B0}m(U8W}vG7buCG%SnwU7vTExl7o2i!ByfDYmrd68jc2Dny} zbC9?5)~0O6t0`L>bSq^XDa2dyI);^b5(Tdl!}!GE_;OxHu;k;sxotLeW|;H5U#F6( zc;*s<4&X8QUD2wth54OOyB#y3-L@tqD)NH{WqXmexU@jRHfQ5I1&Y{H&|8><;H^Sw zrHTHLE1hW1N+7`q`Lqjqr4k!f6?Pc73EE;i6$~agYSu1EWR3-Uf#x_O^qT_MnD_hFLnjx^ZUABrn8iqewmVtKS7t20I-en&wUxoY_n4-s+)mXeD%1=PC zfZ|A;vm##*5>98XIRH1U=+C|g$699;dn+7gIy)c>e$N@@Ulj(;fhk444#PX0aqPul zeAzi0DY0Rt1I@-~S1P44s#2ZQOufjtWR~4!={k;N(H?7bI700yohS&tr$|``;n?lR7id!Qz4Ck!s%en%~wyjbjGzQ;ZJqPW;LrbE=pFm5U zNkUbc(9+JFb_^`-yy`qdo`qvui4v{AM@k~lHvD7BUccZrG>TNKaeL4RLodg zlShD@BbxIaf(a0wc-Jp%SjaNWHrfyAw@_b-Gc!09Od+it2dj%SPgq>M6QZZ1ypldY zyg{G#!~C<6f1c-`gnwS*pGWxT8F-RGHPD7<);N*_HCHpCFfimNVR!Jfqx&G8v9xyD z_W-a>n)i}=YHe$VfrxChPDmxKu>)u5o@ri*il#$XRzWy;h zi>`=@RFHMBVqJ$2>!)vPBk zn8TAd5`3A_N_iEDTV)qDsw*GH!Cm~{exNZ`RP+bsGekvol+P6v{Y1G{RCJT_g`%R% zl&6V`&H{Io(?PcFq65Yh+o{8vM2AkA$m%qhX!gn#cIqYRmM+fxV(Q1myn~RvFTkz* zJWf+oDJuH18Ro~oHCBQ~of&En9Xn}jnkrgNAhw8#7QvLUHKmAF{|N&vDuVtoHj-!w zNKUq-0SS_mMfR0GV8N5o)pqJ*G$Qe?n(A_!&RBf(3CIsKP?Fvq8Fb33(^7z`+~Zv^4LM$3UabG`Dbyxl4Rpz<##qlJr#KKEuA%{{CC zwwTI9#$l&IC;zOrQ>)Pi)-3`Z8v&bMh3cRmi{eg*ieh1OXn!`+#Q#}^MJ%cq&}=d@ zY(DG*?6gy+VmqCnupp*FmQw++fJ9Z>=_I4I)Ca8?(7c>itmgHo(4EoUth#?#X)};I`RY=#V+S+<3Xu1JvjUXi zurH^{1DYN7l>j``z{STna9NsL*WBF zYIA7*IG3Cr0ccu!dcjdTjiy_}?6Y&95-A43q!gCWjyd!!-|7SMVC%qfXm@ zfU?BP?bm=++b_WrhJvXZ4m!_IFpxoHA5Dv{@_u$A+7jmO|FaWDi?8VTfaZE{>b;xl zgTQQ5=(VYym0o$HB#*RT$#1{d+g_O)`22?L3iJHdo9=nMu>?lpmb1yqN^jea(izL( zk3Q%rsP?b2`gXQo!WTbi-wR$WeVn|zZyIfaP3poF@P`v($A|7Ab>6c5ty<#iReTr+ zY>CLH)5lTHyZ1XV{(jC21uC&+oQwB(C;vQ+#KwBVkSvh<*(zDh1?yjN{CvLLRNsT2 z=x^NKJ<;p^h7>5_kdDJ7p#UU7%8ZDCD47^)fxlP=sKCBeI zeu=C1FJ&!(?v!Y^*+G|a@{3p8hqV21AJV~acd%4wjdi}T-(J%B-_dnn^jl=mQy810 zcRmoH()yjnGZUCJ)&-}^;vtNAyOEi`)yQx_Pk|D*8JXcgYk{gDjo$;pZW7KQAtdG}{OqH_s2$dS z+@9@x8;|?=wy5I}2$-;EoGAT%JdvHkiCc47!6|%bYckSd*VZA(iid17q04ylw#0Um zO5hBh3cFD0ZAWHpHX<1RwyifSK93`}$FbUzIC*=gRw0mH1!+n=ce@t#!h5z)@3{e1 ziuC6<(jzNj{#DXLZ?L(57S-B&3;6S8VqGgZ>u^^y`9Kd!^ncWE?0IZ zQhD3uGP|G%(&sdOyfeJ*CRq5>olTk-RuN%uHV=C!w%{L^w@8%J^5ZfF`p{eRQ^;IfhR@*ODA+JMBl45mS!_ z73iZa{}kvMOFPmPmLbo^8)Mg}p=b&YEmiuSp%(cGk15TH8(s;GPv1r_ubkfdo*Cgj zL}*GSJ9zP+`ZdlbFj@VSY$Z90e<_utEF8Iebhz*#*xi{&2e~)366SayAmO&xeLj|ZN7{{*UMC2MzUI4_h zfvS=Wz=IEdivEKiAAA~|0!}vpZp6%l8eDx7{38oDm3Q|`0a#`J40k(Z@fECrv{m@y zLvd`xHGKY1q7a>J8MPc7UNKx4d5B(t)LQ&Z#0Te8OhZ57A1nI7wV2=GKCJFXtT&f?Io;{1EiiXL8rM%>54zv}A8UWZ1IV|c+= zCsA^l>T3h)djt%a4o5LM4=2)z7+^NjTw7oyoS6dKi&xf2QUpr2Xok$dpM29PB-8WO zA9yuG-Jcw&#nFFv$F6Up;G!z(NJmzF73+_5XM;;|){(A(rk}x3NkZo!VS4HN*7k6_ zvH3^@dK;G?>EGt@XHa%!w5HJ_BoDCn(I@C3{`+Wj+=Ig)hg(n4C^F^&4`F4z=J31R zU0P}MTtkWuB?(OADIR!i5GupYV`gC_46euho!E6O4BRB_cv_c_z_~r*wm(5(aP;&Q z!ST=~q!BePauqwT^+L7y z(6zVV?%VfzFStREzg~>K#>cOBLdWsF>!FcF#ZVy$-u=3d_1?B=H4qYO$doeCk4q7H zfH&NTjydUsXnE)eb(c@+y>7be&_4R|*&F%C_|}c+K1)F0TzVeTju*fquG&Oq@}f(g zw@f}qCA^W*IQC`_wx<)1y4f|>8|3M#iOrUF&cWWADvQ4=%nB3ew-waP)o_0+uvVv% zd-#K!>HcSEH>KrZwTakuGc+ps08~0}7F=EkvZKiw?6%<`P@s2E{juy;p9sx&RBEkt z-=x?Y!cwRMjUZ%F*?(@;u)c(rc^*%`8^Qiljq~n)B+6V0Ia0}cjV_nbMCRdM_mqLx zz(uz)za%oy!Zs%2x3nzx9=O&qeEa0h~HS530Ncq#(S9H`aFTf5@Y9ldfB@TOVMX z)(n@2Rsr-ml!(D=+(C2OH#G9q30b(Hi{Tf^RA~9j+8(H`totu@Na))5dZfu*9QkW! z;gvUn{x}%~yWR*w%B;U`LtQUyhe8{nCK34!J}S6ZR9N||Y)b|*R#A2gnT%C+YF53i z%v#qU#U5Bh-O+tn3r!qne+IkaJfYnM+ZN6G*G=7n?>!of>TvgZwg29Aucc9VW_=MG zwGRJLZ}7hdBkAtfTUgT|M<3ywh6H&QNImi3dKn)NJQ2k?R**W*e&uy#K}6e<{|kJ# zA&&LMxb<(*XdjOIZAR>SYiThw0@9BX_R56OMmH4ejJ?pa;uWn2TZpekf&8&hE6@s1H(C;8HpBg12mqH2jGfPL?tC|Jp zQpp1PP8wjsza9n}_{nV$I2&Cd%)CUn#dN}3y2H2rXHxZF@?8A(AKf926#g*)zK(qR zM@mpDNQYJMF+>56NhjjCKZgZ>4g$Jpl)On`@QOb*Xk*#wKRKVs{mWh(k9-BtA+9&L z$_M@eGx8{2*wjs!!>7ZgG(#5Q-A&Qmw$9{3RDd~|I`~*{qm~6q2fDPbF3a%mO&xN6_7h+9e(!09{P!mZ>ysdaR91j;NF`dOYoXz>=yun zbW)4sUK)bGdmpgNTH^{i2xACN@C5|2B`+}>@P1j)s|XhTRNfc$hTy`DN5~{z`4J5+ z!RF<(Zx$FOe&a2zbXvnS&qeDiHPvv(tY7lFDPMB85t_`(i#a`uvRFk9_X&$k!mzxS zabM1fy-*0(-V3!6K3d!&e!Bw1TM*lJE_cBjX@oxiX-TqjAwDQdcdUs7z)kQ)Qp9j;eUS}Vs2^I+YG-j<{m@o)flCyiFVQ3J4*_bAdUCB=q3P&v zE~gcIp8z=^-15hxK5XhTL^hZNNsHW3Ji#7vUfR;n8 zhJ{nwHiXfX=Qp9oEn$gx-@>r=jgSnlG^K=rM-0$#NV~tVlNSirE{dfL_gd7iJJo>} zYz0;dv=8VoP$keApi4jxKsA5S;2^5%bTz}%I~>{v)PqyCK@WUl@3Ph|VlPd~9aea$)blGY1>UVgeh z0=AwIbu6vOB+!Ad;X}r8cLPvge=mp*u#JN+S2MZLKqT=$J?C}a1TG~I%|*kxszB5& zs$?`cuO|xAPtFkNgFw|2Qf!=GJ7g0U&88B5%ej)<&$+#uB5x0E{mTJD1&6o99qgR=*tWK_ys2u2gpT&`~jN^o58N`mDJ_K+yJknw`8OTH@`g^ zfg-rd_9#`@G@TaApH|IWmoW4(8$O<^3PYRGer`fIDr*&xYJu(1;kr#opwk#BrL5KRrAnt4w>J*~(yhgpry1D?4GBI3qG-})G zuZeE$8(cy(lEv=%Chd7HBO;!6Abvbo5|@EirzOvU+fEr>`3sDs zftL*=wLDKIcX&RW{J?V)InVPk zw~!*9FC>e3zL;2m!)=_=b*O-jeHIlTDxz>a50_JD;^9gPlXwU>vT)Ys;W`TY@sNHq zAu&AMLSZ-$w^G=ahdU|s;$bO;O?nqSpul$xhWy6kN(z7G;VBA#!33jE6laEaPEs3QKt?rtm`^$|zjRLnVdFc&MdtF%OMs65t#j z52WHO9wt*b9w6W7;q+|;pJ1Y}KM%)Hn83p{3VZV~gTl@{oJ3)$j++{bIuH3v3xNcF zOrr6*^BpYH5J!G;OJEOQ&UGPm@Oy=a$51e40IyaJNLM@d@xW z%WsNXq}BKYdqht)eE*CZpD>T)fm=Ml*ePm==ZF{9GLI>fNgj3Kke(9p<-_&XJQlf&G&erSR)9R$@3{Ct8TlerW9P%3)Pg^7_I{mP9LqekJS zkuAj=xuNk$96qT(AJt*Ch$YM4q&Cgr5`9oG_h~$8FEqW8S90IQBd74I5iRBPte7l8 zc|OQlaX$f>e0R(2k1lhNF{SNWc}FP!%^~6f&TZT=6K>O_p8);Dx-kz{av)6pQbnX{&&?LpOpV5l2m<7sUMUlU}vB2KQ?+sGi?)vYB*2xom8 zO=l(DxO;D-4(Ma<#oH(X6>*{Ck&^AziZhKzD)g9JF&=498F!k#-QSRbhH6fArDf3b zHeBlqz|~cmO_sLwA~hJ^;7dumBg~ofq%QZB%aua^$TtHZDnj}b&Ypq9=p}b31AbmQ zp1YfYA|f7y@|mQ!HC5JV(uyyfpB0O^z)aY0ui&Ja=s=g|cJTed`yv?cPl}Wj5kO8a zli5sPZgYMU&^xUHX3^up`sSJ3{0XQB8q9q#0cqLR?YNs0P~Q%>0;vai*M}d2z{b?K zFCG{ZY%&WjLH^@h*NKo}12=pkip+lx6wO%zL6lGD=<1(NOisn%?nxcIaB~#Q$ zk)ER7R{+T<%AlwhMe8Vvrsxtyp%e+O0uoZxgCZ7?^sJ40I1!1`8v_#u73b=GL&`05p;20XtJS!t{BcCL&GfIh*!#CYj>qV{&V3Qy4`4EC{?vf-Ep zlm#RM`Z2p=ff9R~Uis0OGBC}2Hex&SGF1_F%%ngjGc&<3Cb zK$n1Of&K(~1=Mx}Vq$<~KtqA10=);c4(Jo03qW^(eh2d9P(IU+LrgSKUmzur31||~ z0-#kur9g*)E&yEz`Wfg?AZ8S^J63`r=0-*o>Z(pvF`TmrVx%#t_`Q=w5Q@P66qVi}$A~V@yT+=zc z4g7{WmC9M5*%dickgG#}Ry0MOVa=U3 zKQ|+5+N>G#re#c>JHjE46nb_X4Dm?@vx- zJ_52}YGn7{W;(L-s1^Qycm4MN7uT;?v=qJTb7&QH);-oe(Xslw zddA>y=xfL`oHl%K_|Z^jfS}W`^A5Vlj5hv zTjM)OlcZCnHt9X7udIhmDw`o&B-)^ zO8B)J6gxeBc6@I97xA_6kK!N4zl>)keiEUigJhUwlq6k}zg4nJa$iy_sh2cLo=ch~ zt)(-i7U_FZRu(Ah3{{C`TV=asdu2yuHL_ozA|!8;zm$sv!n)=nv)V zAL*a!UHULX7lYi8ZYVK)Yq(*6Tr~_sk5$RyY2v-&j`7;~{qaZRFU9{1J@ApVk;F)J z(E4{IW=W1@fy6G^Be^DdDEUV+NV;BnR~j#SBI_dGEI%m!R{ly}m+*T+q{^vUr`oLg zSXH6AtZGyV)Uj%%TBpt*pdO=6S7)i`sPoiCFuwcM->B==h1ylxzB-l8s#~Jlt}E5; z)g9GU>F(%ib-(Lg=)Cl;^dkKjeTLqwx9S(`i}Wk?>+~P$KhYo1AJd=HUxAVSMgN=r z8FZ|TA<|G_up6!$9vGTw$KZIk7+5QD2XRmFuzYd6L@D`2(oSlS4wagusnQIozdS;& zlPAkZ$|uOD$Sv~4^7rK{S4`+$`#_B@k=BlrTNnQ_0sFor_!~u zQ?dqGmb^s1PySHeD6dJFq&%m*r+ldtsk*3SDhn9TtX%=)_ek4X7p#lZnRL0jXgvdK z_*N*eA%2u36Ncciq)9SE#>ouw)(Wj+49uS?3bSICVxD4?;<)0jqEP1&PN}r*XS4M9r|th6Z&9-)-cwPWBAB$4onU$gH!BOVBX?( z;z;p$@oe#K@dfd1u~)o2UKjtL`243ZAtEIziBEdDjgU>0<;ZNZk7b|Ajw-%YTvz<6_>b!SeANf4QdPBT0l44aYDP0& zvt0A1#-)kU4$}tfT7iq**IzZb{VQWij&J^1Je5 zid3-V%LFfFpz;glDdj6=p-QhEtKDYUW!P=_!m!^^ZurV@)Nlf3*;xodw+#7EunBfR zz_y4_iGP5A(?32dezvB+ew6-}z6SibUf--|Ccy>;bkZOg<;L%TiMR|VTPxWNm}H;H zXDV_Od5V>aO2v7_ZRpp)gaU{LFB9gemZ`R?K2sf3olptYJ=J3MAoW=FQuSK(cJ(3k zNr)7_y)|7ly)_DrQ8QFCMl(TU*38!|)-2VOXf|v1XsW=}-)ovRjMiH#&! z#`ui*N$~~oTjML^YvLJ6w8SWxBq@+=1w+T3H^#j`P_rCz+w6zTY delta 14140 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 azM-b75fuU(aRjt!Oc+}=>MHu$=YIicwjh20 diff --git a/sourcemaster/ArcaboucoTeste.lib b/sourcemaster/ArcaboucoTeste.lib deleted file mode 100644 index 41ba1990924bce9779c6bdfa6b21565e71e10993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89288 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

(+lxk=fk>%<99^g>Amgv#<{Lp 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 esperado / obtido ou -* 1 + Tolerancia < esperado / obtido -* -* $EP Parâmetros -* ValorEsperado - é um valor fornecido como parâmetro do comando -* de teste -* ValorObtido - é o valor retornado pela função em teste -* Tolerância - indica os limites da relação entre esperado e obtido. -* Deve ser um valor positivo, menor do que 1. -* Use um valor do tipo 10 ** -n, no qual n é o -* número de dígitos significativos desejado. -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor obtido não estiver dentro do domínio da -* tolerância em torno do valor esperado -* TST_CondRetOK se os valores estiverem dentro da tolerância -* -***********************************************************************/ - - TST_tpCondRet TST_CompararFloat( double ValorEsperado , - double ValorObtido , - double Tolerancia , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar string -* -* $ED Descrição da função -* Compara string esperado com string obtido, reportamdo uma falha -* caso não sejam iguais. Ambos os strings devem obedecer o -* padrão C, terminando em zero. -* -* $EP Parâmetros -* ValorEsperado - é um string fornecido como parâmetro do comando -* de teste. -* ValorObtido - é o string retornado pela função em teste -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for igual ao obtido -* TST_CondRetOK se os valores forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararString( char * ValorEsperado , - char * ValorObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar espaço -* -* $ED Descrição da função -* Compara espaços de dados, reportando uma falha caso não sejam iguais. -* Esta função pode ser utilizada para comparar qualquer coisa, -* inclusive valores do tipo "struct" -* O tipo do valor é indefinido e os valores serão exibidos em -* formato hexadecimal, caso não sejam iguais -* -* $EP Parâmetros -* ValorEsperado - ponteiro para o espaço que contém o valor esperado -* ValorObtido - ponteiro para o espaço que contém o valor obtido -* TamEspaco - tamanho do espaço a ser comparado -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for igual ao obtido -* TST_CondRetOK se os valores forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , - void * ValorObtido , - int TamEspaco , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar ponteiro -* -* $ED Descrição da função -* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais -* -* $FV Valor retornado -* TST_CondRetErro se os dois ponteiros forem diferentes -* TST_CondRetOK se forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , - void * PonteiroObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar ponteiro nulo -* -* $ED Descrição da função -* Verifica -* - quando ModoEsperado == 0 se o PonteiroObtido é nulo -* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo -* -* $FV Valor retornado -* TST_CondRetErro se os dois ponteiros forem diferentes -* TST_CondRetOK se forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , - void * PonteiroObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Assertiva controlada -* -* $ED Descrição da função -* Esta função substitui a função assert de C. -* É utilizada no contexto do arcabouço de teste. -* Ela imprime mensagens mais visíveis tanto no log como na -* janela de comando. -* -* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. -* -* $FV Valor retornado -* Termina a execução do programa com código de retorno == 4 -* -***********************************************************************/ - - #define TST_ASSERT( Expressao ) \ - TST_Assert( Expressao , __LINE__ , __FILE__ ) - - void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Exibir prefixo da mensagem -* -* $ED Descrição da função -* Imprime o prefixo de mensages de falha ou de informação. -* Não incrementa o contador de falhas. -* Esta função estabelece o padrão de saída das mensagens geradas -* durante os testes. -* -* $EP Parâmetros -* $P Indicador - informa a natureza da mensagem, -* Utilize preferenciamente as constantes definidas em -* TST_ESPEC.H: -* SINALIZA_ERRO ">>>" -* SINALIZA_RECUPERA "<<<" -* SINALIZA_COMENTARIO "!!!" -* $P pMensagem - é a mensagem prefixo a ser gerada. -* -* $EIU Interface com usuário pessoa -* Podem ser acrescentadas mensagens ao prefixo. A função -* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso -* (stdout ou definido pelo usuário) -* -***********************************************************************/ - - void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Notificar falha -* -* $ED Descrição da função -* Exibe uma mensagem de falha no formato padrão do arcabouço. -* A função não exibe os valores esperado e obtido. -* -* $EP Parâmetros -* $P pMensagem - mensdagem explicativa da falha. -* -* $FV Valor retornado -* TST_CondRetErro sempre -* -***********************************************************************/ - - TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Incrementar contador de falhas -* -* $ED Descrição da função -* Esta função deve ser usada quando, por alguma razão, precisar-se -* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. -* As outras funções (comparação, TST_NotificarFalha, etc.) -* incrementam o contador automaticamente. -* -***********************************************************************/ - - void TST_ContarFalhas( ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter número de casos de teste efetuados -* -* $ED Descrição da função -* Retorna o número de casos de teste lidos. -* Cada caso de teste inicia com o comando "== ". -* -***********************************************************************/ - - int TST_ObterNumCasosTeste( ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados -* -* $ED Descrição da função -* Retorna o número de comandos de teste específicos lidos e -* corretamente interpretados. -* Não conta comandos que retornem não OK independentemento do motivo, -* inclusive os comandos saltados após uma falha. -* Também não conta comandos recuperar. -* -***********************************************************************/ - - int TST_ObterNumComandosExecutados( void ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter número de falhas encontradas -* -* $ED Descrição da função -* Retorna o número de falhas encontrados. -* O módulo de teste específico sinaliza falhas através de -* uma condição de retorno diferente de TST_CondRetOK. -* Além de comparações em erro, são tratados como falhas: -* - comandos de teste em erro, -* - comandos de teste de um dado caso de teste ignorados (saltados) -* - erros encontrados nos instrumentos -* - erros de sintaxe dos comandos de teste -* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. -* Portanto, é possível que o número de falhas venha a ser maior do -* que o número de casos de teste existente no script. -* -***********************************************************************/ - - int TST_ObterNumFalhas( void ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter origem do nome da extensão de arquivo -* -* $ED Descrição da função -* Procura o início do nome da extensão contido no nome do arquivo -* dado por parâmetro -* -* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". -* Isto pode confundir no caso de se desejar a adição de algum nome -* de extensão padrão. -* -* $EP Parâmetros -* $P NomeArqParm - nome de arquivo a ser analisado -* -* $FV Valor retornado -* Ponteiro para o caractere '.' que separa a extensão. -* Será NULL caso o nome do arquivo não contenha extensão. -* -***********************************************************************/ - - char * TST_ObterInicioExtensao( char * NomeArqParm ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter ponteiro para arquivo LOG -* -* $ED Descrição da função -* Retorna o ponteiro para o FILE do log em uso no momento. -* Será stdout caso não seja definido explicitamente ao chamar a funcao -* TST_ControlarSessaoTeste -* -* $FV Valor retornado -* Ponteiro válido para um arquivo de texto de saída -* -***********************************************************************/ - - FILE * TST_ObterArqLog( void ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char -* -* $ED Descrição da função -* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém -* uma coluna em hexadecimal e outra em ASCII -* São exibidos 16 bytes por linha. -* -* $EP Parâmetros -* $P tamEspaco - tamanho em bytes do espaço a exibir -* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir -* -***********************************************************************/ - - void TST_ExibirEspacoHexa( int tamEspaco , - void * Ponteiro ) ; - -#undef GENERICO_EXT - -/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ - -#else -#endif diff --git a/sourcemaster/LERPARM.H b/sourcemaster/LERPARM.H deleted file mode 100644 index f12cf3d..0000000 --- a/sourcemaster/LERPARM.H +++ /dev/null @@ -1,463 +0,0 @@ -#if ! defined( LerParm_ ) -#define LerParm_ -/*************************************************************************** -* -* $MCD Módulo de definição: LER Ler parâmetros de comandos -* -* Arquivo gerado: LerParm.h -* Letras identificadoras: LER -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* Provê funções para a leitura e análise léxica dos comandos de teste. -* Pressupõe-se que cada comando de teste esteja integralmente em -* uma linha. -* Cada comando de teste inicia com o caractere '=' seguido de um string -* que identifica o comando. -* Cada comando pode requerer zero ou mais parâmetros que se encontram na -* mesma linha que o comando. -* Parâmetros podem ser literis ou simbólicos. -* Os parâmetros simbólicos precisam ser declarados antes de serem -* utilizados. -* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. -* -* Se for do interesse do programador, módulos de teste específico -* podem ler e processar por conta própria linhas do script. Isto -* pode ser necessário quando um módulo necessita de um grande -* número de parâmetros ou de dados especiais. -* -* $EIU Interface com o usuário pessoa -* Este módulo interpreta os comandos de teste globalmente disponíveis: -* -* =declararparm -* declara o parâmetro do definido com o valor -* pode ser um de: -* i - inteiro (long) -* f - flutuante (double) -* c - caractere -* s - string -* O valor de literal tem que estar em conformidade com o tipo -* -* =exibirdeclaracao -* exibe a declaração do parâmetro em formato "dump de memória" -* -* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. -* -* Estes comandos sempre estarão disponíveis. Os demais comandos de -* teste estão impementados no módulo TESTLER específico para este módulo. -* -***************************************************************************/ - -#if defined( LerParm_OWN ) - #define LerParm_EXT -#else - #define LerParm_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -#define LER_DIM_NOME 32 -#define LER_DIM_STRING 500 -#define LER_DIM_BUFFER 250 - - -/*********************************************************************** -* -* $TC Tipo de dados: LER Condições de retorno -* -* -***********************************************************************/ - - typedef enum { - - LER_CondRetOK , - /* Ler retorno OK */ - - LER_CondRetNaoAbriu - /* Ler não abriu arquivo */ - - } LER_tpCondRet ; - -/***** Dados exportados pelo módulo *****/ - - /* Estrutura de dados: *LER Dados globais públicos */ - - LerParm_EXT int LER_TamBuffer ; - /* Tamanho do string contido no buffer de leitura - * - *$ED Descrição - * Contém o número total de caracteres do buffer, excluindo o zero. - * Jamais altere este valor. */ - - LerParm_EXT int LER_InxBuffer ; - /* Cursor do buffer de leitura - * - *$ED Descrição - * O cursor de leitura indexa o primeiro caractere não lido contido - * no buffer. - * O cursor é zerado sempre que uma nova linha for lida. - * O cursor é avançado ao ler um parâmetro, sendo colocado no - * primeiro caractere imediatamente após ao parâmetro lido. - * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ - - LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; - /* Buffer de leitura - * - *$ED Descrição - * Contém a linha corrente do script a ser processada. - * Jamais altere o valor do buffer. */ - - -/*********************************************************************** -* -* $FC Função: LER &Inicializar módulo LerParm -* -* $ED Descrição da função -* Inicializa o módulo. -* Deve ser chamada antes de iniciar a análise de comandos. -* Deve ser chamada uma única vez no início ou após terminar o módulo. -* -***********************************************************************/ - - int LER_InicializarLeitura( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Terminar módulo LerParm -* -* $ED Descrição da função -* Fecha o arquivo de leitura e sinaliza módulo de leitura não -* inicializado. -* Após esta função somente poderá ser chamada a funçãp -* LER_InicializarLeitura -* -***********************************************************************/ - - void LER_TerminarLeitura( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Obter nome do arquivo script -* -* $FV Valor retornado -* Retorna o ponteiro para o nome do arquivo script sendo processado. -* Deve-se tomar cuidado para não alterar este nome. -* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. -* -***********************************************************************/ - - char * LER_ObterNomeArqScript( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Obter número de linhas lidas até o momento -* -***********************************************************************/ - - int LER_ObterNumLinhas( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Abrir arquivo script de teste -* -* $ED Descrição da função -* Abre o arquivo que contém o script de teste. -* A extensão default do arquivo de comandos script de teste é -* ".script" e será acrescida ao nome do arquivo caso este não -* contenha nome de extensão. -* -* $EP Parâmetros -* $P NomeArqParm - nome do arquivo contendo o script de teste -* -* $FV Valor retornado -* LER_CondRetOK - caso tenha sido possível abrir o arquivo. -* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. -* Não há discriminação do erro encontrado. -* -***********************************************************************/ - - LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler linha script eliminando brancos ao final -* -* $ED Descrição da função -* Lê uma linha do arquivo script e elimina os caracteres branco, -* fim de linha, tabulação etc. do final da linha lida. -* -* $FV Valor retornado -* Retorna o tamanho da linha lida. -* Será: -* -1 caso tenha ocorrido fim de arquivo. -* -2 caso tenha ocorrido algum problema de leitura. -* -***********************************************************************/ - - int LER_LerLinhaScript( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Interpretar comandos de teste -* -* $ED Descrição da função -* Interpreta os comandos de teste disponibilizados pelo módulo -* de leitura. -* -* Ver a descrição do módulo para mais detalhes -* -* $EP Parâmetros -* $P - Comando de teste a ser interpretado -* -* $FV Valor retornado -* TST_CondRetOK - caso tenha interpretado corretamente -* TST_CondRetNaoExecutou - caso o comando de teste a interpretar -* não pertença ao conjunto de LER -* TST_CondRetErro - caso o comando de teste é do conjunto de LER -* e está sintaticamente errado. -* Neste caso é gerada uma mensagem de erro no -* log. -* -***********************************************************************/ - - TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Declarar parâmetro simbólico -* -* $EP Parâmetros -* Interpreta uma linha de comando de teste contendo uma declaração de -* nome simbólico. -* Todas as declarações têm o formato: -* =declararparm -* em que o deve estar consistente com o -* São geradas mensagens de erro no log de teste caso a declaração -* não possa ser realizada. -* -* $FV Valor retornado -* TRUE - se a declaração ocorreu -* FALSE - caso contrário -* -***********************************************************************/ - - int LER_DeclararParametro( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Exibir declaração de símbolo -* -* $ED Descrição da função -* Exibe o Símbolo e o valor associado ao símbolo, sendo que este -* é exibido em hexadecimal. -* -***********************************************************************/ - - void LER_ExibirParametro( char * Simbolo ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler linha de parâmetros -* -* $ED Descrição da função -* Lê um número variável de parâmetros -* -* $EP Parâmetros -* $P Tipos é um string contendo a identificação dos tipos dos parâmetros -* a serem lidos. -* $P ... Os demais parâmetros são referências (ponteiros) para os -* espaços onde deverão ser armazenados os valores lidos. -* -* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista -* de referência e o string de tipos tenha o mesmo tamanho -* e que os indicadores de tipo sejam consistentes com a referência -* posicionalmente correspondentes. -* -* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já -* declarado. Caso isto seja possível e o tipo esteja correto -* é "lido" o valor contido no parâmetro. -* Caso não seja possível, tenta ler um literal em acordo com o tipo -* dado. -* -* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada -* e tipo inconsistente com o solicitado no correspondente caractere no -* string Tipos. -* -* $FV Valor retornado -* Retorna o número de campos lidos até concluir ou até encontrar -* um erro. -* -***********************************************************************/ - - int LER_LerParametros( char * Tipos , ... ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro caractere -* -* $EP Parâmetros -* $P Parm é um ponteiro para um caractere que receberá o valor lido -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do caractere lido -* -* $EIU Interface com usuário pessoa -* Um caractere deve vir entre aspas simples. Valem os caracteres de controle -* \n \r \t \a \v \f \\ \' \" \? e \0 -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmChar( char * Parm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro inteiro -* -* $EP Parâmetros -* $P Parm é um ponteiro para um int que receberá o valor lido -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do int lido -* -* $EIU Interface com usuário pessoa -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmInt( int * Parm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro flutuante -* -* $EP Parâmetros -* $P Parm é um ponteiro para um double que receberá o valor lido -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do double lido -* -* $EIU Interface com usuário pessoa -* São válidas todas as formas de literal double aceitas pelo scanf. -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmDouble( double * Parm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro nome -* -* $EP Parâmetros -* $P Parm é um ponteiro para um caractere que receberá o nome lido -* $P tamString é o tamanho do nome que foi lido -* $P dimString é o tamanho máximo que o nome poderá ter, já -* descontado o zero final -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do nome lido -* -* $EIU Interface com usuário pessoa -* São válidas as mesmas regras de nomes C. -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro string -* -* $EP Parâmetros -* $P Parm é um ponteiro para um caractere que receberá o string lido -* $P tamString é o tamanho do string que foi lido -* $P dimString é o tamanho máximo que o string poderá ter, já -* descontado o zero final -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do string lido -* -* $EIU Interface com usuário pessoa -* Um string deve vir entre aspas duplas. -* Um string pode conter caracteres de controle -* \n \r \t \a \v \f \\ \' \" \? e \0 -* -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Pular comando de teste -* -* $ED Descrição da função -* Avança o cursor do buffer de leitura por cima de um comando de teste. -* Todos os comandos de teste principiam com o prefixo '=' -* -***********************************************************************/ - - void LER_PularComando( void ) ; - -#undef LerParm_EXT - -/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ - -#else -#endif diff --git a/sourcemaster/TST_ESPC.H b/sourcemaster/TST_ESPC.H deleted file mode 100644 index 987ff8e..0000000 --- a/sourcemaster/TST_ESPC.H +++ /dev/null @@ -1,320 +0,0 @@ -#if ! defined( Tst_Espc_ ) -#define Tst_Espc_ -/*************************************************************************** -* -* $MCD Módulo de definição: TSTE Interface de teste específico -* -* Arquivo gerado: Tst_Espc.h -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* Este módulo consta somente do módulo de definição de todos os módulos -* de teste específicos a serem desenvolvidos, e também da especificação -* do tipo de condições de retorno deste módulo. -* -* Ele estabelece a interface a ser utilizada pelo módulo de teste -* genérico com todos os módulos de teste específico a serem -* desenvolvidos. -* -* Os módulos de teste específico devem sempre incluir este módulo -* de definição e, idealmente, não devem adicionar mais itens -* à interface. -* -* O módulo de teste específico contém a função de teste de um -* determinado módulo ou conjunto de módulos. Mais especificamente, -* contém a função que interpreta os comandos de teste que exercitarão -* as funções do(s) módulo(s) em teste. -* -* Poderá conter também diversas funções auxiliares requeridas para -* realizar os testes, vide "contexto" a seguir. -* -* O contexto é formado por variáveis e estruturas auxiliares necessárias -* para que se possa efetuar todos os comandos de teste. -* Por exemplo pode-se desejar testar várias instâncias de uma -* mesma estrutura. Uma forma de resolver isto é criar um vetor -* global static -* de n elementos em que cada elemento aponta para a cabeça de -* uma determinada instância dessa estrutura. Para realizar um -* teste relativo a uma determinada instância, torna-se necessário -* selecioná-la através de um índice contido no comando de teste. -* Este parâmetro, embora seja um índice, é na realidade o identificador -* da instância da estrutura a ser manipulada (idEstrutura). -* -* Caso o módulo em teste requeira um contexto, este deverá ser -* estabelecido no presente módulo. Para tal devem ser declaradas -* variáveis e estruturas encapsuladas e devem ser incluídos comandos -* de teste capazes de manipular o contexto. -* -* Uma das formas para estabelecer o contexto seria a de incluir -* no mçodulo de teste específico comando semelhantes a: -* -* =iniciaXXX que inicializa o contexto do módulo sob teste para -* vazio. Este comando deve ser utilizado uma única vez -* logo ao inciar a execução do teste. -* =reset restaura o contexto para vazio. Este comando usualmente -* assumirá que o contexto a esvaziar esteja correto. -* O comando deverá liberar os espaços alocados aos -* elementos, anular as referências a ele, inicializar -* valores de vetores de referências, etc. -* O comando tem utilidade especial ao segmentar um teste -* em partes estanques e ao controlar vazamento de -* memória. -* =terminaXXX este comando destrói todo o contexto e não o -* reinicializa. O objetivo é poder verificar vazamento -* de memória. -* -* Evidentemente, outra forma seria a de alterar as funções de -* inicialização e término do módulo de teste genérico o que é pouco -* recomendável pois viola o princípio de um mesmo módulo genérico -* servir para testar todos os construtos. -* -* Para cada função do módulo a ser testado deve existir pelo menos -* um comando de teste. Em alguns casos pode ser interessante criar -* comandos que armazenem, alterem ou consultem variáveis de -* estado do próprio módulo de teste. Ver os comentários sobre -* contexto acima. Ou seja, podem existir comandos de teste que -* têm o propósito de agir sobre o contexto e, não, o de efetuar -* um determinado teste. Alguns desses comandos podem inclusive -* realizar verificações entre um resultado esperado e existente -* no contexto. -* -* Todos os controles de consistência dos parâmetros dos comandos -* de teste devem ser realizados no módulo de teste específico. -* Recomenda-se que seja sempre retornado TST_CondRetParm, -* sinalizando erro de sintaxe do comando de teste ou valores -* não permitidos. Deve ser sempre assumido que os parâmetros -* podem estar em erro. Ou seja, o controle da integridade dos -* comando é mandatória. -* -* Caso seja necessário emitir mensagens especiais, -* deve ser utilizada a função genérica "TST_ExibirPrefixo". -* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, -* (prefixo, ou comparar), utilize a função -* fprintf( TST_ObterArqLog( ) , "..." , ... ) -* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") -* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção -* assegura a consistência do aspecto das mensagens com o restante do -* programa de teste. -* -* Cada comando deve ser completamente interpretado pelo seu -* respectivo fragmento de interpretação. Ou seja, não deverá ser -* retornado para o módulo genérico qualquer dado adicional à -* condição de retorno da função de teste específico. Veja -* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes -* à mensagen já exibida. -* -* A função TST_NotificarFalha sempre registra uma falha, enquanto que -* a função TST_ExibirPrefixo pode ser usada para emitir mensagens -* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo -* seja utilizada para sinalizar uma falha, é necessário chamar -* também a função TST_ContarFalha( ) para que seja notificada a falha. -* Isto não é necessário no caso da função TST_NotificarFalha, pois -* esta sempre conta falhas. -* -* As funções a testar que retornem um valor sempre devem ter -* este valor verificado, mesmo que seja uma condição de retorno. -* Utilize para isto uma das funções " Comparar" do arcabouço. -* Caso uma função retorne dois ou mais valores, incluindo -* a condição de retorno, utilize um código semelhante ao -* descrito a seguir. -* -* Seja -* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... -* a função a ser testada e, v1, v2, ... os dados retornados de -* alguma forma (valor retornado, parâmetro por referência, variável -* global). Assumindo que v1 seja o valor retornado. -* -* v1Obtido = FuncATestar( ... -* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; -* if ( CondRet != TST_CondRetOK ) -* { -* return CondRet ; -* } -* -* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; -* if ( CondRet != TST_CondRetOK ) -* { -* return CondRet ; -* } -* ... -* -* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; -* -***************************************************************************/ - -#if defined( Tst_Espc_OWN ) - #define Tst_Espc_EXT -#else - #define Tst_Espc_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -#define SINALIZA_ERRO ">>>" -#define SINALIZA_RECUPERA "<<<" -#define SINALIZA_COMENTARIO "!!!" - - -/*********************************************************************** -* -* $TC Tipo de dados: TST Cond ret módulo de teste específico -* -* -* $ED Descrição do tipo -* Este tipo enumera todas as condições de retorno que podem ser -* geradas pela função de teste específica. -* -***********************************************************************/ - - typedef enum { - - TST_CondRetOK , - /* Comando de teste executou corretamente */ - - TST_CondRetErro , - /* Comando de teste encontrou uma ou mais falhas - * - *$ED Descrição - * Esta condição sinaliza que um ou mais resultados da execução - * da função sob teste resultou em um valor diferente do esperado. */ - - TST_CondRetParm , - /* Comando de teste está com a sintaxe em erro - * - *$ED Descrição - * A presente condição de retorno deve ser retornada caso a sintaxe - * ou os valores do comando de teste estiverem em erro. - * - * Todos os fragmentos de interpretação devem: - * - realizar a análise dos parâmetros do comando - * - verificar se todos os parâmetros foram lidos - * - verificar se os valores dos parâmetros estão corretos - * por exemplo: verificar se os índices de acesso a elementos - * estão dentro dos limites dos correspondentes vetores. - * - efetuar a função a testar - * - verificar se os resultados retornados por esta função estão - * corretos */ - - TST_CondRetNaoExecutou , - /* Comando de teste não se destina ao presente interpretador - * - *$ED Descrição - * Esta condição deve ser retornada por todas as funções de interpretação - * de comandos de teste relativas a módulos do próprio arcabouço, - * caso não tenha sido encontrado um comando válido. Isso permite - * estabelecer um "daisy chain" de interpretadores em que cada qual - * tenha finalidade específica no contexto do arcabouço. */ - - TST_CondRetNaoConhec , - /* Comando de teste não é conhecido - * - *$ED Descrição - * Esta condição deve ser retornada por todas as funções de interpretação - * de casos de teste específico visando determinado módulo em teste, - * sempre que esse interpretador não consiga identificar o comando. - * - * Cabe salientar a diferença entre TST_CondRetNaoExecutou e - * TST_CondRetNaoConhec. A primeira corresponde à não interpretação - * de um comando possivelmente válido em interpretadores subsequentes. - * A segunda corresponde a comandos não válidos considerando todos - * os interpretadores. */ - - TST_CondRetNaoImplementado , - /* Comando de teste não implementado - * - *$ED Descrição - * Esta condição deve ser retornada ao interpretar um comando de teste - * específico ainda não implementado. - * - * Recomenda-se que o desenvolvimento dos módulos sob teste e do - * correpondente módulo de teste específico se dê incrementalmente. - * Consequentemente diversos comandos não estarão implementados - * no início do desenvolvimento. Esta incompleteza poderá ser - * sinalizada com esta condição de retorno. */ - - TST_CondRetMemoria - /* Faltou memória para executar o comando - * - *$ED Descrição - * Esta condição deve ser retornada caso tenha ocorrido algum erro - * quando o módulo de teste específico tentar alocar memória ou - * outro recurso. */ - - } TST_tpCondRet ; - - -/*********************************************************************** -* -* $FC Função: TSTE &Efetuar comandos de teste específicos -* -* $ED Descrição da função -* Efetua os diversos comandos de teste específicos para o módulo -* sendo testado. -* -* Cada módulo de teste específico deve desenvolver esta função. -* Poderá conter diversas outras conforme necessário. No entanto -* estas devem todas ser funções encapsuladas no módulo (static) -* -* Freqüentemente é necessário desenvolver um contexto para o teste. -* Por exemplo, pode ser necessário tratar n elementos disponibilizados -* pelo módulo sob teste. Neste caso deveria ser criado um vetor -* global com referências para estas elemento. Ao iniciar os teste -* este vetor deverá ser inicializado. Ao terminar, os elementos do -* vetor referenciando algum elemento devem ser destruídos. -* -* Todos os controles de consistência devem ser realizados no -* módulo de teste específico. -* -* A função TST_EfetuarComando( ) deve retornar as condições de retorno -* identificadas no tipo TST_tpCondRet. -* -* As funções do módulo sob teste que retornam algum valor sempre -* devem sempre ter este valor verificado, mesmo sendo uma condição de -* retorno. Para fazer a vereficação da corretude, recomenda-se -* utilizar as funções TST_CompararXXX definidas no módulo genérico. -* Assegura-se assim a uniformidade da saída gerada durante o teste. -* -* Para realizar a análise de um comando de teste recomenda-se -* utilizar as funções definidas no módulo LerParm. Elas, além -* de realizarem a análise léxica, permitem o uso intercambiável -* de parâmetros simbólicos ou literais. Também realizam a -* verificação da corretude dos tipos dos parâmetros, contribuindo -* assim para a redução de erros de redação de scripts de teste -* que possam passar despercebidos. -* -* As funções a serem testadas que requeiram algum argumento, devem -* ser chamadas com valores (parâmetros) extraídos do comando de -* teste sendo executado. Use sempre as funções do módulo LerParm -* para realizar a análise sintática. -* -* $EP Parâmetros -* $P ComandoTeste - String contendo o comando -* -* $FV Valor retornado -* TST_CondRetXXX - veja a descriÓcão dos possíveis valores -* retornados na especificação do correspondente -* enum -* -***********************************************************************/ - - TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; - -#undef Tst_Espc_EXT - -/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ - -#else -#endif diff --git a/tabuleiro/TRAB2-1.exe b/tabuleiro/TRAB2-1.exe index 5997b50f698f5f4e141341cef91cd2217c1eccc3..7044a438c9b163af5b878f4e93b20cfc732261b2 100644 GIT binary patch literal 123904 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

v2Bb!&ZO(!`NikMdQ$Jv_7lyPj&*ELqSxB*Rma} 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 z%0A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 D^fNSS delta 19180 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 1 Linha: 10 Retorno errado ao mover a peca Deveria ser: 1 É: 0 -<<< 0 Linha: 11 Falha esperada foi recuperada. - 13 == Mover Peca da casa 23 para a 0 - 16 == Mover uma peça por todas as casas do tabuleiro de 0 a 23 - 43 == Destruir Tabuleiro + 12 == Mover Peca da casa 23 para a 0 + 15 == Mover uma peça por todas as casas do tabuleiro de 0 a 23 + 42 == Destruir Tabuleiro -!!! Número de linhas lidas: 44 +!!! Número de linhas lidas: 43 !!! Número de casos de teste: 6 -!!! Número comandos corretos: 27 +!!! Número comandos corretos: 28 !!! Número de falhas encontradas: 0 !!! Não foram encontrados problemas diff --git a/tabuleiro/source/DADO.H b/tabuleiro/source/DADO.H deleted file mode 100644 index 5a2f0df..0000000 --- a/tabuleiro/source/DADO.H +++ /dev/null @@ -1,72 +0,0 @@ -/*************************************************************************** -* -* $MCD Módulo de definição: Módulo Dado -* -* Arquivo gerado: Dado.H -* Letras identificadoras: DAD -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão - -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.00 avs 15/08/2001 Início do desenvolvimento -* -* $ED Descrição do módulo -* Este módulo implementa um conjunto simples de funções para gerar o resultado -* do dado "lançado". -* -***************************************************************************/ - -#if defined( DADO_OWN ) - #define DADO_EXT -#else - #define DADO_EXT extern -#endif - -/*********************************************************************** -* -* $TC Tipo de dados: MAT Condicoes de retorno -* -* -***********************************************************************/ - - typedef enum { - - DAD_CondRetOK = 0 , - /* Executou correto */ - - DAD_CondRetErro = 1 , - /* Estrutura do DadoPontos está errada */ - - DAD_CondRetMatrizNaoExiste = 2 , - /* DadoPontos não existe */ - - DAD_CondRetFaltouMemoria = 3 - /* Faltou memória ao alocar dados */ - - } DAD_tpCondRet ; - -/*********************************************************************** -* -* $FC Função: DAD &Gerar o numero de casas a serem paladas -* -* $ED Descrição da função -* Retorno o numero da casas a serem andadas -* $FV Valor retonado -* DAD_CondRetOK -* DAD_CondRetFaltouMemoria -***********************************************************************/ - -DAD_tpCondRet DAD_NumPular(int *NumeroCasas) ; - -#undef DADO_EXT - -/*************** Fim do módulo de definição: Módulo Dado ****************/ diff --git a/tabuleiro/source/DADO.c b/tabuleiro/source/DADO.c deleted file mode 100644 index 18832fc..0000000 --- a/tabuleiro/source/DADO.c +++ /dev/null @@ -1,86 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: Gerador de numeroes aleatorios restrito ao -* numero de faces -* -* Arquivo gerado: DADO.c -* Letras identificadoras: DAD -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: avs - Arndt von Staa -* fvc - Felipe Vieira Côrtes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.0 tbm 02/set/2015 Início do desenvolvimento -* -***************************************************************************/ - -#include -#include -#include - -#define DADO_OWN -#include "DADO.h" -#include -#undef DADO_OWN -#define RAN_MAX 0x7fff - -/*************************************************************************** -* -* Função: DAD & gerar o numero de casas que devem ser puladas com 1 dado -* ****/ - - -/* Funcao do Modulo */ -int dadorand(void); - - -/* fim funcao do modulo */ - -DAD_tpCondRet DAD_NumPular(int *NumeroCasas) -{ - *NumeroCasas = randint(6); - - return DAD_CondRetOK; -}/*Fim da função DAD_NumPular */ - -/* Função usada pelo módulo */ - - -/* Returns an integer in the range [1, n]. - * - * Uses rand(), and so is affected-by/affects the same seed. - */ -int randint(int n) { - int r; - if ((n - 1) == RAND_MAX) { - return rand(); - } else { - // Chop off all of the values that would cause skew... - long end = RAND_MAX / n; // truncate skew - assert (end > 0L); - end *= n; - - // ... and ignore results from rand() that fall above that limit. - // (Worst case the loop condition should succeed 50% of the time, - // so we can expect to bail out of this loop pretty quickly. - while ((r = rand()) >= end); - - r = (r|time(NULL)); - - return (r % n) +1; - } -} -/*********** Fim do módulo de implementação: Módulo Dado **************/ - - - - - - - diff --git a/tabuleiro/source/TABULEIRO.C b/tabuleiro/source/TABULEIRO.C index 72a415e..a1c0b5f 100644 --- a/tabuleiro/source/TABULEIRO.C +++ b/tabuleiro/source/TABULEIRO.C @@ -173,7 +173,7 @@ TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDest return TAB_CondRetErro; } - // Avança para a casa destino + // Avança para a casa destino. LIS_AvancarElementoCorrente(pTab->Casas, mov); // Obtem a referencia para a lista nela armazenada diff --git a/tabuleiro/testetabuleiroscript.script b/tabuleiro/testetabuleiroscript.script index 6d7b4b5..33b934b 100644 --- a/tabuleiro/testetabuleiroscript.script +++ b/tabuleiro/testetabuleiroscript.script @@ -7,8 +7,7 @@ =moverpeca 0 1 0 == Mover Peca da casa 10 (vazia) para qualquer casa (errado) -=moverpeca 10 23 0 -=recuperar +=moverpeca 10 23 1 == Mover Peca da casa 23 para a 0 =moverpeca 23 0 0 From c895c8d91e798b12950f3dd889407032ac1da29b Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Fri, 25 Sep 2015 22:43:56 -0300 Subject: [PATCH 14/18] Dados ponto alterada um pouco --- DadoPontos/Source/DADOPONTOS.c | 2 ++ DadoPontos/TRAB2-4.exe | Bin 122368 -> 122368 bytes DadoPontos/TesteDadoPontos.script | 3 +++ DadoPontos/logTesteDadoPontos.txt | 23 ++++++++++++----------- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/DadoPontos/Source/DADOPONTOS.c b/DadoPontos/Source/DADOPONTOS.c index 94cc6f1..a51b103 100644 --- a/DadoPontos/Source/DADOPONTOS.c +++ b/DadoPontos/Source/DADOPONTOS.c @@ -80,6 +80,8 @@ DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoPontoCriado) DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono) { + if(CorNovoDono == DadoDobrar->CorDoJogador) + return DADPnt_CondRetErro; DadoDobrar->valor = DadoDobrar->valor * 2; /*Pega o valor atual do dado e multiplica por 2*/ DadoDobrar->CorDoJogador = CorNovoDono; diff --git a/DadoPontos/TRAB2-4.exe b/DadoPontos/TRAB2-4.exe index fe3098dc2e0208f6dd950c8dd324bf801e5d4bd0..69143dd8deb7bb2050d9adbe6c66b32964e656f7 100644 GIT binary patch delta 14121 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 Qkvt?XsbtO1XsE~k0|rmPDF6Tf delta 14146 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 K^?5YR{r>@rtl2IA diff --git a/DadoPontos/TesteDadoPontos.script b/DadoPontos/TesteDadoPontos.script index a4dd34c..659e949 100644 --- a/DadoPontos/TesteDadoPontos.script +++ b/DadoPontos/TesteDadoPontos.script @@ -31,6 +31,9 @@ == Obter Valor =obtervalorpartida 32 0 +== Dobrar Dado Errado (Nao eh dono do dado) +=dobrardado 'p' 1 + == Dobrar Dado =dobrardado 'b' 0 diff --git a/DadoPontos/logTesteDadoPontos.txt b/DadoPontos/logTesteDadoPontos.txt index f29adae..b01442f 100644 --- a/DadoPontos/logTesteDadoPontos.txt +++ b/DadoPontos/logTesteDadoPontos.txt @@ -20,17 +20,18 @@ LES - Laborat 25 == Dobrar Dado 28 == Dobrar Dado 31 == Obter Valor - 34 == Dobrar Dado - 37 == Obter Dono - 40 == Obter Valor Errado ->>> 1 Linha: 41 Valor da Partida Errado Deveria ser: 63 É: 64 -<<< 0 Linha: 42 Falha esperada foi recuperada. - 44 == Obter Valor - 47 == Destruir DadoPontos - -!!! Número de linhas lidas: 48 -!!! Número de casos de teste: 15 -!!! Número comandos corretos: 14 + 34 == Dobrar Dado Errado (Nao eh dono do dado) + 37 == Dobrar Dado + 40 == Obter Dono + 43 == Obter Valor Errado +>>> 1 Linha: 44 Valor da Partida Errado Deveria ser: 63 É: 64 +<<< 0 Linha: 45 Falha esperada foi recuperada. + 47 == Obter Valor + 50 == Destruir DadoPontos + +!!! Número de linhas lidas: 51 +!!! Número de casos de teste: 16 +!!! Número comandos corretos: 15 !!! Número de falhas encontradas: 0 !!! Não foram encontrados problemas From 9bcfb3b4799e3f2b810966b3cfffe7ab881dabb1 Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Fri, 25 Sep 2015 23:36:54 -0300 Subject: [PATCH 15/18] Consertando e padronizando --- Dado/{TRAB2-2.exe => TRAB2-4.exe} | Bin 121344 -> 121344 bytes Dado/logtestedado.txt | 16 +++---- Dado/testedado.bat | 2 +- .../ArcaboucoTeste.lib | Bin .../DADOPONTOS.c | 0 .../DADOPONTOS.h | 0 .../{Source => Source dadopontos}/GENERICO.H | 0 .../{Source => Source dadopontos}/LERPARM.H | 0 .../TESTDADOPONTOS.c | 0 .../{Source => Source dadopontos}/TST_ESPC.H | 0 DadoPontos/{TRAB2-4.exe => TRAB2-3.exe} | Bin 122368 -> 122368 bytes DadoPontos/TesteDadoPontos.bat | 2 +- DadoPontos/logTesteDadoPontos.txt | 2 +- LEIA-ME.txt | 42 ++++++++++++++++++ peca/{TRAB2-3.exe => TRAB2-2.exe} | Bin 121856 -> 121856 bytes peca/logtestepeca.txt | 2 +- .../ArcaboucoTeste.lib | Bin peca/{peca source => source peca}/GENERICO.H | 0 peca/{peca source => source peca}/LERPARM.H | 0 peca/{peca source => source peca}/PECA.C | 0 peca/{peca source => source peca}/PECA.h | 0 peca/{peca source => source peca}/TESTPECA.C | 0 peca/{peca source => source peca}/TST_ESPC.H | 0 peca/testepeca.bat | 2 +- .../ArcaboucoTeste.lib | Bin .../{source => source tabuleiro}/GENERICO.H | 0 .../{source => source tabuleiro}/LERPARM.H | 0 .../{source => source tabuleiro}/LISTA.C | 0 .../{source => source tabuleiro}/LISTA.H | 0 tabuleiro/{source => source tabuleiro}/PECA.C | 0 tabuleiro/{source => source tabuleiro}/PECA.h | 0 .../{source => source tabuleiro}/TABULEIRO.C | 0 .../{source => source tabuleiro}/TABULEIRO.H | 0 .../TESTTABULEIRO.C | 0 .../{source => source tabuleiro}/TST_ESPC.H | 0 35 files changed, 55 insertions(+), 13 deletions(-) rename Dado/{TRAB2-2.exe => TRAB2-4.exe} (99%) rename DadoPontos/{Source => Source dadopontos}/ArcaboucoTeste.lib (100%) rename DadoPontos/{Source => Source dadopontos}/DADOPONTOS.c (100%) rename DadoPontos/{Source => Source dadopontos}/DADOPONTOS.h (100%) rename DadoPontos/{Source => Source dadopontos}/GENERICO.H (100%) rename DadoPontos/{Source => Source dadopontos}/LERPARM.H (100%) rename DadoPontos/{Source => Source dadopontos}/TESTDADOPONTOS.c (100%) rename DadoPontos/{Source => Source dadopontos}/TST_ESPC.H (100%) rename DadoPontos/{TRAB2-4.exe => TRAB2-3.exe} (99%) create mode 100644 LEIA-ME.txt rename peca/{TRAB2-3.exe => TRAB2-2.exe} (99%) rename peca/{peca source => source peca}/ArcaboucoTeste.lib (100%) rename peca/{peca source => source peca}/GENERICO.H (100%) rename peca/{peca source => source peca}/LERPARM.H (100%) rename peca/{peca source => source peca}/PECA.C (100%) rename peca/{peca source => source peca}/PECA.h (100%) rename peca/{peca source => source peca}/TESTPECA.C (100%) rename peca/{peca source => source peca}/TST_ESPC.H (100%) rename tabuleiro/{source => source tabuleiro}/ArcaboucoTeste.lib (100%) rename tabuleiro/{source => source tabuleiro}/GENERICO.H (100%) rename tabuleiro/{source => source tabuleiro}/LERPARM.H (100%) rename tabuleiro/{source => source tabuleiro}/LISTA.C (100%) rename tabuleiro/{source => source tabuleiro}/LISTA.H (100%) rename tabuleiro/{source => source tabuleiro}/PECA.C (100%) rename tabuleiro/{source => source tabuleiro}/PECA.h (100%) rename tabuleiro/{source => source tabuleiro}/TABULEIRO.C (100%) rename tabuleiro/{source => source tabuleiro}/TABULEIRO.H (100%) rename tabuleiro/{source => source tabuleiro}/TESTTABULEIRO.C (100%) rename tabuleiro/{source => source tabuleiro}/TST_ESPC.H (100%) diff --git a/Dado/TRAB2-2.exe b/Dado/TRAB2-4.exe similarity index 99% rename from Dado/TRAB2-2.exe rename to Dado/TRAB2-4.exe index 30a7029e87c86b178bebaac42f613944cd013f2a..f15d295c53c2881801011b30a36bd4c0ce76bf40 100644 GIT binary patch delta 66 zcmZqJ!rrijeZmW-z@HOe`7vcWH(N1ow_;?}N&t#%PfKJ>lMyuAAjsQw=7-Z_m8Zp5 W76&9TPrqBs7{q9@-Jp)~LNow!(Hb-W delta 66 zcmZqJ!rrijeZmW-k}nfq`7sIhHd`@nw_;?}N&t#%PfKJ>lM#&Y>r3f%adO)%A-`bW W logtestedado.txt \ No newline at end of file +TRAB2-4 /stestedadoscript > logtestedado.txt \ No newline at end of file diff --git a/DadoPontos/Source/ArcaboucoTeste.lib b/DadoPontos/Source dadopontos/ArcaboucoTeste.lib similarity index 100% rename from DadoPontos/Source/ArcaboucoTeste.lib rename to DadoPontos/Source dadopontos/ArcaboucoTeste.lib diff --git a/DadoPontos/Source/DADOPONTOS.c b/DadoPontos/Source dadopontos/DADOPONTOS.c similarity index 100% rename from DadoPontos/Source/DADOPONTOS.c rename to DadoPontos/Source dadopontos/DADOPONTOS.c diff --git a/DadoPontos/Source/DADOPONTOS.h b/DadoPontos/Source dadopontos/DADOPONTOS.h similarity index 100% rename from DadoPontos/Source/DADOPONTOS.h rename to DadoPontos/Source dadopontos/DADOPONTOS.h diff --git a/DadoPontos/Source/GENERICO.H b/DadoPontos/Source dadopontos/GENERICO.H similarity index 100% rename from DadoPontos/Source/GENERICO.H rename to DadoPontos/Source dadopontos/GENERICO.H diff --git a/DadoPontos/Source/LERPARM.H b/DadoPontos/Source dadopontos/LERPARM.H similarity index 100% rename from DadoPontos/Source/LERPARM.H rename to DadoPontos/Source dadopontos/LERPARM.H diff --git a/DadoPontos/Source/TESTDADOPONTOS.c b/DadoPontos/Source dadopontos/TESTDADOPONTOS.c similarity index 100% rename from DadoPontos/Source/TESTDADOPONTOS.c rename to DadoPontos/Source dadopontos/TESTDADOPONTOS.c diff --git a/DadoPontos/Source/TST_ESPC.H b/DadoPontos/Source dadopontos/TST_ESPC.H similarity index 100% rename from DadoPontos/Source/TST_ESPC.H rename to DadoPontos/Source dadopontos/TST_ESPC.H diff --git a/DadoPontos/TRAB2-4.exe b/DadoPontos/TRAB2-3.exe similarity index 99% rename from DadoPontos/TRAB2-4.exe rename to DadoPontos/TRAB2-3.exe index 69143dd8deb7bb2050d9adbe6c66b32964e656f7..9f9cfc172573a35ac9a30b823c6c39cfa5241681 100644 GIT binary patch delta 65 zcmV-H0KWf#ya#~12axCjHTjY1P6Cw5gE|4XIspMHVgfb!w`OAj)*TQVrd5+)&&f)f XYTuU0QFHf~Oo0JY0W-ItfdOD#mh~I4 delta 65 zcmZqJ!``rmeZmW-v)?Da@?&~Ewb_bsyA>m&RuWKTds;H%HCX|(4T8K~XMQ*>R(V={ VWpO~#be~4XU`CVe3mO>{VgSIY8}$GH diff --git a/DadoPontos/TesteDadoPontos.bat b/DadoPontos/TesteDadoPontos.bat index a113068..88972cf 100644 --- a/DadoPontos/TesteDadoPontos.bat +++ b/DadoPontos/TesteDadoPontos.bat @@ -1 +1 @@ -TRAB2-4 /sTesteDadoPontos > logTesteDadoPontos.txt \ No newline at end of file +TRAB2-3 /sTesteDadoPontos > logTesteDadoPontos.txt \ No newline at end of file diff --git a/DadoPontos/logTesteDadoPontos.txt b/DadoPontos/logTesteDadoPontos.txt index b01442f..1c9a88e 100644 --- a/DadoPontos/logTesteDadoPontos.txt +++ b/DadoPontos/logTesteDadoPontos.txt @@ -4,7 +4,7 @@ LES - Laborat Arcabouço de teste de módulos C (c) 2006 --------------------------------------------- - Construto sob teste: TRAB2-4 + Construto sob teste: TRAB2-3 Arquivo de teste: TesteDadoPontos diff --git a/LEIA-ME.txt b/LEIA-ME.txt new file mode 100644 index 0000000..3c4be2e --- /dev/null +++ b/LEIA-ME.txt @@ -0,0 +1,42 @@ +INF1301 - Trabalho 2 + +Pasta Tabuleiro : Contém um script de teste para o módulo de tabuleiro de gamão +sem as regras implementadas, um executável gerado a partir do conteúdo da pasta source, +um arquivo .bat que executa o teste gerando um log de saída. + -TRAB2-1.exe + -testetabuleiroscript.script + -testetabuleiro.bat + -logsaidatabuleiro.txt +Pasta source tabuleiro : Contém os arquivos fonte usados para a geração do executável listado anteriormente + +Pasta peca : Contém um script de teste para o módulo de peça que representa peças do jogo de gamão, + um executável gerado a partir do conteúdo da pasta source peca, um arquivo .bat que executa o teste + gerando um log de saída. + -TAB2-2.exe + -testepecascript.script + -testepeca.bat + -logtestepeca.txt +Pasta source peca : Contém os arquivos fonte usados para a geração do executável listado anteriormente + +Pasta DadoPontos : Contém um script de teste para o módulo de dado pontos, que representa o dado + de dobrar os pontos com as faces 2, 4, 8, 16, 32, 64 do jogo de gamão, um arquivo executável gerado +a partir do conteúdo da pasta source dadopontos e um arquivo .bat que realiza o teste gerando um log de saída. + -TAB2-3.exe + -testeDadoPontos.script + -testeDadoPontos.bat + -logtesteDadosPonto.txt +Pasta source dadopontos : Contém os arquivos fonte usados para a geração do executável lista anteriormente + +Pasta Dado: Contém um script de teste para o módulo de dado que simula um dado de 6 faces sendo jogado, +um arquivo executável gerado pelo conteúdo da pasta source dado, um arquivo .bat que executa todo o teste +gerando um log de saída. + -TRAB2-4.exe + -testeadodoscript.script + -testedado.bat + -logtestedado.txt +Pasta Source Dado : Contém todos os arquivos necessários para a geração do executável dito anteriormente + +----------------------- COMO USAR ----------------------------------- +Para testar cada módulo basta clicar duas vezes no arquivo em lotes (.bat) referente ao módulo. +Será gerado um log contendo as informações do teste realizado. + diff --git a/peca/TRAB2-3.exe b/peca/TRAB2-2.exe similarity index 99% rename from peca/TRAB2-3.exe rename to peca/TRAB2-2.exe index fb98d773ec6c35263e54d3947cbd9a1f17bc59fd..2fc9b09f88f7cd7473be37488ae22757e04c1df4 100644 GIT binary patch delta 66 zcmZqJ!QQZgeZmW-oj)hO@?%=3(`?1K-HMS>D+wsFJuR70Oja<$uP>$7#mQ~6g#3be Wm$!Ulp5EKQ7{q9_{XqkxLNox5ff`%@ delta 66 zcmZqJ!QQZgeZmVS-LDg0`7v=aHCr)mw_;?}N&<>(PfKPLlNFR+7CJfp{7J7_S@)-% W3@rZ6IK8)lF^JK4`-28Xg=hd!5E;Dy diff --git a/peca/logtestepeca.txt b/peca/logtestepeca.txt index 7888ec3..fcbd99c 100644 --- a/peca/logtestepeca.txt +++ b/peca/logtestepeca.txt @@ -4,7 +4,7 @@ LES - Laborat Arcabouço de teste de módulos C (c) 2006 --------------------------------------------- - Construto sob teste: TRAB2-3 + Construto sob teste: TRAB2-2 Arquivo de teste: testepecascript diff --git a/peca/peca source/ArcaboucoTeste.lib b/peca/source peca/ArcaboucoTeste.lib similarity index 100% rename from peca/peca source/ArcaboucoTeste.lib rename to peca/source peca/ArcaboucoTeste.lib diff --git a/peca/peca source/GENERICO.H b/peca/source peca/GENERICO.H similarity index 100% rename from peca/peca source/GENERICO.H rename to peca/source peca/GENERICO.H diff --git a/peca/peca source/LERPARM.H b/peca/source peca/LERPARM.H similarity index 100% rename from peca/peca source/LERPARM.H rename to peca/source peca/LERPARM.H diff --git a/peca/peca source/PECA.C b/peca/source peca/PECA.C similarity index 100% rename from peca/peca source/PECA.C rename to peca/source peca/PECA.C diff --git a/peca/peca source/PECA.h b/peca/source peca/PECA.h similarity index 100% rename from peca/peca source/PECA.h rename to peca/source peca/PECA.h diff --git a/peca/peca source/TESTPECA.C b/peca/source peca/TESTPECA.C similarity index 100% rename from peca/peca source/TESTPECA.C rename to peca/source peca/TESTPECA.C diff --git a/peca/peca source/TST_ESPC.H b/peca/source peca/TST_ESPC.H similarity index 100% rename from peca/peca source/TST_ESPC.H rename to peca/source peca/TST_ESPC.H diff --git a/peca/testepeca.bat b/peca/testepeca.bat index d0daf44..9b73628 100644 --- a/peca/testepeca.bat +++ b/peca/testepeca.bat @@ -1 +1 @@ -TRAB2-3 /stestepecascript > logtestepeca.txt \ No newline at end of file +TRAB2-2 /stestepecascript > logtestepeca.txt \ No newline at end of file diff --git a/tabuleiro/source/ArcaboucoTeste.lib b/tabuleiro/source tabuleiro/ArcaboucoTeste.lib similarity index 100% rename from tabuleiro/source/ArcaboucoTeste.lib rename to tabuleiro/source tabuleiro/ArcaboucoTeste.lib diff --git a/tabuleiro/source/GENERICO.H b/tabuleiro/source tabuleiro/GENERICO.H similarity index 100% rename from tabuleiro/source/GENERICO.H rename to tabuleiro/source tabuleiro/GENERICO.H diff --git a/tabuleiro/source/LERPARM.H b/tabuleiro/source tabuleiro/LERPARM.H similarity index 100% rename from tabuleiro/source/LERPARM.H rename to tabuleiro/source tabuleiro/LERPARM.H diff --git a/tabuleiro/source/LISTA.C b/tabuleiro/source tabuleiro/LISTA.C similarity index 100% rename from tabuleiro/source/LISTA.C rename to tabuleiro/source tabuleiro/LISTA.C diff --git a/tabuleiro/source/LISTA.H b/tabuleiro/source tabuleiro/LISTA.H similarity index 100% rename from tabuleiro/source/LISTA.H rename to tabuleiro/source tabuleiro/LISTA.H diff --git a/tabuleiro/source/PECA.C b/tabuleiro/source tabuleiro/PECA.C similarity index 100% rename from tabuleiro/source/PECA.C rename to tabuleiro/source tabuleiro/PECA.C diff --git a/tabuleiro/source/PECA.h b/tabuleiro/source tabuleiro/PECA.h similarity index 100% rename from tabuleiro/source/PECA.h rename to tabuleiro/source tabuleiro/PECA.h diff --git a/tabuleiro/source/TABULEIRO.C b/tabuleiro/source tabuleiro/TABULEIRO.C similarity index 100% rename from tabuleiro/source/TABULEIRO.C rename to tabuleiro/source tabuleiro/TABULEIRO.C diff --git a/tabuleiro/source/TABULEIRO.H b/tabuleiro/source tabuleiro/TABULEIRO.H similarity index 100% rename from tabuleiro/source/TABULEIRO.H rename to tabuleiro/source tabuleiro/TABULEIRO.H diff --git a/tabuleiro/source/TESTTABULEIRO.C b/tabuleiro/source tabuleiro/TESTTABULEIRO.C similarity index 100% rename from tabuleiro/source/TESTTABULEIRO.C rename to tabuleiro/source tabuleiro/TESTTABULEIRO.C diff --git a/tabuleiro/source/TST_ESPC.H b/tabuleiro/source tabuleiro/TST_ESPC.H similarity index 100% rename from tabuleiro/source/TST_ESPC.H rename to tabuleiro/source tabuleiro/TST_ESPC.H From c85b82343e2e276426425db8c170a9c3fe423695 Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Sat, 26 Sep 2015 01:02:58 -0300 Subject: [PATCH 16/18] =?UTF-8?q?Relat=C3=B3rio=20Felipe=20Adicionado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- RELATORIO-Felipe.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 RELATORIO-Felipe.txt diff --git a/RELATORIO-Felipe.txt b/RELATORIO-Felipe.txt new file mode 100644 index 0000000..3c08bbb --- /dev/null +++ b/RELATORIO-Felipe.txt @@ -0,0 +1,8 @@ +Data Horas Trabalhadas Tipo Tarefa Descrição da Tarefa Realizada + +14/09 2h Especificar os módulos/ especificar as funções Desenhando o modelo estrutural do programa e definindo sua melhor arquitetura +16/09 2h Projetar/espicicar as funções Definido como serão as estruturas dos Módulos Peça e Dado Pontos e suas funções de acesso +21/09 2h Codificar/Revisar especificações Campos da peça retirados sobrando somente a cor dela, codificando teste para o módulo de dados, criando uma função que gera números aleatórios +23/09 2h Redigir Scripts de teste/revisar código do módulo Códigos alterados para criar scripts de teste mais fáceis de usar +24/09 3h codificar/Redigir script de teste/realizar testes/revisar script de teste Teste Dado Pontos, Teste de peça, teste de dado e teste de tabuleiro funcionando sem erros. Realizando as mudanças adequadas em cada módulo +25/09 3h Redigir script de teste/ revisar codigo do módulo/revisar script de teste Todos os módulos testados, acrescentando alguns comandos a mais para um teste mais completo. \ No newline at end of file From 448fb525a79cc36844c31e6d806c4a448b79c0b0 Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Sat, 26 Sep 2015 01:13:29 -0300 Subject: [PATCH 17/18] ... --- ArcaboucoTeste.lib | Bin 89288 -> 0 bytes DADO.H | 70 ------ DADO.c | 84 ------- DADOPONTOS.c | 132 ---------- DADOPONTOS.h | 131 ---------- GENERICO.H | 588 --------------------------------------------- LERPARM.H | 463 ----------------------------------- LISTA.C | 560 ------------------------------------------ LISTA.H | 346 -------------------------- PECA.C | 89 ------- PECA.h | 97 -------- TABULEIRO.C | 211 ---------------- TABULEIRO.H | 131 ---------- TESTDADO.c | 97 -------- TESTDADOPONTOS.c | 208 ---------------- TESTPECA.C | 156 ------------ TESTTABULEIRO.C | 154 ------------ TST_ESPC.H | 320 ------------------------ 18 files changed, 3837 deletions(-) delete mode 100644 ArcaboucoTeste.lib delete mode 100644 DADO.H delete mode 100644 DADO.c delete mode 100644 DADOPONTOS.c delete mode 100644 DADOPONTOS.h delete mode 100644 GENERICO.H delete mode 100644 LERPARM.H delete mode 100644 LISTA.C delete mode 100644 LISTA.H delete mode 100644 PECA.C delete mode 100644 PECA.h delete mode 100644 TABULEIRO.C delete mode 100644 TABULEIRO.H delete mode 100644 TESTDADO.c delete mode 100644 TESTDADOPONTOS.c delete mode 100644 TESTPECA.C delete mode 100644 TESTTABULEIRO.C delete mode 100644 TST_ESPC.H diff --git a/ArcaboucoTeste.lib b/ArcaboucoTeste.lib deleted file mode 100644 index 41ba1990924bce9779c6bdfa6b21565e71e10993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89288 zcmeEv3w%`7wf7z}gn*F*jf#jmU=S39Boh+C!zScGf*}MFf(j%I$%G7sOq|RhDq=81 z2}7#3YHe#c#Ma99Uu&JS&p9*0!%FY{ zzVFuqbMilHuf5jVkF(D{`|P#%sOi2?W6RY;CV8Akc5ZHVR$gvSf!9gTGA?uS3Jkb( zh*Bz`RK|-+UG-zuc4y2 zsVMr+I@{d)lgJf z+c3)?@`XwQ9pMFSf#zUnrQb#_3;A!1_}dx-J{z&xA6gj+`x{Y97J8eTv+RdS&&_ITZf?6wgsMZq)q$0gV_IXSKTh4;Ww6OqR2&S2{K!P zIoDJ1o5>PG93(cu$oVQ?(8}~C6n}9^X#=NJDikNCs5RIKYY>QvSG3C429-u0o7Ij& zihZqM6s{6~bD%8{stvRU?JT7&a>X@5I7?dtoVZH-3A1SsRl2&dH4+F3vn{VVD6q^7 zF(j-eN^P(y*dY<9HVLP`F`P1R6HqyW$4WfsSSV;_yEDwJVGj9hu`gu5qe!Gdp5tE` z3}{G3eH`J%sI9^oP+k>XXJq`!|Y@fUtEYiBP!Z_bnh7%GN&VO zi;-?FVi-}ipt4d7GbyO64vXUHMs+ZRa(FeWlRsd_bY?a))cRKX+FF8jzE*AlkP$+T zsUJe58;F%O2F(gFA8nAXT;~0duvGL-A*qnWX<}`J>TzZ1{Dz`sp+Kl8bYlehQ_~m< zw1pjHsnt;bMrknpEizgd-s|uq4CQP*X$RhFWR{ zthVby`&1cdYw_7_0ZnT$VhL$waSJugB;O#E1S88@QMfh|G&`=Vg7hS?G1P=ZfwtvB z;+!WAWQpAbp+{D-ZH5iiXq<4naAG7jir1bNvw(C)$TLJgBn+S$YG>9o6yq)l)%uqC zTajZ#D8chAguCBPGa7`Nz{+L8RulvARkU@W0Sq~4XqFn0^)_NnZ9`E97?BsXz%aX= zigac$h&$3wku0@S%o=2;m9++aF`_u1?L6k);FNDtt0J5Ln=NKJhzvXuLuJ0!79Vok zq)@vQs_}Pp_=5bjmk_CkVr991HDw>98nrWo7I-z~6i8LUuskSOuF$w(QP`D1)Bs{) z0@vbT>FTh*4Z3UrXe)|+9l;Kpdb4Vn)w*=GzY)C%uHafA;+ctA=?k=}PuzQ*oTGcM zgVB9`F+-_8U!~OEVx?BiR%&9mQjhFV>hX`1y2tHO_f@*6i>s21e*@L0`{!1t_iuo5 zspQl8H%OWPQq<}EOXidewsqIeSl8~K4}0kz{_|mvwuX8q<}Gb?0{-8B*#Gl=nCnQNPm6Z|VT?JNW;feYq2L=s)RT5%&oL zZQ)RRV_SG)aM=p#AL4Qj-8CxXdf#?~rux`IkkOXV#b@_W&%4;VV?>Gbe_cd|{u-rBo_-4#)9j z6;5=rsTJV)V1N~mP@&4|o4Bl_!%mG6#X+4ay>DXJzdCGVe0q>lKDSa?sX|V%)4_F^yL6X<0DRxOnce75;Fr zW3jz#)l@Zom>R9n0Vd0Wt6ci;oIqnJ*b!_Fd&bSb!ZWu$jM1Q5@N(**_q9MPUdWZ2 zfe|HhShCR?IaD(+ipN7pHsXwsIhf|N2Gd9eMA_KXjO9EKX(y=}x6lAun8uS5&`pxI zN955c9?9pIOXgw93=>+>)C@n5ADAI(Mq6a18I17`rQ?KoBvH*+WsdV1QQA6Gaj>l^ z@W!h_Pm|w+LEvDhE$H!wFu>}Ys5awshJ8Hp3l_@c7Jp-)DLB=mMvv)0{ZMMus8Obj zpvXW^-9w?CH>Y~WG7`Yiid5sxL?R51_hLTPw7KP42|bmI6Ze=Ak%-uiQrQd^)) zd3W`!&pd*wn!4x@GVx-lenjNxZtqJQ)29xLjF|eX@Hrc+T~p_|B160S26XKhF!fiF z*Svj)2VT_I_5AT^{gIWuC7G$!y_K06^I9lw&*IGChX{1-O6@x4x-Df7!rwoB{P>i` zndxC7tr^r?o0&fUu&c)4b92P%Xh~*9wHdX3QFIeq=H1Vvb-T#ue#5-eHLetPrE0q} z4B;uPk1wLIqEI*1RWj+kg5W`WDW{y#@rEU5QO0i&ZW=h(o$v|WVCs1sm zob1}=KEs(A@xz`JXZ3O#_1MRzQJaCNX0cIbnYyW3rJrWC>isfR+|$jk|BcEO@yYGB zDKiBXN!M)q9hbK03x7jK+?VMFM|@tK>09g)u8F6rhNqjSXI9!0)X|iA$O_7=`J5MQ zEjLXA(z@F|LPo8(GD@mR6cw9lvU!i4qFK1-G}D&W{WEG8q+A@vP}7js{mNgpF@_yS zU`5x*e~!$wTkh`N#0E>*b8>X;?kzj}1Wg!Au!~8li_aEQPWqWD&DnhOI@EGfkN)NO zaf^!lPCebs?rq9E?fY{!w`Z0fX@k?cS39)-IknAN$ae`dXykY^_dI)uNj+ zkKyrGzsS3PJN~Le)J_?XM0BB51%Aou5}Z>QU61pHj2dw+$1g)gah}EK^Ei*dFIjyR zXX<2UsPE#8!DpbK;yf6?Wc4o27cu%P&LSlVUGL#cO93hc%24M5iImHML`n`2P0mPG zHvo-f)D9$4dNto>pc0nyLrvSQX)kHo8$f5VluX>q7c;sFNaR%lQRHrd}ZU>@Qjb!yBpi3F;1QIE)0C|}92GC5P4D~*cNJ&A)iCiSHdNDys16|FbTXpD@K=cljtUd&~jM2wHV!`lk8NCT4I^GAmlKK7u zG@j9MpaSMgPsZCY)6N4DDHj2Wlq?{TG9Bn#=DQIHpInggRX}3tT|nqVgSH813Q&gn z0#F&F$ACo2HXwYm0pEWE(VKX(`ZJJ78Hn34i)llE@;UB#KxK@^0g04cp!1k72$anz z3?x#zfpVC(5h#!2-VY>F9t9F9yEFoeqPOY4;jc@bk6NqLWc&uH!bZGsPQ=T|s>jsv z2bi>7aZYS7f^-xgS>#J1D=! z)ejt$!?@b(pdh2w^A5@gP!2gLxu6`=6#IAzFD6S}~thl~tenauxs@kHGx${dgCuB|u z<{p&JpHoqlAYgv!tcsf2`3Na0UNC1tB}I}b^pzu4%&hrEbqR!AUrGXEnVr;z5{MSb zVyF>eR_Pp}Ru^d@nl^VP3>U$gR(fs4%!*i|Fjg&qteBKbNbTI(qRJRSb*1ww$|{OY z%V(8V8JUGauBQ3^a4C-g(j3tf&mW~AJt4{*9K-itkogOdN#faQHaezqU|@_xd7MpV zha{M8!cy#0OJe7r#HkW3G}noz;mJH#;*wcaF+|5~Mv3Ym@uV?CPCUsJ6Q=BGAT6J0 z=B0euky%7M^~bW4XUy7#Ta&G1{un;9H#Br$noKAVzPX_>7`!3iSA}*GMnZ2e0t$1L zjGp_OPWQ{m`gxTw!vRU3?A#F0SR~mpFPZ+vOXP_ttE@aO#N2i1jbwGs$(Xsn^qI zk{tuOb`Dto5S9XIG0S+_!llIV>|IYz?LPoVU4(_4(eFSl)s(j0tCMc&aHl8VA0 zQL6{PKBdZAk;U$6mdP4Sm0!en0Z|E)y7%3jOP>?$pDvI$!yS2(5ufK`s#z$hCouJ% z)6bs7w!V#_du{9K={#MPbGQod=K~hZYRr-F2=rRD4rL?X$n?PEr>_o))B87!z+2Xk z1=dLL3G(=K(>sIZTEbBsILWpeVh(tx#+SEokDacvnF;T&wC;RzZeC9MRIKeGlVAFV&T_Y0ReKiR7GH}P1Du1VxPbljT#C~jE zf57&!xw|iN0heHWX`$leI>yGS6{VN)V*HYMuselOHO?0>T7dIR{4!J<&Lxc2;9SJ0 zSJNH<8jN4EdKzaMqDof3##!RN3RH++2DhU!4EFkLfC96W95sXTK zL`ofy49+$HUBscyKr(O|0TL-|fv7*2tiBI4lF@b`k+KhHI%pY+hRrYL&{u$DK$NEU z$PoDvpsCE~8emEu0wlxX!+=DuM~7YkB!lk_KpvLd1T>SSM1W)<(jb`*apqVV?U7#t9{t9#%hYr9CwMZETBvM8I$*?&MzGpIDEs#i|A@?y% zTLC1)uMr@TvK~mJ^a9DS`A>l^=NLPI#xmLiBsugnkVv7S`EeZjB9IKp9t5I6)(rIy zkVyUu5Dg6^t4VI9u3(f4B=*e*%HTw69A6L5^l!LgUpQYz=#yGHe!>$!Y)r44bUgjg zb5zBQ!<-UGd0-BCdU@c|PRZwwgf>b+7T=e4ikIt+oidqgh@CQphu$s9l&oxZEi~IH zIf~j;JH@LyV<>rQa|~q)560VKWoN5roIKfHZiVeUdFrDW9<(ROCmT;rcFe%-l$;z@ z9mC^QwK0@Db*+=)%~mupYm@BFQ%jwc+$`0kDfZ!B+)5Zeq&un>=s#ZEH41->V;W-6 zF;JO9o}^h0ld>|7vM!GDU>xNM2j%Y{06ylBLzblvFbq_th4j3TgD4Fhi3XdeJ9vou zx;V;;ILgL2%0qFK@5E8|#8F<<6a@?Ecw1A*X8Ulj49`=Wu9MC&=!3A~n`ZY=EneBA ztkKB05FSdb;z131%We#Iu)k{uN3#X;tGdAv8-~%nkk2C8S&L+Z#0rEedM9RrjBMH| zl`@nO=i1BcMxeu3dw}I9Y-ylZX$)s@RKtZ|RJT-z0xRKB>#OtMate=s^4p1XqNYL0 zxKURy8b(^SVEEJ`i|zIdasKh;p2CyK9zpy-$!a|$EH^1JIUI zx0nw5*J!$?Z_%G>OgCl>b~5f`8q+;y-15{ZO*95u4LZ%-=%c4F4r;h*4A%aYo9Ogv z@vgx`*K`!77ZxVsqwb;oAU@CEH;a88!RVz)bYCu5jp)O{C>ZW<0S2_zs@j3%-PS()rRiqGq}X`z7+4i z?!L9>kc?>=pItksXxiR2N9+5eJL>!AvE-_*k6ml(ddpl3qiZrVNXg+8nICEzSCW|m zy(#hL{r*LaFR?Mvj3=V0cOA!NPsUw6sZWs5+jca-LaKU$@yp;BChA&e@Qf6p(aWIF z=sSm?I-v8IZyBGdTfY&A`o085QD8ug8P%qvHs@ zA*;UQ|5^AyIzPqM63~s9QRtwuqS(S?Z!<_SEaHJZc5~Q53SMmR&>zv(tSKIY5&~s2equ8P--X{Zn(`13 zFWh5WL*j()-k;RNs-d|x9O>|*m(|c54z}hrU@-)naC=WcuN`Dt52%qGHO$YCXnIfO zo0Xkgke>rSyKmNG6XC0mG}4jiX=T2M2?x#zzCdmQ`E-1O1`H7yAn?X-Tb$sM1 z;iIQGJtdK0e~)k0?TB9V_deBh*?zib+MM^Au%v~DrHKO$7J6v%dD>nLdYXd)kL9-2 zgl|OnKxeG^@dggk3vS^FP^6bL5 zs8xOs{L=7k3SY>46qUYD@fT7LzV8JiSiFTKE7cf`U|kgcP-xm=H#dU>y3CgQ4(jDiVcIxxPLl^d8eCM!oyR}q@3PmnX|j2y_HNs~Obyw!GeOfbF& z!fguX5Z{?N_^~)-OvmCejbmD=m8S7pvY{-n(w-moT48$Pkr`*sjx&*(Nt4)qd;Zy~ zaKbua@`_U$)pcD7jWknsvS{W}3AJegR6;)UcBkwi* z7yma8`KNJRK3P0spj(FS1H+|{<9LRgJ(wCDdMG8T!=wX2sF!HK#uQ9hRKIwMS;#}? zw)5BikjICmgO)|u12NFnNK2=M;l4)|Y>2r288^KL?Es~lX7pHT=6YC$mFaw8YB!A7 zZSYKAJcF}mqGz8`T@$tiv`!JFizSm|U{j>M6$_!^-iI1p_0d{zl~3!<%=Dbc5Tt6he_R7&CceUT5x??i|C zJn}b79oPBc#Bh7(hl|4l%e(t-{}Xy3^s&76;Y

(+lxk=fk>%<99^g>Amgv#<{Lp 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 -#include -#include - -#define DADO_OWN -#include "DADO.h" -#include -#undef DADO_OWN -#define RAN_MAX 0x7fff - -/*************************************************************************** -* -* Função: DAD & gerar o numero de casas que devem ser puladas com 1 dado -* ****/ - - -/***** Código das funções encapsuladas no módulo *****/ - -int randint(int n); - - -/***** Código das funções exportadas pelo módulo *****/ - -/*************************************************************************** -* -* Função: DAD &Gera numero aleatório -* ****/ - -DAD_tpCondRet DAD_NumPular(int *NumeroCasas) -{ - *NumeroCasas = randint(6); - - return DAD_CondRetOK; - -}/*Fim da função DAD_NumPular */ - - -/* Função usada pelo módulo */ -/* Returns an integer in the range [1, n]*/ -int randint(int n) { - int r; - if ((n - 1) == RAND_MAX) { - return rand(); - } else { - long end = RAND_MAX / n; // truncate skew - assert (end > 0L); - end *= n; - while ((r = rand()) >= end); - - r = (r|time(NULL)); - - return (r % n) +1; - } -} -/*********** Fim do módulo de implementação: Módulo Dado **************/ - - - - - - - diff --git a/DADOPONTOS.c b/DADOPONTOS.c deleted file mode 100644 index 94cc6f1..0000000 --- a/DADOPONTOS.c +++ /dev/null @@ -1,132 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: Gerador de numeroes aleatorios restrito ao -* numero de faces -* -* Arquivo gerado: DADOPONTOS.c -* Letras identificadoras: DADPnt -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: -* fvc - Felipe Vieira Côrtes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.0 tbm 02/set/2015 Início do desenvolvimento -* -***************************************************************************/ - -#include -#include -#include -#include -#include "GENERICO.H" - -#define DADO_OWN -#include "DADOPONTOS.h" -#undef DADO_OWN - -/*********************************************************************** -* -* $TC Tipo de dados: DADPnt Descritor do dados de ponto. -* -* $ED Descrição do tipo -* Descreve a estrutura do dados ponto -***********************************************************************/ - - typedef struct tgDadoPontos { - int valor; - /*Valor atual do dado de pontos*/ - char CorDoJogador; - /*Ponteiro para o jogador que pode usar o dado - *$EED Assertivas Estruturais - * É NULL se o jogo esta no começo e ninguem fez nenhuma dobra */ - - } tpDadoPontos ; - -/***** Dados encapsulados no módulo *****/ - - -/***** Código das funções exportadas pelo módulo *****/ - -/*************************************************************************** -* -* Função: DADPnt Criar Dado de Pontos -* ****/ - -DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoPontoCriado) -{ - - *DadoPontoCriado = (tpDadoPontos*)malloc(sizeof(tpDadoPontos)); - - if(DadoPontoCriado == NULL) - return DADPnt_CondRetFaltouMemoria; - - (*DadoPontoCriado)->valor = 2; - /*Valor Inicial do Dado de Pontos*/ - (*DadoPontoCriado)->CorDoJogador = 's'; - /*Quando o dado é criado, todos os jogadores podem usa-lo o inicio - s determinado que qualquer jogador pode usar*/ - return DADPnt_CondRetOK; -} -/*************************************************************************** -* -* Função: DADPnt Dobrar Dado de Pontos e Mudar "Dono" do Dado de Pontos -* ****/ - -DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono) -{ - DadoDobrar->valor = DadoDobrar->valor * 2; - /*Pega o valor atual do dado e multiplica por 2*/ - DadoDobrar->CorDoJogador = CorNovoDono; - return DADPnt_CondRetOK; -} - -/*************************************************************************** -* -* Função: DADPnt Gerar Valor da Partida -* ****/ - -DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos DadoAtual, int * valorjogo) -{ - if(DadoAtual->CorDoJogador == 's' ) - *valorjogo = 2; - else - *valorjogo = DadoAtual->valor; - return DADPnt_CondRetOK; -} - -/*************************************************************************** -* -* $FC Função: DADPnt Obter "Dono" do dado de pontos atual -* -* $ED Descrição da função -* Retorno o dono do Dado -* $FV Valor retonado -* DADPnt_CondRetOK -* -***********************************************************************/ - -DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos DadoPonto, char * CorDonoAtual) -{ - *CorDonoAtual = DadoPonto->CorDoJogador; - return DADPnt_CondRetOK; -} - -/*************************************************************************** -* -* Função: DADPnt Destruir Dado de Pontos -* ****/ - -DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado) -{ - if(Dado == NULL) - return DADPnt_CondRetDadoPontosNaoExiste; - free(Dado); - return DADPnt_CondRetOK; -} -/*********** Fim do módulo de implementação: Módulo DadoPontos **************/ diff --git a/DADOPONTOS.h b/DADOPONTOS.h deleted file mode 100644 index decba33..0000000 --- a/DADOPONTOS.h +++ /dev/null @@ -1,131 +0,0 @@ -/*************************************************************************** -* -* $MCD Módulo de definição: Módulo Dado -* -* Arquivo gerado: DadoPontos.H -* Letras identificadoras: DADPnt -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: fvc - Felipe Vieira Côrtes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão - -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.00 tbm 05/09/2015 Início do desenvolvimento -* -* $ED Descrição do módulo -* Este módulo implementa um conjunto simples de funções para verificar o -* valor atual da partida e qual jogador pode utilizar o dado. -* -***************************************************************************/ - -#if defined( DADOPONTOS_OWN ) - #define DADOPONTOS_EXT -#else - #define DADOPONTOS_EXT extern -#endif - -#include "Generico.h" - -typedef struct tgDadoPontos * tppDadoPontos; -typedef struct tgPlayers * tppPlayers; -/*********************************************************************** -* -* $TC Tipo de dados: DADPnt Condicoes de retorno -* -* -***********************************************************************/ - - typedef enum { - - DADPnt_CondRetOK = 0 , - /* Executou correto */ - - DADPnt_CondRetErro = 1 , - /* Estrutura do DadoPontos está errada */ - - DADPnt_CondRetDadoPontosNaoExiste = 2 , - /* DadoPontos não existe */ - - DADPnt_CondRetFaltouMemoria = 3 - /* Faltou memória ao alocar dados */ - - } DADPnt_tpCondRet ; - - -/*********************************************************************** -* -* $FC Função: DADPnt Criar Dado de Pontos -* -* $ED Descrição da função -* Cria um novo dado de pontos -* $FV Valor retonado -* DADPnt_CondRetOK -* DADPnt_CondRetFaltouMemoria -* -***********************************************************************/ - -DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoCriado); - -/*************************************************************************** -* -* $FC Função: DADPnt Dobrar Dado de Pontos e Mudar "Dono" do Dado de Pontos -* -* $ED Descrição da função -* Dobra o valor da partida e Muda o jogador que possa usar o Dado de Pontos -* $FV Valor retonado -* DADPnt_CondRetOK -* DADPnt_CondRetFaltouMemoria -* -***********************************************************************/ - -DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); - -/*************************************************************************** -* -* $FC Função: DADPnt Valor da partida -* -* $ED Descrição da função -* Gera o valor atual da partida -* $FV Valor retonado -* DADPnt_CondRetOK -* -***********************************************************************/ - -DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos Dado, int * valorjogo); - -/*************************************************************************** -* -* $FC Função: DADPnt Obter "Dono" do dado de pontos atual -* -* $ED Descrição da função -* Retorno o dono do Dado -* $FV Valor retonado -* DADPnt_CondRetOK -* -***********************************************************************/ - -DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos Dado, char * corRecebida); - -/*************************************************************************** -* -* $FC Função: DADPnt Destroi o Dado de Pontos -* -* $ED Descrição da função -* Destroi o Dado de Pontos -* $FV Valor retonado -* DADPnt_CondRetOK -* DADPnt_CondRetFaltouMemoria -* -***********************************************************************/ - -DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado); - -#undef DADOPONTOS_EXT - -/*************** Fim do módulo de definição: Módulo DadoPontos ****************/ diff --git a/GENERICO.H b/GENERICO.H deleted file mode 100644 index c9d2692..0000000 --- a/GENERICO.H +++ /dev/null @@ -1,588 +0,0 @@ -#if ! defined( GENERICO_ ) -#define GENERICO_ -/*************************************************************************** -* -* $MCD Módulo de definição: TSTG Controlador de teste genérico -* -* Arquivo gerado: GENERICO.h -* Letras identificadoras: TST -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* O módulo de teste genérico contém um conjunto de funções de -* coordenação, apoio e controle da execução de testes de módulos -* quaisquer. -* -* Embora na prática a função de teste específica seja uma extensão da -* função de teste genérica, a função de teste específica encontra-se em -* outro módulo. Desta forma as alterações necessárias para cada -* módulo a testar concentram-se exclusivamente naquele módulo. -* -* $EIU Interface com o usuário pessoa -* Os seguintes comandos genéricos estão definidos: -* -* linha em branco - faz nada -* -* // - comentário, é impresso no LOG -* -* == - título de caso de teste, o título é impresso no LOG -* -* =recuperar -* - Caso o comando imediatamente anterior ao comando -* =recuperar retorne TST_CondRetOK, obviemanete o comando -* executou corretamente, portanto o comando =recuperar -* reportará uma falha no script de teste, uma vez que não -* foi encontrada a falha esperada ao executar o comando. -* - Caso o comando antecessor retorne TST_CondRetErro, -* ou TST_CondRetParm (erro de parâmetros do comando) -* a falha reportada será desconsiderada, uma vez que -* era esperada. O comando =recuperar destina-se a -* apoiar o teste da corretude dos validadores de -* parâmetros dos comandos e das funções por eles -* ativadas. -* - caso o comando antecessor retorne outras condições, o -* comando =recuperar será tratado como falha. -* -* =bkpt - permite interagir com o depurador utilizado para -* desenvolver os módulos sob teste. O comando =bkpt -* executa um código "dummy" no qual pode ser inserido -* um "breakpoint" do depurador. Desta forma o teste pode -* prosseguir sem interrupção até o comando =bkpt. -* Para isto -* - apague ou desative todos os breakpoints do depurador -* - insira o comando =bkpt no script pouco antes do ponto -* de interrupção desejado -* - usando o depurador, estabeleça um breakpoint na linha de -* código: "Dummy = 0 ;" contida no módulo de teste -* genérico. Esta linha pode ser encontrada -* procurando por "BKPT_CMD" -* - dê partida no programa e espere até chegar ao breakpoint -* associado ao comando "dummy". Agora reative ou instale -* os breakpoints requeridos pela a sessão de depuração. -* e continue depurando -* -* =cancelar -* - termina a interpretação dos comandos de teste. -* Sempre sinaliza falha. -* -* =AceitaFalhasAcumuladas numFalhas -* - caso o contador de falhas registre numFalhas, ele será -* tornado zero. Este comando é similar a =recuperar. -* Difere deste por ser executado desde que o comando -* anterior não tenha reportado erro, tal como acontece -* com todos os comandos, exceto =recuperar. -* O comando permite recuperar falhas sinalizadas por -* módulos de apoio, tais como, leitor de parâmetros, -* contador de passagens e controle de espaço dinâmico. -* Caso o contador de número de falhas contenha um valor -* diferente de numFalhas, será reportado um erro e -* o contador é incrementado de 1. -* -* Os demais comandos são passados para as funções de teste específico. -* Primeiro para as do arcabouço, depois para a específica do módulo -* a testar. A última função de teste específico deve retornar a condição -* TST_CondRetNaoConhec caso não consiga interpretar a diretiva. -* -* $EIM Interface com outros módulos -* A primeira função do arcabouço ("framework") a ser chamada deve a -* sempre ser TST_InicializarTeste. Caso não o seja, ocorrerão erros -* de execução (assert). -* -* Após abra o arquivo de script executando a função -* TST_AbrirArquivoScript. Se for desejado gerar um log abra -* o arquivo corresponente com a função TST_AbrirArquivoLog. -* -* Depois de abrir os arquivos, execute os testes chamando a função -* TST_RealizarTeste. A função de teste genérico lerá todo o arquivo -* de script, retornando após concluir o teste. -* -* Após, termine o teste através da função TST_TerminarTeste. -* Esta função exibe as estatísticas do teste e, caso solicitado, -* acumula essas estatísticas em um arquivo acumulador (ver -* parâmetro /a do programa principal. -* -* As funções "TST_ObterXXX" podem ser utilizadas antes de fechar o -* módulo de teste para exibir o resumo do teste no módulo cliente do -* módulo de controle genérico. -* -* O programa cliente do módulo controle de teste genérico pode -* efetuar as operações acima repetidas vezes, permitindo, assim o -* teste envolvendo diversos arquivos scripts de teste. A saída -* de cada teste deve ser dirigida para um log específico, ou para -* stdout, uma vez que, ao abrir um arquivo log, o seu conteúdo será -* sempre destruído. -* -* O módulo de teste genérico também implementa diversas funções -* de comparação "TST_CompararXXX" use-as no módulo de controle de -* teste específico. Desta forma será assegurado o tratamento uniforme -* de todas as falhas possivelmente encontradas. -* -* O módulo disponibiliza ainda a função TST_ExibirPrefixo -* que gera uma linha de saída obedecendo aos padrões de interface -* estabelecidos. Sendo desejado pode-se adicionar textos à linha -* usando a funcao fprintf( TST_ObterArqLog( ) , ... ). Um exemplo da -* utilidade disso é quando se deseja imprimir informação complementar -* ao interpretar uma determinada diretiva. A função TST_ObterArqLog( ) -* retorna a referência ao arquivo log em uso no momento. -* -* Finalmente, o módulo disponibiliza a função TST_NotificarFalha -* que incrementa o contador de falhas além de emitir uma mensagem -* de erro. -* -***************************************************************************/ - -#if defined( GENERICO_OWN ) - #define GENERICO_EXT -#else - #define GENERICO_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -#include "TST_Espc.h" - - -/*********************************************************************** -* -* $FC Função: TSTG &Controlar uma sessão de teste -* -* $ED Descrição da função -* Esta função é o ponto de entrada para a realização do teste. -* Permite que se adicione o arcabouço de teste a um sistema qualquer. -* -* $EP Parâmetros -* $P NomeConstrutoParm -* $P NomeArqScriptParm - deve ser não nulo -* $P NomeArqLogParm - se for nulo, gera a saída na console -* $P NomeArqAcumParm - se não for nulo, acumula as estatísticas no -* arquivo denominado -* -* $FV Valor retornado -* 0 - se o teste ocorreu OK -* 4 - se foram observados erros de dados ou falhas nos testes -* -***********************************************************************/ - - int TST_ControlarSessaoTeste( char * NomeConstrutoParm , - char * NomeArqScriptParm , - char * NomeArqLogParm , - char * NomeArqAcumParm ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar booleano -* -* $ED Descrição da função -* Compara valor booleano esperado com valor booleano obtido, -* reportamdo uma falha caso não sejam iguais. -* Note que "!= 0" corresponde a TRUE e "== 0" corresponde a FALSE -* -* $EP Parâmetros -* ValorEsperado - é um valor fornecido como parâmetro do comando -* de teste -* ValorObtido - é o valor retornado pela função em teste -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for consistente com o obtido -* TST_CondRetOK se os valores forem consistentes -* -***********************************************************************/ - - TST_tpCondRet TST_CompararBool( int ValorEsperado , - int ValorObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar caractere -* -* $ED Descrição da função -* Compara um caractere esperado com um caractere obtido, emitindo mensagem de -* erro caso não sejam iguais. -* -* $EP Parâmetros -* ValorEsperado - é um valor fornecido como parâmetro do comando -* de teste -* ValorObtido - é o valor retornado pela função em teste -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for igual ao obtido -* TST_CondRetOK se os valores forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararChar( char ValorEsperado , - char ValorObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar inteiro -* -* $ED Descrição da função -* Compara valor inteiro long esperado com valor inteiro obtido, -* reportamdo uma falha caso não sejam iguais. -* -* $EP Parâmetros -* ValorEsperado - é um valor fornecido como parâmetro do comando -* de teste -* ValorObtido - é o valor retornado pela função em teste -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for igual ao obtido -* TST_CondRetOK se os valores forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararInt( long ValorEsperado , - long ValorObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar flutuante -* -* $ED Descrição da função -* Compara valor flutuante esperado com valor flutuante obtido, -* reportando uma falha caso -* 1 - Tolerancia > esperado / obtido ou -* 1 + Tolerancia < esperado / obtido -* -* $EP Parâmetros -* ValorEsperado - é um valor fornecido como parâmetro do comando -* de teste -* ValorObtido - é o valor retornado pela função em teste -* Tolerância - indica os limites da relação entre esperado e obtido. -* Deve ser um valor positivo, menor do que 1. -* Use um valor do tipo 10 ** -n, no qual n é o -* número de dígitos significativos desejado. -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor obtido não estiver dentro do domínio da -* tolerância em torno do valor esperado -* TST_CondRetOK se os valores estiverem dentro da tolerância -* -***********************************************************************/ - - TST_tpCondRet TST_CompararFloat( double ValorEsperado , - double ValorObtido , - double Tolerancia , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar string -* -* $ED Descrição da função -* Compara string esperado com string obtido, reportamdo uma falha -* caso não sejam iguais. Ambos os strings devem obedecer o -* padrão C, terminando em zero. -* -* $EP Parâmetros -* ValorEsperado - é um string fornecido como parâmetro do comando -* de teste. -* ValorObtido - é o string retornado pela função em teste -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for igual ao obtido -* TST_CondRetOK se os valores forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararString( char * ValorEsperado , - char * ValorObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar espaço -* -* $ED Descrição da função -* Compara espaços de dados, reportando uma falha caso não sejam iguais. -* Esta função pode ser utilizada para comparar qualquer coisa, -* inclusive valores do tipo "struct" -* O tipo do valor é indefinido e os valores serão exibidos em -* formato hexadecimal, caso não sejam iguais -* -* $EP Parâmetros -* ValorEsperado - ponteiro para o espaço que contém o valor esperado -* ValorObtido - ponteiro para o espaço que contém o valor obtido -* TamEspaco - tamanho do espaço a ser comparado -* pMensagem - mensagem explanatória da falha encontrada -* -* $FV Valor retornado -* TST_CondRetErro se o valor esperado não for igual ao obtido -* TST_CondRetOK se os valores forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararEspaco( void * ValorEsperado , - void * ValorObtido , - int TamEspaco , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar ponteiro -* -* $ED Descrição da função -* Compara dois ponteiros emitindo uma mensagem caso não sejam iguais -* -* $FV Valor retornado -* TST_CondRetErro se os dois ponteiros forem diferentes -* TST_CondRetOK se forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararPonteiro( void * PonteiroEsperado , - void * PonteiroObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Comparar ponteiro nulo -* -* $ED Descrição da função -* Verifica -* - quando ModoEsperado == 0 se o PonteiroObtido é nulo -* - quando ModoEsperado != 0 se o PonteiroObtido é não nulo -* -* $FV Valor retornado -* TST_CondRetErro se os dois ponteiros forem diferentes -* TST_CondRetOK se forem iguais -* -***********************************************************************/ - - TST_tpCondRet TST_CompararPonteiroNulo( int ModoEsperado , - void * PonteiroObtido , - char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Assertiva controlada -* -* $ED Descrição da função -* Esta função substitui a função assert de C. -* É utilizada no contexto do arcabouço de teste. -* Ela imprime mensagens mais visíveis tanto no log como na -* janela de comando. -* -* Recomenda-se, no entanto, utilizar a função assert de C em aplicações. -* -* $FV Valor retornado -* Termina a execução do programa com código de retorno == 4 -* -***********************************************************************/ - - #define TST_ASSERT( Expressao ) \ - TST_Assert( Expressao , __LINE__ , __FILE__ ) - - void TST_Assert( int Expressao , int Linha , char * NomeArq ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Exibir prefixo da mensagem -* -* $ED Descrição da função -* Imprime o prefixo de mensages de falha ou de informação. -* Não incrementa o contador de falhas. -* Esta função estabelece o padrão de saída das mensagens geradas -* durante os testes. -* -* $EP Parâmetros -* $P Indicador - informa a natureza da mensagem, -* Utilize preferenciamente as constantes definidas em -* TST_ESPEC.H: -* SINALIZA_ERRO ">>>" -* SINALIZA_RECUPERA "<<<" -* SINALIZA_COMENTARIO "!!!" -* $P pMensagem - é a mensagem prefixo a ser gerada. -* -* $EIU Interface com usuário pessoa -* Podem ser acrescentadas mensagens ao prefixo. A função -* TST_ObterArqLog retorna o ponteiro para o arquivo log em uso -* (stdout ou definido pelo usuário) -* -***********************************************************************/ - - void TST_ExibirPrefixo( char * Indicador , char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Notificar falha -* -* $ED Descrição da função -* Exibe uma mensagem de falha no formato padrão do arcabouço. -* A função não exibe os valores esperado e obtido. -* -* $EP Parâmetros -* $P pMensagem - mensdagem explicativa da falha. -* -* $FV Valor retornado -* TST_CondRetErro sempre -* -***********************************************************************/ - - TST_tpCondRet TST_NotificarFalha( char * pMensagem ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Incrementar contador de falhas -* -* $ED Descrição da função -* Esta função deve ser usada quando, por alguma razão, precisar-se -* utilizar TST_ExibirPrefixo para exibir uma mensagem de falha. -* As outras funções (comparação, TST_NotificarFalha, etc.) -* incrementam o contador automaticamente. -* -***********************************************************************/ - - void TST_ContarFalhas( ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter número de casos de teste efetuados -* -* $ED Descrição da função -* Retorna o número de casos de teste lidos. -* Cada caso de teste inicia com o comando "== ". -* -***********************************************************************/ - - int TST_ObterNumCasosTeste( ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter número de comandos específicos corretamente interpretados -* -* $ED Descrição da função -* Retorna o número de comandos de teste específicos lidos e -* corretamente interpretados. -* Não conta comandos que retornem não OK independentemento do motivo, -* inclusive os comandos saltados após uma falha. -* Também não conta comandos recuperar. -* -***********************************************************************/ - - int TST_ObterNumComandosExecutados( void ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter número de falhas encontradas -* -* $ED Descrição da função -* Retorna o número de falhas encontrados. -* O módulo de teste específico sinaliza falhas através de -* uma condição de retorno diferente de TST_CondRetOK. -* Além de comparações em erro, são tratados como falhas: -* - comandos de teste em erro, -* - comandos de teste de um dado caso de teste ignorados (saltados) -* - erros encontrados nos instrumentos -* - erros de sintaxe dos comandos de teste -* - qualquer chamada às funções TST_NotificarFalha, ou TST_ContarFalha. -* Portanto, é possível que o número de falhas venha a ser maior do -* que o número de casos de teste existente no script. -* -***********************************************************************/ - - int TST_ObterNumFalhas( void ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter origem do nome da extensão de arquivo -* -* $ED Descrição da função -* Procura o início do nome da extensão contido no nome do arquivo -* dado por parâmetro -* -* Evite o uso de nomes de arquivos com dois ou mais caracteres ".". -* Isto pode confundir no caso de se desejar a adição de algum nome -* de extensão padrão. -* -* $EP Parâmetros -* $P NomeArqParm - nome de arquivo a ser analisado -* -* $FV Valor retornado -* Ponteiro para o caractere '.' que separa a extensão. -* Será NULL caso o nome do arquivo não contenha extensão. -* -***********************************************************************/ - - char * TST_ObterInicioExtensao( char * NomeArqParm ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Obter ponteiro para arquivo LOG -* -* $ED Descrição da função -* Retorna o ponteiro para o FILE do log em uso no momento. -* Será stdout caso não seja definido explicitamente ao chamar a funcao -* TST_ControlarSessaoTeste -* -* $FV Valor retornado -* Ponteiro válido para um arquivo de texto de saída -* -***********************************************************************/ - - FILE * TST_ObterArqLog( void ) ; - - -/*********************************************************************** -* -* $FC Função: TSTG &Exibir um espaço qualquer em formato hexadecimal e char -* -* $ED Descrição da função -* Exibe o conteúdo de um espaço de tamEspaco bytes. A saída contém -* uma coluna em hexadecimal e outra em ASCII -* São exibidos 16 bytes por linha. -* -* $EP Parâmetros -* $P tamEspaco - tamanho em bytes do espaço a exibir -* $P Ponteiro - ponteiro para o primeiro byte do espaço a exibir -* -***********************************************************************/ - - void TST_ExibirEspacoHexa( int tamEspaco , - void * Ponteiro ) ; - -#undef GENERICO_EXT - -/********** Fim do módulo de definição: TSTG Controlador de teste genérico **********/ - -#else -#endif diff --git a/LERPARM.H b/LERPARM.H deleted file mode 100644 index f12cf3d..0000000 --- a/LERPARM.H +++ /dev/null @@ -1,463 +0,0 @@ -#if ! defined( LerParm_ ) -#define LerParm_ -/*************************************************************************** -* -* $MCD Módulo de definição: LER Ler parâmetros de comandos -* -* Arquivo gerado: LerParm.h -* Letras identificadoras: LER -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* Provê funções para a leitura e análise léxica dos comandos de teste. -* Pressupõe-se que cada comando de teste esteja integralmente em -* uma linha. -* Cada comando de teste inicia com o caractere '=' seguido de um string -* que identifica o comando. -* Cada comando pode requerer zero ou mais parâmetros que se encontram na -* mesma linha que o comando. -* Parâmetros podem ser literis ou simbólicos. -* Os parâmetros simbólicos precisam ser declarados antes de serem -* utilizados. -* Os parâmetros têm tipo e a leitura deve respeitar esses tipos. -* -* Se for do interesse do programador, módulos de teste específico -* podem ler e processar por conta própria linhas do script. Isto -* pode ser necessário quando um módulo necessita de um grande -* número de parâmetros ou de dados especiais. -* -* $EIU Interface com o usuário pessoa -* Este módulo interpreta os comandos de teste globalmente disponíveis: -* -* =declararparm -* declara o parâmetro do definido com o valor -* pode ser um de: -* i - inteiro (long) -* f - flutuante (double) -* c - caractere -* s - string -* O valor de literal tem que estar em conformidade com o tipo -* -* =exibirdeclaracao -* exibe a declaração do parâmetro em formato "dump de memória" -* -* Literais devem obedecer às regras léxicas utilizadas pela linguagem C. -* -* Estes comandos sempre estarão disponíveis. Os demais comandos de -* teste estão impementados no módulo TESTLER específico para este módulo. -* -***************************************************************************/ - -#if defined( LerParm_OWN ) - #define LerParm_EXT -#else - #define LerParm_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -#define LER_DIM_NOME 32 -#define LER_DIM_STRING 500 -#define LER_DIM_BUFFER 250 - - -/*********************************************************************** -* -* $TC Tipo de dados: LER Condições de retorno -* -* -***********************************************************************/ - - typedef enum { - - LER_CondRetOK , - /* Ler retorno OK */ - - LER_CondRetNaoAbriu - /* Ler não abriu arquivo */ - - } LER_tpCondRet ; - -/***** Dados exportados pelo módulo *****/ - - /* Estrutura de dados: *LER Dados globais públicos */ - - LerParm_EXT int LER_TamBuffer ; - /* Tamanho do string contido no buffer de leitura - * - *$ED Descrição - * Contém o número total de caracteres do buffer, excluindo o zero. - * Jamais altere este valor. */ - - LerParm_EXT int LER_InxBuffer ; - /* Cursor do buffer de leitura - * - *$ED Descrição - * O cursor de leitura indexa o primeiro caractere não lido contido - * no buffer. - * O cursor é zerado sempre que uma nova linha for lida. - * O cursor é avançado ao ler um parâmetro, sendo colocado no - * primeiro caractere imediatamente após ao parâmetro lido. - * Evite acessar caracteres quando LER_InxBuffer > LER_TamBuffer */ - - LerParm_EXT char LER_Buffer[ LER_DIM_BUFFER + 1 ] ; - /* Buffer de leitura - * - *$ED Descrição - * Contém a linha corrente do script a ser processada. - * Jamais altere o valor do buffer. */ - - -/*********************************************************************** -* -* $FC Função: LER &Inicializar módulo LerParm -* -* $ED Descrição da função -* Inicializa o módulo. -* Deve ser chamada antes de iniciar a análise de comandos. -* Deve ser chamada uma única vez no início ou após terminar o módulo. -* -***********************************************************************/ - - int LER_InicializarLeitura( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Terminar módulo LerParm -* -* $ED Descrição da função -* Fecha o arquivo de leitura e sinaliza módulo de leitura não -* inicializado. -* Após esta função somente poderá ser chamada a funçãp -* LER_InicializarLeitura -* -***********************************************************************/ - - void LER_TerminarLeitura( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Obter nome do arquivo script -* -* $FV Valor retornado -* Retorna o ponteiro para o nome do arquivo script sendo processado. -* Deve-se tomar cuidado para não alterar este nome. -* Será NULL se nãa tem arquivo aberto ou o módulo não está inicializado. -* -***********************************************************************/ - - char * LER_ObterNomeArqScript( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Obter número de linhas lidas até o momento -* -***********************************************************************/ - - int LER_ObterNumLinhas( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Abrir arquivo script de teste -* -* $ED Descrição da função -* Abre o arquivo que contém o script de teste. -* A extensão default do arquivo de comandos script de teste é -* ".script" e será acrescida ao nome do arquivo caso este não -* contenha nome de extensão. -* -* $EP Parâmetros -* $P NomeArqParm - nome do arquivo contendo o script de teste -* -* $FV Valor retornado -* LER_CondRetOK - caso tenha sido possível abrir o arquivo. -* LER_CondRetNaoAbriu - caso tenha ocorrido algum erro. -* Não há discriminação do erro encontrado. -* -***********************************************************************/ - - LER_tpCondRet LER_AbrirArquivoScript( char * NomeArqParm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler linha script eliminando brancos ao final -* -* $ED Descrição da função -* Lê uma linha do arquivo script e elimina os caracteres branco, -* fim de linha, tabulação etc. do final da linha lida. -* -* $FV Valor retornado -* Retorna o tamanho da linha lida. -* Será: -* -1 caso tenha ocorrido fim de arquivo. -* -2 caso tenha ocorrido algum problema de leitura. -* -***********************************************************************/ - - int LER_LerLinhaScript( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Interpretar comandos de teste -* -* $ED Descrição da função -* Interpreta os comandos de teste disponibilizados pelo módulo -* de leitura. -* -* Ver a descrição do módulo para mais detalhes -* -* $EP Parâmetros -* $P - Comando de teste a ser interpretado -* -* $FV Valor retornado -* TST_CondRetOK - caso tenha interpretado corretamente -* TST_CondRetNaoExecutou - caso o comando de teste a interpretar -* não pertença ao conjunto de LER -* TST_CondRetErro - caso o comando de teste é do conjunto de LER -* e está sintaticamente errado. -* Neste caso é gerada uma mensagem de erro no -* log. -* -***********************************************************************/ - - TST_tpCondRet LER_InterpretarComandos( char * ComandoTeste ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Declarar parâmetro simbólico -* -* $EP Parâmetros -* Interpreta uma linha de comando de teste contendo uma declaração de -* nome simbólico. -* Todas as declarações têm o formato: -* =declararparm -* em que o deve estar consistente com o -* São geradas mensagens de erro no log de teste caso a declaração -* não possa ser realizada. -* -* $FV Valor retornado -* TRUE - se a declaração ocorreu -* FALSE - caso contrário -* -***********************************************************************/ - - int LER_DeclararParametro( void ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Exibir declaração de símbolo -* -* $ED Descrição da função -* Exibe o Símbolo e o valor associado ao símbolo, sendo que este -* é exibido em hexadecimal. -* -***********************************************************************/ - - void LER_ExibirParametro( char * Simbolo ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler linha de parâmetros -* -* $ED Descrição da função -* Lê um número variável de parâmetros -* -* $EP Parâmetros -* $P Tipos é um string contendo a identificação dos tipos dos parâmetros -* a serem lidos. -* $P ... Os demais parâmetros são referências (ponteiros) para os -* espaços onde deverão ser armazenados os valores lidos. -* -* Tal como em scanf deve-se tomar o cuidado de assegurar que a lista -* de referência e o string de tipos tenha o mesmo tamanho -* e que os indicadores de tipo sejam consistentes com a referência -* posicionalmente correspondentes. -* -* Ao ler um campo, primeiro procura-se ler um nome de parâmetro já -* declarado. Caso isto seja possível e o tipo esteja correto -* é "lido" o valor contido no parâmetro. -* Caso não seja possível, tenta ler um literal em acordo com o tipo -* dado. -* -* Gera mensagens de erro para parâmetros desconhecidos, sintaxe errada -* e tipo inconsistente com o solicitado no correspondente caractere no -* string Tipos. -* -* $FV Valor retornado -* Retorna o número de campos lidos até concluir ou até encontrar -* um erro. -* -***********************************************************************/ - - int LER_LerParametros( char * Tipos , ... ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro caractere -* -* $EP Parâmetros -* $P Parm é um ponteiro para um caractere que receberá o valor lido -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do caractere lido -* -* $EIU Interface com usuário pessoa -* Um caractere deve vir entre aspas simples. Valem os caracteres de controle -* \n \r \t \a \v \f \\ \' \" \? e \0 -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmChar( char * Parm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro inteiro -* -* $EP Parâmetros -* $P Parm é um ponteiro para um int que receberá o valor lido -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do int lido -* -* $EIU Interface com usuário pessoa -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmInt( int * Parm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro flutuante -* -* $EP Parâmetros -* $P Parm é um ponteiro para um double que receberá o valor lido -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do double lido -* -* $EIU Interface com usuário pessoa -* São válidas todas as formas de literal double aceitas pelo scanf. -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmDouble( double * Parm ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro nome -* -* $EP Parâmetros -* $P Parm é um ponteiro para um caractere que receberá o nome lido -* $P tamString é o tamanho do nome que foi lido -* $P dimString é o tamanho máximo que o nome poderá ter, já -* descontado o zero final -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do nome lido -* -* $EIU Interface com usuário pessoa -* São válidas as mesmas regras de nomes C. -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmNome( char * Parm , int * tamNome , int dimNome ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Ler parâmetro string -* -* $EP Parâmetros -* $P Parm é um ponteiro para um caractere que receberá o string lido -* $P tamString é o tamanho do string que foi lido -* $P dimString é o tamanho máximo que o string poderá ter, já -* descontado o zero final -* -* $FV Valor retornado -* TRUE - se leu -* FALSE - se ocorreu algum erro -* -* $FGP Tipos e Variáveis globais externas do próprio módulo -* inxBuffer - é avançado para o primeiro caractere branco imediatamente -* a seguir do string lido -* -* $EIU Interface com usuário pessoa -* Um string deve vir entre aspas duplas. -* Um string pode conter caracteres de controle -* \n \r \t \a \v \f \\ \' \" \? e \0 -* -* São geradas mensagens de erro no log -* -***********************************************************************/ - - int LER_LerParmString( char * Parm , int * tamString , int dimString ) ; - - -/*********************************************************************** -* -* $FC Função: LER &Pular comando de teste -* -* $ED Descrição da função -* Avança o cursor do buffer de leitura por cima de um comando de teste. -* Todos os comandos de teste principiam com o prefixo '=' -* -***********************************************************************/ - - void LER_PularComando( void ) ; - -#undef LerParm_EXT - -/********** Fim do módulo de definição: LER Ler parâmetros de comandos **********/ - -#else -#endif diff --git a/LISTA.C b/LISTA.C deleted file mode 100644 index 2889ad9..0000000 --- a/LISTA.C +++ /dev/null @@ -1,560 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: LIS Lista duplamente encadeada -* -* Arquivo gerado: LISTA.c -* Letras identificadoras: LIS -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -***************************************************************************/ - -#include -#include -#include -#include -#include - -#define LISTA_OWN -#include "LISTA.h" -#undef LISTA_OWN - -/*********************************************************************** -* -* $TC Tipo de dados: LIS Elemento da lista -* -* -***********************************************************************/ - - typedef struct tagElemLista { - - void * pValor ; - /* Ponteiro para o valor contido no elemento */ - - struct tagElemLista * pAnt ; - /* Ponteiro para o elemento predecessor */ - - struct tagElemLista * pProx ; - /* Ponteiro para o elemento sucessor */ - - } tpElemLista ; - -/*********************************************************************** -* -* $TC Tipo de dados: LIS Descritor da cabeça de lista -* -* -***********************************************************************/ - - typedef struct LIS_tagLista { - - tpElemLista * pOrigemLista ; - /* Ponteiro para a origem da lista */ - - tpElemLista * pFimLista ; - /* Ponteiro para o final da lista */ - - tpElemLista * pElemCorr ; - /* Ponteiro para o elemento corrente da lista */ - - int numElem ; - /* Número de elementos da lista */ - - void ( * ExcluirValor ) ( void * pValor ) ; - /* Ponteiro para a função de destruição do valor contido em um elemento */ - - } LIS_tpLista ; - -/***** Protótipos das funções encapuladas no módulo *****/ - - static void LiberarElemento( LIS_tppLista pLista , - tpElemLista * pElem ) ; - - static tpElemLista * CriarElemento( LIS_tppLista pLista , - void * pValor ) ; - - static void LimparCabeca( LIS_tppLista pLista ) ; - -/***** Código das funções exportadas pelo módulo *****/ - -/*************************************************************************** -* -* Função: LIS &Criar lista -* ****/ - - LIS_tppLista LIS_CriarLista( - void ( * ExcluirValor ) ( void * pDado ) ) - { - - LIS_tpLista * pLista = NULL ; - - pLista = ( LIS_tpLista * ) malloc( sizeof( LIS_tpLista )) ; - if ( pLista == NULL ) - { - return NULL ; - } /* if */ - - LimparCabeca( pLista ) ; - - pLista->ExcluirValor = ExcluirValor ; - - return pLista ; - - } /* Fim função: LIS &Criar lista */ - -/*************************************************************************** -* -* Função: LIS &Destruir lista -* ****/ - - void LIS_DestruirLista( LIS_tppLista pLista ) - { - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - LIS_EsvaziarLista( pLista ) ; - - free( pLista ) ; - - } /* Fim função: LIS &Destruir lista */ - -/*************************************************************************** -* -* Função: LIS &Esvaziar lista -* ****/ - - void LIS_EsvaziarLista( LIS_tppLista pLista ) - { - - tpElemLista * pElem ; - tpElemLista * pProx ; - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - pElem = pLista->pOrigemLista ; - while ( pElem != NULL ) - { - pProx = pElem->pProx ; - LiberarElemento( pLista , pElem ) ; - pElem = pProx ; - } /* while */ - - LimparCabeca( pLista ) ; - - } /* Fim função: LIS &Esvaziar lista */ - -/*************************************************************************** -* -* Função: LIS &Inserir elemento antes -* ****/ - - LIS_tpCondRet LIS_InserirElementoAntes( LIS_tppLista pLista , - void * pValor ) - { - - tpElemLista * pElem ; - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - /* Criar elemento a inerir antes */ - - pElem = CriarElemento( pLista , pValor ) ; - if ( pElem == NULL ) - { - return LIS_CondRetFaltouMemoria ; - } /* if */ - - /* Encadear o elemento antes do elemento corrente */ - - if ( pLista->pElemCorr == NULL ) - { - pLista->pOrigemLista = pElem ; - pLista->pFimLista = pElem ; - } else - { - if ( pLista->pElemCorr->pAnt != NULL ) - { - pElem->pAnt = pLista->pElemCorr->pAnt ; - pLista->pElemCorr->pAnt->pProx = pElem ; - } else - { - pLista->pOrigemLista = pElem ; - } /* if */ - - pElem->pProx = pLista->pElemCorr ; - pLista->pElemCorr->pAnt = pElem ; - } /* if */ - - pLista->pElemCorr = pElem ; - - return LIS_CondRetOK ; - - } /* Fim função: LIS &Inserir elemento antes */ - -/*************************************************************************** -* -* Função: LIS &Inserir elemento após -* ****/ - - LIS_tpCondRet LIS_InserirElementoApos( LIS_tppLista pLista , - void * pValor ) - - { - - tpElemLista * pElem ; - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - /* Criar elemento a inerir após */ - - pElem = CriarElemento( pLista , pValor ) ; - if ( pElem == NULL ) - { - return LIS_CondRetFaltouMemoria ; - } /* if */ - - /* Encadear o elemento após o elemento */ - - if ( pLista->pElemCorr == NULL ) - { - pLista->pOrigemLista = pElem ; - pLista->pFimLista = pElem ; - } else - { - if ( pLista->pElemCorr->pProx != NULL ) - { - pElem->pProx = pLista->pElemCorr->pProx ; - pLista->pElemCorr->pProx->pAnt = pElem ; - } else - { - pLista->pFimLista = pElem ; - } /* if */ - - pElem->pAnt = pLista->pElemCorr ; - pLista->pElemCorr->pProx = pElem ; - - } /* if */ - - pLista->pElemCorr = pElem ; - - return LIS_CondRetOK ; - - } /* Fim função: LIS &Inserir elemento após */ - -/*************************************************************************** -* -* Função: LIS &Excluir elemento -* ****/ - - LIS_tpCondRet LIS_ExcluirElemento( LIS_tppLista pLista ) - { - - tpElemLista * pElem ; - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - if ( pLista->pElemCorr == NULL ) - { - return LIS_CondRetListaVazia ; - } /* if */ - - pElem = pLista->pElemCorr ; - - /* Desencadeia à esquerda */ - - if ( pElem->pAnt != NULL ) - { - pElem->pAnt->pProx = pElem->pProx ; - pLista->pElemCorr = pElem->pAnt ; - } else { - pLista->pElemCorr = pElem->pProx ; - pLista->pOrigemLista = pLista->pElemCorr ; - } /* if */ - - /* Desencadeia à direita */ - - if ( pElem->pProx != NULL ) - { - pElem->pProx->pAnt = pElem->pAnt ; - } else - { - pLista->pFimLista = pElem->pAnt ; - } /* if */ - - LiberarElemento( pLista , pElem ) ; - - return LIS_CondRetOK ; - - } /* Fim função: LIS &Excluir elemento */ - -/*************************************************************************** -* -* Função: LIS &Obter referência para o valor contido no elemento -* ****/ - - void * LIS_ObterValor( LIS_tppLista pLista ) - { - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - if ( pLista->pElemCorr == NULL ) - { - return NULL ; - } /* if */ - - return pLista->pElemCorr->pValor ; - - } /* Fim função: LIS &Obter referência para o valor contido no elemento */ - -/*************************************************************************** -* -* Função: LIS &Ir para o elemento inicial -* ****/ - - void IrInicioLista( LIS_tppLista pLista ) - { - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - pLista->pElemCorr = pLista->pOrigemLista ; - - } /* Fim função: LIS &Ir para o elemento inicial */ - -/*************************************************************************** -* -* Função: LIS &Ir para o elemento final -* ****/ - - void IrFinalLista( LIS_tppLista pLista ) - { - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - pLista->pElemCorr = pLista->pFimLista ; - - } /* Fim função: LIS &Ir para o elemento final */ - -/*************************************************************************** -* -* Função: LIS &Avançar elemento -* ****/ - - LIS_tpCondRet LIS_AvancarElementoCorrente( LIS_tppLista pLista , - int numElem ) - { - - int i ; - - tpElemLista * pElem ; - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - /* Tratar lista vazia */ - - if ( pLista->pElemCorr == NULL ) - { - - return LIS_CondRetListaVazia ; - - } /* fim ativa: Tratar lista vazia */ - - /* Tratar avançar para frente */ - - if ( numElem > 0 ) - { - - pElem = pLista->pElemCorr ; - for( i = numElem ; i > 0 ; i-- ) - { - if ( pElem == NULL ) - { - break ; - } /* if */ - pElem = pElem->pProx ; - } /* for */ - - if ( pElem != NULL ) - { - pLista->pElemCorr = pElem ; - return LIS_CondRetOK ; - } /* if */ - - pLista->pElemCorr = pLista->pFimLista ; - return LIS_CondRetFimLista ; - - } /* fim ativa: Tratar avançar para frente */ - - /* Tratar avançar para trás */ - - else if ( numElem < 0 ) - { - - pElem = pLista->pElemCorr ; - for( i = numElem ; i < 0 ; i++ ) - { - if ( pElem == NULL ) - { - break ; - } /* if */ - pElem = pElem->pAnt ; - } /* for */ - - if ( pElem != NULL ) - { - pLista->pElemCorr = pElem ; - return LIS_CondRetOK ; - } /* if */ - - pLista->pElemCorr = pLista->pOrigemLista ; - return LIS_CondRetFimLista ; - - } /* fim ativa: Tratar avançar para trás */ - - /* Tratar não avançar */ - - return LIS_CondRetOK ; - - } /* Fim função: LIS &Avançar elemento */ - -/*************************************************************************** -* -* Função: LIS &Procurar elemento contendo valor -* ****/ - - LIS_tpCondRet LIS_ProcurarValor( LIS_tppLista pLista , - void * pValor ) - { - - tpElemLista * pElem ; - - #ifdef _DEBUG - assert( pLista != NULL ) ; - #endif - - if ( pLista->pElemCorr == NULL ) - { - return LIS_CondRetListaVazia ; - } /* if */ - - for ( pElem = pLista->pElemCorr ; - pElem != NULL ; - pElem = pElem->pProx ) - { - if ( pElem->pValor == pValor ) - { - pLista->pElemCorr = pElem ; - return LIS_CondRetOK ; - } /* if */ - } /* for */ - - return LIS_CondRetNaoAchou ; - - } /* Fim função: LIS &Procurar elemento contendo valor */ - - -/***** Código das funções encapsuladas no módulo *****/ - - -/*********************************************************************** -* -* $FC Função: LIS -Liberar elemento da lista -* -* $ED Descrição da função -* Elimina os espaços apontados pelo valor do elemento e o -* próprio elemento. -* -***********************************************************************/ - - void LiberarElemento( LIS_tppLista pLista , - tpElemLista * pElem ) - { - - if ( ( pLista->ExcluirValor != NULL ) - && ( pElem->pValor != NULL )) - { - pLista->ExcluirValor( pElem->pValor ) ; - } /* if */ - - free( pElem ) ; - - pLista->numElem-- ; - - } /* Fim função: LIS -Liberar elemento da lista */ - - -/*********************************************************************** -* -* $FC Função: LIS -Criar o elemento -* -***********************************************************************/ - - tpElemLista * CriarElemento( LIS_tppLista pLista , - void * pValor ) - { - - tpElemLista * pElem ; - - pElem = ( tpElemLista * ) malloc( sizeof( tpElemLista )) ; - if ( pElem == NULL ) - { - return NULL ; - } /* if */ - - pElem->pValor = pValor ; - pElem->pAnt = NULL ; - pElem->pProx = NULL ; - - pLista->numElem ++ ; - - return pElem ; - - } /* Fim função: LIS -Criar o elemento */ - - -/*********************************************************************** -* -* $FC Função: LIS -Limpar a cabeça da lista -* -***********************************************************************/ - - void LimparCabeca( LIS_tppLista pLista ) - { - - pLista->pOrigemLista = NULL ; - pLista->pFimLista = NULL ; - pLista->pElemCorr = NULL ; - pLista->numElem = 0 ; - - } /* Fim função: LIS -Limpar a cabeça da lista */ - -/********** Fim do módulo de implementação: LIS Lista duplamente encadeada **********/ - diff --git a/LISTA.H b/LISTA.H deleted file mode 100644 index a9f9b84..0000000 --- a/LISTA.H +++ /dev/null @@ -1,346 +0,0 @@ -#if ! defined( LISTA_ ) -#define LISTA_ -/*************************************************************************** -* -* $MCD Módulo de definição: LIS Lista duplamente encadeada -* -* Arquivo gerado: LISTA.h -* Letras identificadoras: LIS -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: D:\AUTOTEST\PROJETOS\LISTA.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* Implementa listas genéricas duplamente encadeadas. -* Podem existir n listas em operação simultaneamente. -* As listas possuem uma cabeça encapsulando o seu estado. -* -* Cada lista é homogênea quanto ao tipo dos dados que armazena. -* Cada elemento da lista referencia o valor que contém. -* -* Os ponteiros para os dados são copiados para elementos da lista. -* Não é copiado o valor apontado por estes ponteiros. -* -* O controle da destruição do valor de um elemento a ser excluído -* é realizado por uma função fornecida pelo usuário. -* -* Cada lista referencia uma função que determina como devem ser -* desalocados os dados nela contidos. -* -* A função de liberação dos valores contidos nos elementos deve -* assegurar a liberação de todos os espaços referênciados pelo -* valor contido em um elemento. -* Esta função é chamada antes de se desalocar um elemento -* de uma lista. -* Caso não seja necessário desalocar o valor referenciado pelo -* elemento, o ponteiro para a função de liberação poderá ser NULL . -* Caso o elemento da lista seja a única âncora do valor referenciado, -* esta função deve promover a destruição (free) desse valor e -* de todos os dados nele ancorados. -* -***************************************************************************/ - -#if defined( LISTA_OWN ) - #define LISTA_EXT -#else - #define LISTA_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -/* Tipo referência para uma lista */ - -typedef struct LIS_tagLista * LIS_tppLista ; - - -/*********************************************************************** -* -* $TC Tipo de dados: LIS Condições de retorno -* -* -* $ED Descrição do tipo -* Condições de retorno das funções da lista -* -***********************************************************************/ - - typedef enum { - - LIS_CondRetOK , - /* Concluiu corretamente */ - - LIS_CondRetListaVazia , - /* A lista não contém elementos */ - - LIS_CondRetFimLista , - /* Foi atingido o fim de lista */ - - LIS_CondRetNaoAchou , - /* Não encontrou o valor procurado */ - - LIS_CondRetFaltouMemoria - /* Faltou memória ao tentar criar um elemento de lista */ - - } LIS_tpCondRet ; - - -/*********************************************************************** -* -* $FC Função: LIS &Criar lista -* -* $ED Descrição da função -* Cria uma lista genérica duplamente encadeada. -* Os possíveis tipos são desconhecidos a priori. -* A tipagem é implicita. -* Não existe identificador de tipo associado à lista. -* -* $EP Parâmetros -* ExcluirValor - ponteiro para a função que processa a -* exclusão do valor referenciado pelo elemento -* a ser excluído. -* Ver descrição do módulo. -* -* $FV Valor retornado -* Se executou corretamente retorna o ponteiro para a lista. -* Este ponteiro será utilizado pelas funções que manipulem esta lista. -* -* Se ocorreu algum erro, por exemplo falta de memória ou dados errados, -* a função retornará NULL. -* Não será dada mais informação quanto ao problema ocorrido. -* -***********************************************************************/ - - LIS_tppLista LIS_CriarLista( - void ( * ExcluirValor ) ( void * pDado ) ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Destruir lista -* -* $ED Descrição da função -* Destrói a lista fornecida. -* O parâmetro ponteiro para a lista não é modificado. -* Se ocorrer algum erro durante a destruição, a lista resultará -* estruturalmente incorreta. -* OBS. não existe previsão para possíveis falhas de execução. -* -* $FV Valor retornado -* LIS_CondRetOK - destruiu sem problemas -* -***********************************************************************/ - - void LIS_DestruirLista( LIS_tppLista pLista ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Esvaziar lista -* -* $ED Descrição da função -* Elimina todos os elementos, sem contudo eliminar a lista -* -* $EP Parâmetros -* pLista - ponteiro para a lista a ser esvaziada -* -***********************************************************************/ - - void LIS_EsvaziarLista( LIS_tppLista pLista ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Inserir elemento antes -* -* $ED Descrição da função -* Insere novo elemento antes do elemento corrente. -* Caso a lista esteja vazia, insere o primeiro elemento da lista. -* -* $EP Parâmetros -* pLista - ponteiro para a lista onde deve ser inserido o elemento -* pValor - ponteiro para o valor do novo elemento -* Pode ser NULL -* -* $FV Valor retornado -* LIS_CondRetOK -* LIS_CondRetFaltouMemoria -* -***********************************************************************/ - - LIS_tpCondRet LIS_InserirElementoAntes( LIS_tppLista pLista , - void * pValor ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Inserir elemento após -* -* $ED Descrição da função -* Insere novo elemento apás o elemento corrente. -* Caso a lista esteja vazia, insere o primeiro elemento da lista. -* -* $EP Parâmetros -* Parâmetros -* pLista - ponteiro para a lista onde deve ser inserido o elemento -* pValor - ponteiro para o valor do novo elemento -* Pode ser NULL -* -* -* $FV Valor retornado -* Valor retornado -* LIS_CondRetOK -* LIS_CondRetFaltouMemoria -* -***********************************************************************/ - - LIS_tpCondRet LIS_InserirElementoApos( LIS_tppLista pLista , - void * pValor ) - ; - - -/*********************************************************************** -* -* $FC Função: LIS &Excluir elemento -* -* $ED Descrição da função -* Exclui o elemento corrente da lista dada. -* Se existir o elemento aa esquerda do corrente será o novo corrente. -* Se não existir e existir o elemento à direita, este se tornará corrente. -* Se este também não existir a lista tornou-se vazia. -* -* $EP Parâmetros -* pLista - ponteiro para a lista na qual deve excluir. -* -* $FV Valor retornado -* LIS_CondRetOK -* LIS_CondRetListaVazia -* -***********************************************************************/ - - LIS_tpCondRet LIS_ExcluirElemento( LIS_tppLista pLista ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Obter referência para o valor contido no elemento -* -* $ED Descrição da função -* Obtem a referência para o valor contido no elemento corrente da lista -* -* $EP Parâmetros -* pLista - ponteiro para a lista de onde se quer o valor -* -* $FV Valor retornado -* não NULL - se o elemento corrente existe -* NULL - se a lista estiver vazia -* Pode retornar NULL se o valor inserido no elemento for NULL. -* -***********************************************************************/ - - void * LIS_ObterValor( LIS_tppLista pLista ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Ir para o elemento inicial -* -* $ED Descrição da função -* Torna corrente o primeiro elemento da lista. -* Faz nada se a lista está vazia. -* -* $EP Parâmetros -* pLista - ponteiro para a lista a manipular -* -***********************************************************************/ - - void IrInicioLista( LIS_tppLista pLista ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Ir para o elemento final -* -* $ED Descrição da função -* Torna corrente o elemento final da lista. -* Faz nada se a lista está vazia. -* -* $EP Parâmetros -* pLista - ponteiro para a lista a manipular -* -***********************************************************************/ - - void IrFinalLista( LIS_tppLista pLista ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Avançar elemento -* -* $ED Descrição da função -* Avança o elemento corrente numElem elementos na lista -* Se numElem for positivo avança em direção ao final -* Se numElem for negativo avança em direção ao início -* numElem pode ser maior do que o númro de elementos existentes na -* direção desejada -* Se numElem for zero somente verifica se a lista está vazia -* -* $EP Parâmetros -* pLista - ponteiro para a lista a ser manipulada -* numElem - o número de elementos a andar -* -* $FV Valor retornado -* CondRetOK - se numElem elementos tiverem sido andados -* CondRetFimLista - se encontrou o fim da lista antes de andar numElem -* elementos -* CondRetListaVazia - se a lista está vazia -* -***********************************************************************/ - - LIS_tpCondRet LIS_AvancarElementoCorrente( LIS_tppLista pLista , - int numElem ) ; - - -/*********************************************************************** -* -* $FC Função: LIS &Procurar elemento contendo valor -* -* $ED Descrição da função -* Procura o elemento que referencia o valor dado. -* A função compara ponteiro e não conteúdo apontado. -* -* $EP Parâmetros -* pLista - ponteiro para a lista onde procura -* pValor - ponteiro para o valor procurado -* Pode ser NULL -* -* $FV Valor retornado -* LIS_CondRetOK - se encontrou. -* O elemento corrente é o primeiro elemento do -* elemento corrente inclusive para o fim da lista -* e que contém o ponteiro procurado -* -* LIS_CondRetNaoEncontrou - se o ponteiro não foi encontrado -* O elemento corrente continua o mesmo -* LIS_CondRetListaVazia - se a lista estiver vazia -* -***********************************************************************/ - - LIS_tpCondRet LIS_ProcurarValor( LIS_tppLista pLista , - void * pValor ) ; - -#undef LISTA_EXT - -/********** Fim do módulo de definição: LIS Lista duplamente encadeada **********/ - -#else -#endif diff --git a/PECA.C b/PECA.C deleted file mode 100644 index bf24f92..0000000 --- a/PECA.C +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: PEC Estrutura Peca -* -* Arquivo gerado: PECA.C -* Letras identificadoras: PEC -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: fvc - Felipe Vieira Côrtes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.0 tbm 14/set/2015 Início do desenvolvimento -* -***************************************************************************/ - - -#include -#include -#include - -#define PECA_OWN -#include "PECA.h" -#undef PECA_OWN - -/*********************************************************************** -* -* $TC Tipo de dados: PECPnt Descritor do dados de ponto. -* -* $ED Descrição do tipo -* Descreve a estrutura de peça -***********************************************************************/ - -typedef struct tgPeca{ - char cor; -} tpPeca; - - -/***** Dados encapsulados no módulo *****/ - -// vazio - -/***** Código das funções exportadas pelo módulo *****/ - -/*************************************************************************** -* -* Função: Pec Criar Peça -* ****/ - -Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado, char CorDaNovaPeca) -{ - *PecCriado= (tppPeca)malloc(sizeof(struct tgPeca)); - - if(PecCriado == NULL) - return Pec_CondRetFaltouMemoria; - - (*PecCriado)->cor = CorDaNovaPeca; - - return Pec_CondRetOK; -} - -/*************************************************************************** -* -* Função: PEC Destruir Peça -* ****/ - -Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca) -{ - - free(Peca); - return Pec_CondRetOK; -} - -/*************************************************************************** -* -* Função: PEC Obter Cor -* ****/ - -Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor) -{ - *cor = Peca->cor; - return Pec_CondRetOK; -} - -/*********** Fim do módulo de implementação: Módulo DadoPontos **************/ diff --git a/PECA.h b/PECA.h deleted file mode 100644 index 2458e5e..0000000 --- a/PECA.h +++ /dev/null @@ -1,97 +0,0 @@ -/*************************************************************************** -* -* $MCD Módulo de definição: Módulo Peça -* -* Arquivo gerado: PECA.H -* Letras identificadoras: PEC -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: fvc - Felipe Vieira Côrtes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão - -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 1.00 tbm 14/09/2015 Início do desenvolvimento -* -* $ED Descrição do módulo -* Este módulo implementa um conjunto simples de funções para manipular a peça -* alem de descrever sua estrutura. -* -***************************************************************************/ - -#if defined( PECA_OWN ) - #define PECA_EXT -#else - #define PECA_EXT extern -#endif - -typedef struct tgPeca * tppPeca; - -/*********************************************************************** -* -* $TC Tipo de dados: MAT Condicoes de retorno -* -* -***********************************************************************/ - - typedef enum { - - Pec_CondRetOK = 0 , - /* Executou correto */ - - Pec_CondRetErro = 1 , - /* Estrutura do DadoPontos está errada */ - - Pec_CondRetMatrizNaoExiste = 2 , - /* DadoPontos não existe */ - - Pec_CondRetFaltouMemoria = 3 - /* Faltou memória ao alocar dados */ - - } Pec_tpCondRet ; - -/*********************************************************************** -* -* $FC Função: PEC Criar Peça -* -* $ED Descrição da função -* Cria uma nova peça -* $FV Valor retonado -* Pec_CondRetOK -* Pec_CondRetFaltouMemoria -* -***********************************************************************/ - - Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado1, char CorDaNovaPeca); - -/*********************************************************************** -* -* $FC Função: PEC Destruir Peça -* -* $ED Descrição da função -* Destroi uma peça -* $FV Valor retonado -* Pec_CondRetOK -* Pec_CondRetFaltouMemoria -* -***********************************************************************/ - - Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); - -/*********************************************************************** -* -* $FC Função: PEC Obter Cor -* -* $ED Descrição da função -* Obtem cor de uma peca -* $FV Valor retonado -* Pec_CondRetOK -* Pec_CondRetFaltouMemoria -* -***********************************************************************/ -Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); \ No newline at end of file diff --git a/TABULEIRO.C b/TABULEIRO.C deleted file mode 100644 index a1c0b5f..0000000 --- a/TABULEIRO.C +++ /dev/null @@ -1,211 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: TAB Tabuleiro de Gamão -* -* Arquivo gerado: TABULEIRO.C -* Letras identificadoras: TAB -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: fvc - Felipe Vieira Cortes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 2 fvc, tbm 23/set/2015 término do deselvolvimento -* 1 fvc, tbm 21/set/2015 início desenvolvimento - -***************************************************************************/ - -#include -#include -#include -#include -#include - -#define TABULEIRO_OWN -#include "LISTA.H" -#include "GENERICO.H" -#include "PECA.h" -#include "TABULEIRO.H" - -#undef TABULEIRO_OWN - -/*********************************************************************** -* -* $TC Tipo de dados: TAB Tabuleiro -* -* -***********************************************************************/ - -typedef struct TAB_tagTabuleiro { - - LIS_tppLista Casas; - -} TAB_tpTabuleiro; - - -/***** Código das funções exportadas pelo módulo *****/ - -/*************************************************************************** -* -* Função: TAB &Criar Tabuleiro -* ****/ - -TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, - void ( * ExcluirValor ) ( void * pDado ) ) -{ - LIS_tppLista vtCasa[24]; // vetor de casas auxiliar - tppPeca vtPecaB[15]; // vetor de peças brancas - tppPeca vtPecaP[15]; //vetor de peças pretas - int i, jb = 0,jp = 0; - - *pTab = (TAB_tppTabuleiro)malloc(sizeof(TAB_tpTabuleiro)); - (*pTab)->Casas = LIS_CriarLista(ExcluirValor); - - /* Cria 15 peças brancas */ - for(i = 0; i < 15; i++) - if(Pec_CriarPeca(&vtPecaB[i], 'b')!=Pec_CondRetOK) - return TAB_CondRetErro; - /* Cria 15 peças pretas */ - for(i = 0; i < 15; i++) - if(Pec_CriarPeca(&vtPecaP[i], 'p')!=Pec_CondRetOK) - return TAB_CondRetErro; - /* Cria 24 listas que representam cada casa do tabuleiro*/ - for(i = 0; i < 24; i++) - vtCasa[i] = LIS_CriarLista(ExcluirValor); - - // Pretas - LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; - LIS_InserirElementoApos(vtCasa[23], vtPecaP[jp]); jp++; - // Brancas - LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; - LIS_InserirElementoApos(vtCasa[0], vtPecaB[jb]); jb++; - for(i = 0; i < 5; i++) - { - // Pretas - LIS_InserirElementoApos(vtCasa[5], vtPecaP[jp]); jp++; - LIS_InserirElementoApos(vtCasa[12], vtPecaP[jp]); jp++; - // Brancas - LIS_InserirElementoApos(vtCasa[11], vtPecaB[jb]); jb++; - LIS_InserirElementoApos(vtCasa[18], vtPecaB[jb]); jb++; - } - for(i = 0; i < 3; i++) - { - // Pretas - LIS_InserirElementoApos(vtCasa[7], vtPecaP[jp]); jp++; - // Brancas - LIS_InserirElementoApos(vtCasa[16], vtPecaB[jb]); jb++; - } - // Alocar as 24 casas na lista do tabuleiro - for(i = 0; i < 24; i++) - LIS_InserirElementoApos((*pTab)->Casas, vtCasa[i]); - - return TAB_CondRetOK; -} - -/*************************************************************************** -* -* Função: TAB &Destruir Tabuleiro -* ****/ - -TAB_tpCondRet TAB_DestruirTabuleiro (TAB_tppTabuleiro pTab) -{ - - LIS_DestruirLista(pTab->Casas); - // Libera o ponteiro para o tabuleiro - free(pTab); - - return TAB_CondRetOK; -} - -/*************************************************************************** -* -* Função: TAB &Mover Peças tabuleiro -* ****/ - -TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) -{ - tppPeca pecatemp1, pecatemp2; - char cor; - LIS_tppLista listatemp; - int mov = casaDestino - casaOrigem; - - // Checa a validade das casas de origem e destino - if((casaOrigem < 0) || (casaOrigem > 23)) - { - printf("casaOrigem inválida \n"); - return TAB_CondRetErro; - } - if((casaDestino < 0) || (casaDestino > 23)) - { - printf("casaDestino inválida \n"); - return TAB_CondRetErro; - } - - // Ir para a casa de origem - IrInicioLista(pTab->Casas); - LIS_AvancarElementoCorrente(pTab->Casas, casaOrigem); - - // Obter referência para a lista nela armazenada - listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - - // Obter a cor da peca na lista temp - pecatemp1 = (tppPeca)LIS_ObterValor(listatemp); - - // se pecatemp1 == NULL entao a lista está vazia - if(pecatemp1 == NULL) - { - printf("casa de origem esta vazia \n"); - return TAB_CondRetErro; - } - else // se nao - { - Pec_ObterCor(pecatemp1, &cor); - } - - // Excluir uma peça da lista temp - if(LIS_ExcluirElemento(listatemp) != LIS_CondRetOK) - { - printf("Erro ao excluir peca da casa de orgiem\n"); - return TAB_CondRetErro; - } - - // Avança para a casa destino. - LIS_AvancarElementoCorrente(pTab->Casas, mov); - - // Obtem a referencia para a lista nela armazenada - listatemp = (LIS_tppLista)LIS_ObterValor(pTab->Casas); - - // Criar uma peça com a mesma cor q a peça antiga - if(Pec_CriarPeca(&pecatemp2, cor) != Pec_CondRetOK) - { - printf("Erro ao criar a peca na casa destino \n"); - return TAB_CondRetErro; - } - - // Adiciona esta peça na casa de destino - if(LIS_InserirElementoApos(listatemp, pecatemp2) != LIS_CondRetOK) - { - printf("Erro ao adicionar peca na casa destino \n"); - return TAB_CondRetErro; - } - - return TAB_CondRetOK; -} - - - - - - - - - - - - - - diff --git a/TABULEIRO.H b/TABULEIRO.H deleted file mode 100644 index ec7371c..0000000 --- a/TABULEIRO.H +++ /dev/null @@ -1,131 +0,0 @@ -#if ! defined( TABULEIRO_ ) -#define TABULEIRO_ -/*************************************************************************** -* -* $MCD Módulo de definição: TAB Tabuleiro de Gamão -* -* Arquivo gerado: TABULEIRO.H -* Letras identificadoras: TAB -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: fvc - tbm -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 2 fvc, tbm 23/set/2015 Ajustes e Término do desenvolvimento -* 1 fvc 21/set/2015 início desenvolvimento -* -* $ED Descrição do módulo -* O módulo implementa um simples tabuleiro de gamão -* e permite que peças sejam movimentadas pelo tabuleiro -* sem nenhuma restrição nem regras do gamão. -* -***************************************************************************/ - -#if defined( TABULEIRO_OWN ) - #define TABULEIRO_EXT -#else - #define TABULEIRO_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -/* Tipo referência para uma lista */ - -typedef struct TAB_tagTabuleiro * TAB_tppTabuleiro; - - -/*********************************************************************** -* -* $TC Tipo de dados: TAB Condições de retorno -* -* -* $ED Descrição do tipo -* Condições de retorno das funções do Tabuleiro -* -***********************************************************************/ - - typedef enum { - - TAB_CondRetOK , - /* Concluiu corretamente */ - TAB_CondRetErro, - - TAB_CondRetFaltouMemoria, - - } TAB_tpCondRet ; - - - - -/*********************************************************************** -* -* $FC Função: TAB &Criar Tabuleiro -* -* $ED Descrição da função -* Cria um tabuleiro inicializado com as peças -* pretas e brancas no lugar correto como no início -* de um jogo de gamão -* -* $EP Parâmetros -* ExcluirValor - ponteiro para a função que processa a -* exclusão do valor referenciado pelo elemento -* a ser excluído. -* -* $FV Valor retornado -* Se executou corretamente retorna TAB_CondRetOK -* -* Se ocorreu algum erro, por exemplo falta de memória ou dados errados, -* a função retornará TAB_CondRetErro -* -***********************************************************************/ - - TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, - void ( * ExcluirValor ) ( void * pDado ) ) ; - - -/*********************************************************************** -* -* $FC Função: TAB &Destruir Tabuleiro -* -* $ED Descrição da função -* Destrói o Tabuleiro dado -* -* $FV Valor retornado -* TAB_CondRetOK - destruiu sem problemas -* -***********************************************************************/ - - TAB_tpCondRet TAB_DestruirTabuleiro( TAB_tppTabuleiro pTab ) ; - - -/*********************************************************************** -* -* $FC Função: TAB &Mover Peça do Tabuleiro -* -* $ED Descrição da função -* Move a peça da casa de origem para a casa de destino. -* As casas variam de 0 a 23. -* -* $FV Valor retornado -* TAB_CondRetOK - Moveu sem problemas -* TAB_CondRetErro - Nao moveu a peça -* -***********************************************************************/ - - TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; - -/***********************************************************************/ - - - -#undef TABULEIRO_EXT - -/********** Fim do módulo de definição: TAB Tabuleiro de Gamão **********/ - -#else -#endif \ No newline at end of file diff --git a/TESTDADO.c b/TESTDADO.c deleted file mode 100644 index 316f85d..0000000 --- a/TESTDADO.c +++ /dev/null @@ -1,97 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: Módulo de teste específico -* -* Arquivo gerado: TESTDADO.C -* Letras identificadoras: TDADO -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: fvc - Felipe Vieira Cortes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações - 1.00 fvc 14/09/2015 Início e término do deselvolvimento -* -* $ED Descrição do módulo -* Este módulo contém as funções específicas para o teste do -* módulo Dados, que gera um número aleatório de 1 a 6 -* -* $EIU Interface com o usuário pessoa -* Comandos de teste específicos para testar o módulo Matriz: -* -* =jogardado chama a função DAD_tpCondRet DAD_NumPular(int* NumPular) e retorna um valor inteiro de 1 a 6 e imprime na tela -***************************************************************************/ - -#include -#include -#include - -#include "TST_ESPC.H" - -#include "generico.h" -#include "lerparm.h" -#include "DADO.H" - - -/* Tabela dos nomes dos comandos de teste específicos */ - -#define JOGAR_DADO_CMD "=jogardado" - -/***** Código das funções exportadas pelo módulo *****/ - - -/*********************************************************************** -* -* $FC Função: TDADO Efetuar operações de teste específicas para um dado de 6 faces -* -* $ED Descrição da função -* Efetua os diversos comandos de teste específicos para o módulo -* Matriz sendo testado. -* -* $EP Parâmetros -* $P ComandoTeste - String contendo o comando -* -* $FV Valor retornado -* Ver TST_tpCondRet definido em TST_ESPC.H -* -***********************************************************************/ - - TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) - { - - int CondRetObtido = DAD_CondRetOK ; - int CondRetEsperada = DAD_CondRetFaltouMemoria ; - /* inicializa para qualquer coisa */ - - char ValorEsperado = '?' ; - char ValorObtido = '!' ; - char ValorDado = '\0' ; - - int NumLidos = -1 ; - int i = 0; - int valorDado; - /* Testar DADO Jogar Dado */ - - if ( strcmp( ComandoTeste , JOGAR_DADO_CMD ) == 0 ) - { - - if ( NumLidos != -1 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = DAD_NumPular(&valorDado) ; - - printf(" \n dado: %d\n", valorDado); - - return TST_CondRetOK; - - } /* fim ativa: Testar DADO Jogar Dado */ - - return TST_CondRetNaoConhec ; - - } /* Fim função: TDADO Efetuar operações de teste específicas para um dado de 6 faces*/ \ No newline at end of file diff --git a/TESTDADOPONTOS.c b/TESTDADOPONTOS.c deleted file mode 100644 index 138d65e..0000000 --- a/TESTDADOPONTOS.c +++ /dev/null @@ -1,208 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: Módulo de teste específico - -* Módulo modificado para operar matrizes que armazenam listas! -* -* Arquivo gerado: TESTDADOPONTOS.C -* Letras identificadoras: TDADPnt -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: - fvc - Felipe Vieira Cortes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão - -* $HA Histórico de evolução: -* Versão Autor Data Observações - 4.00 tbm 23/08/2015 Módulo modificado para operar dadospontos -* 3.00 avs 28/02/2003 Uniformização da interface das funções e -* de todas as condições de retorno. -* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação -* 1.00 avs 15/08/2001 Início do desenvolvimento -* -* $ED Descrição do módulo -* Este módulo contém as funções específicas para o teste do -* módulo Matriz. Ilustra como redigir um interpretador de comandos -* de teste específicos utilizando o arcabouço de teste para C. -* -* $EIU Interface com o usuário pessoa -* Comandos de teste específicos para testar o módulo Matriz: -* -* =criardadoponto - Chama a função DADPnt_tpCondRet DADPnt_CriarDado(tppDadoPontos * DadoCriado); -* =destruirdadoponto - Chama a função DADPnt_tpCondRet DADPnt_DestruirDado(tppDadoPontos Dado); -* =obtervalorjogo - Chama a função DADPnt_tpCondRet DADPnt_ValorPartida(tppDadoPontos Dado, int * valorjogo); -* =dobrardado - Chama a função DADPnt_tpCondRet DADPnt_DobrarDado(tppDadoPontos DadoDobrar, char CorNovoDono); -* =obterdono - B Chama a função DADPnt_tpCondRet DADPnt_ObterDono(tppDadoPontos Dado, char * corRecebida); -***************************************************************************/ - -#include -#include -#include - -#include "TST_ESPC.H" - -#include "GENERICO.H" -#include "lerparm.h" -#include "DADOPONTOS.h" - -/* Tabela dos nomes dos comandos de teste específicos */ -#define MAX 5 -#define CRIAR_DADOPONTOS_CMD "=criardadopontos" -#define DESTRUIR_DADOPONTOS_CMD "=destruirdadoponto" -#define OBTER_VALORPARTIDA_CMD "=obtervalorpartida" -#define DOBRAR_DADO_CMD "=dobrardado" -#define OBTER_DONO_CMD "=obterdono" - - -tppDadoPontos DadoPnt; -/***** Código das funções exportadas pelo módulo *****/ - -/*********************************************************************** -* -* $FC Função: TDADPnt Efetuar operações de teste específicas para o Modulo DadoPontos -* -* $ED Descrição da função -* Efetua os diversos comandos de teste específicos para o módulo -* DadoPontos sendo testado. -* -* $EP Parâmetros -* $P ComandoTeste - String contendo o comando -* -* $FV Valor retornado -* Ver TST_tpCondRet definido em TST_ESPC.H -* -***********************************************************************/ - - TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) - { - - int CondRetObtido = DADPnt_CondRetOK ; - int CondRetEsperada = DADPnt_CondRetFaltouMemoria ; - /* inicializa para qualquer coisa */ - - char ValorEsperado = '?' ; - char ValorObtido = '!' ; - char ValorDado = '\0' ; - char corEsperada = 'x'; - - int NumLidos = -1 ; - int i = 0; - int ValorPontos,valoresperado; - char corRecebida; - - TST_tpCondRet Ret; - - /* Testar TDADPnt &Criar Dado Pontos */ - if ( strcmp( ComandoTeste , CRIAR_DADOPONTOS_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "i" , - &CondRetEsperada ) ; - if ( NumLidos != 1) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = DADPnt_CriarDado(&DadoPnt); - - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar ao criar dadopontos." ); - - } - /* fim ativa: Testar Criar Dado Pontos */ - - /* Testar TDADPnt &Destruir DadoPontos */ - else if ( strcmp( ComandoTeste , DESTRUIR_DADOPONTOS_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "i" , - &CondRetEsperada ) ; - if ( NumLidos != 1 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = DADPnt_DestruirDado(DadoPnt) ; - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao destruir o dadopontos." ); - - } - /* fim ativa: Testar DadoPontos Destruir*/ - - /* Testar TDADPnt &Obter Dono do DadoPonto */ - else if ( strcmp( ComandoTeste , OBTER_DONO_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "ci" , - &corEsperada ,&CondRetEsperada ) ; - if ( NumLidos != 2 ) - { - return TST_CondRetParm ; - } /* if */ - CondRetObtido = DADPnt_ObterDono(DadoPnt,&corRecebida) ; - - Ret = TST_CompararChar( corRecebida , corEsperada , - "Cor do jogador errado, diferente do esperado" ) ; - - if ( Ret != TST_CondRetOK ) - { - return Ret ; - } /* if */ - - return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o dono do dado"); - - } - /* fim ativa: Testar Obter Dono do DadoPonto*/ - - /* Testar TDADPnt &Dadoponto DobrarDado */ - else if ( strcmp( ComandoTeste , DOBRAR_DADO_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "ci" , - &corEsperada, &CondRetEsperada ) ; - if ( NumLidos != 2 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = DADPnt_DobrarDado(DadoPnt, corEsperada ); - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao dobrar o valor do dadopontos." ); - - } /* fim ativa: Fim Dobrar Dado */ - - /* Testar TDADPnt &Dadoponto Obter Valor */ - else if ( strcmp( ComandoTeste , OBTER_VALORPARTIDA_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "ii" , - &valoresperado, &CondRetEsperada ) ; - if ( NumLidos != 2 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = DADPnt_ValorPartida(DadoPnt,&ValorPontos); - - Ret = TST_CompararInt( valoresperado , ValorPontos , " Valor da Partida Errado" ) ; - - if ( Ret != TST_CondRetOK ) - { - return Ret ; - } - - return TST_CompararInt( CondRetObtido, CondRetEsperada , - "Retorno errado ao obter valor do dado pontos." ); - - } /* fim ativa: Fim Dobrar Dado */ - - - return TST_CondRetNaoConhec ; - - } /* Fim função: TDADPnt Efetuar operações de teste específicas para DadoPonto */ \ No newline at end of file diff --git a/TESTPECA.C b/TESTPECA.C deleted file mode 100644 index 26cd1af..0000000 --- a/TESTPECA.C +++ /dev/null @@ -1,156 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: Módulo de teste específico - -* Módulo modificado para operar matrizes que armazenam listas! -* -* Arquivo gerado: TESTPECA.C -* Letras identificadoras: TPec -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: fvc - Felipe Vieira Cortes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações - 4.00 fvc 23/08/2015 Módulo modificado para operar matrizes -* 3.00 avs 28/02/2003 Uniformização da interface das funções e -* de todas as condições de retorno. -* 2.00 avs 03/08/2002 Eliminação de código duplicado, reestruturação -* 1.00 avs 15/08/2001 Início do desenvolvimento -* -* $ED Descrição do módulo -* Este módulo contém as funções específicas para o teste do -* módulo Peca. -* -* $EIU Interface com o usuário pessoa -* Comandos de teste específicos para testar o módulo Matriz: -* -* =criarpeca - Chama a função Pec_tpCondRet Pec_CriarPeca(tppPeca * PecCriado); -* =destruirpeca - Chama a função Pec_tpCondRet Pec_DestruirPeca(tppPeca Peca); -* =obtercorpeca - Chama a função Pec_tpCondRet Pec_ObterCor(tppPeca Peca, char *cor); -***************************************************************************/ - -#include -#include -#include - -#include "TST_ESPC.H" - -#include "generico.h" -#include "lerparm.h" -#include "PECA.h" - - -/* Tabela dos nomes dos comandos de teste específicos */ -#define MAX 5 -#define CRIAR_PECA_CMD "=criarpeca" -#define DESTRUIR_PECA_CMD "=destruirpeca" -#define OBTER_COR_CMD "=obtercorpeca" - -tppPeca P[MAX]; -/***** Código das funções exportadas pelo módulo *****/ - - -/*********************************************************************** -* -* $FC Função: TPec Efetuar operações de teste específicas para o Modulo Peca -* -* $ED Descrição da função -* Efetua os diversos comandos de teste específicos para o módulo -* Peca sendo testado. -* -* $EP Parâmetros -* $P ComandoTeste - String contendo o comando -* -* $FV Valor retornado -* Ver TST_tpCondRet definido em TST_ESPC.H -* -***********************************************************************/ - - TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) - { - - int CondRetObtido = Pec_CondRetOK ; - int CondRetEsperada = Pec_CondRetFaltouMemoria ; - /* inicializa para qualquer coisa */ - - char ValorEsperado = '?' ; - char ValorObtido = '!' ; - char ValorDado = '\0' ; - char corEsperada = 'x'; - - int NumLidos = -1 ; - int i = 0; - char corRecebida; - int inxpec; - - TST_tpCondRet Ret; - - /* Testar Pec Criar Peca */ - if ( strcmp( ComandoTeste , CRIAR_PECA_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "ici" , - &inxpec, &corRecebida, &CondRetEsperada ) ; - if ( NumLidos != 3 ) - { - return TST_CondRetParm ; - } /* if */ - - if(inxpec > 5 || inxpec < 0) return TST_CondRetErro; - - CondRetObtido = Pec_CriarPeca(&P[inxpec], corRecebida); - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar a peca." ); - - } /* fim ativa: Testar Pec Criar Peca */ - - /* Testar Pec Destruir Peca */ - else if ( strcmp( ComandoTeste , DESTRUIR_PECA_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "ii" , - &inxpec, &CondRetEsperada ) ; - if ( NumLidos != 2 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = Pec_DestruirPeca(P[inxpec]) ; - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao destruir a peca." ); - - } /* fim ativa: Testar Pec Destruir Peca */ - - /* Testar Pec Obter cor da Peca */ - else if ( strcmp( ComandoTeste , OBTER_COR_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "ici" , - &inxpec,&corEsperada, &CondRetEsperada ) ; - if ( NumLidos != 3 ) - { - return TST_CondRetParm ; - } /* if */ - CondRetObtido = Pec_ObterCor(P[inxpec], &corRecebida) ; - - Ret = TST_CompararChar( corRecebida , corEsperada , - "Valor do elemento errado, diferente do esperado" ) ; - - if ( Ret != TST_CondRetOK ) - { - return Ret ; - } /* if */ - - return TST_CompararChar(CondRetObtido, CondRetEsperada, "Retorno errado ao obter o valor da peca"); - - } /* fim ativa: Testar Pec Obter cor da Peca */ - return TST_CondRetNaoConhec ; - - } /* Fim função: TPec Efetuar operações de teste específicas para Peca */ \ No newline at end of file diff --git a/TESTTABULEIRO.C b/TESTTABULEIRO.C deleted file mode 100644 index 80b8a8c..0000000 --- a/TESTTABULEIRO.C +++ /dev/null @@ -1,154 +0,0 @@ -/*************************************************************************** -* $MCI Módulo de implementação: TAB Tabuleiro de Gamão -* -* Arquivo gerado: TABULEIRO.C -* Letras identificadoras: TTAB -* -* Nome da base de software: Exemplo de teste automatizado -* -* Projeto: Disciplinas INF 1628 / 1301 -* Gestor: DI/PUC-Rio -* Autores: fvc - Felipe Vieira Cortes -* tbm - Tássio Borges de Miranda -* db - Daniela Brazão -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 2 fvc, tbm 23/set/2015 término do deselvolvimento -* 1 fvc, tbm 21/set/2015 início desenvolvimento -* -* $ED Descrição do módulo -* Este módulo contém as funções específicas para o teste do -* módulo Matriz. Ilustra como redigir um interpretador de comandos -* de teste específicos utilizando o arcabouço de teste para C. -* -* $EIU Interface com o usuário pessoa -* Comandos de teste específicos para testar o módulo Matriz: -* -* =criartabuleiro - Chama a função TAB_tpCondRet TAB_CriarTabuleiro(TAB_tppTabuleiro * pTab, void ( * ExcluirValor ) ( void * pDado ) ) ; -* =destruirtabuleiro - Chama a função TAB_tpCondRet TAB_DestruirTabuleiro( TAB_tppTabuleiro pTab ); -* =moverpeca - Chama a função TAB_tpCondRet TAB_MoverPeca( TAB_tppTabuleiro pTab, int casaOrigem, int casaDestino ) ; -***************************************************************************/ - -#include -#include -#include -#include "TST_ESPC.H" -#include "GENERICO.h" -#include "lerparm.h" - -#include "TABULEIRO.H" - -/* Tabela dos nomes dos comandos de teste específicos */ -#define CRIAR_TABULEIRO_CMD "=criartabuleiro" -#define DESTRUIR_TABULEIRO_CMD "=destruirtabuleiro" -#define MOVER_PECA_CMD "=moverpeca" - -TAB_tppTabuleiro Tab; - -/***** Protótipos das funções encapuladas no módulo *****/ - - static void DestruirValor( void * pValor ) ; - -/***** Código das funções exportadas pelo módulo *****/ - - -/*********************************************************************** -* -* $FC Função: TTAB Efetuar operações de teste específicas para o Modulo Tabuleiro -* -* $ED Descrição da função -* Efetua os diversos comandos de teste específicos para o módulo -* de Tabuleiro de gamão. -* -* $EP Parâmetros -* $P ComandoTeste - String contendo o comando -* -* $FV Valor retornado -* Ver TST_tpCondRet definido em TST_ESPC.H -* -***********************************************************************/ - - TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) - { - - int CondRetObtido = TAB_CondRetOK ; - int CondRetEsperada = TAB_CondRetFaltouMemoria ; - /* inicializa para qualquer coisa */ - char ValorEsperado = '?' ; - char ValorObtido = '!' ; - char ValorDado = '\0' ; - char corEsperada = 'x'; - - int NumLidos = -1 ; - int i = 0; - int PosicaoReferencia, PosicaoFinal; - - /* Testar Criar Tabuleiro */ - if ( strcmp( ComandoTeste , CRIAR_TABULEIRO_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "i" , - &CondRetEsperada ) ; - if ( NumLidos != 1 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = TAB_CriarTabuleiro(&Tab, DestruirValor); - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao criar o tabuleiro." ); - - } /* fim ativa: Testar Criar Tabuleiro */ - - /* Testar Destruir Tabuleiro*/ - else if ( strcmp( ComandoTeste , DESTRUIR_TABULEIRO_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "i" , - &CondRetEsperada ) ; - if ( NumLidos != 1 ) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = TAB_DestruirTabuleiro(Tab) ; - - return TST_CompararInt( CondRetEsperada , CondRetObtido , - "Retorno errado ao destruir o tabuleiro" ); - - } /* fim ativa: Testar destruir tabuleiro */ - - /* Testar Tabuleiro Mover Peca*/ - else if ( strcmp( ComandoTeste , MOVER_PECA_CMD ) == 0 ) - { - - NumLidos = LER_LerParametros( "iii" , - &PosicaoReferencia,&PosicaoFinal , &CondRetEsperada ) ; - if ( NumLidos != 3) - { - return TST_CondRetParm ; - } /* if */ - - CondRetObtido = TAB_MoverPeca(Tab, PosicaoReferencia, PosicaoFinal ) ; - - return TST_CompararInt(CondRetObtido, CondRetEsperada, "Retorno errado ao mover a peca"); - - } /* fim ativa: Testar Tabuleiro Mover Peca */ - return TST_CondRetNaoConhec ; - - } /* Fim função: Tab Efetuar operações de teste específicas para Tabuleiro */ - - /*********************************************************************** -* -* $FC Função: TTAB -Destruir valor -* -***********************************************************************/ - -void DestruirValor( void * pValor ) - { - - free( pValor ) ; - - } /* Fim função: TTAB-Destruir valor */ \ No newline at end of file diff --git a/TST_ESPC.H b/TST_ESPC.H deleted file mode 100644 index 987ff8e..0000000 --- a/TST_ESPC.H +++ /dev/null @@ -1,320 +0,0 @@ -#if ! defined( Tst_Espc_ ) -#define Tst_Espc_ -/*************************************************************************** -* -* $MCD Módulo de definição: TSTE Interface de teste específico -* -* Arquivo gerado: Tst_Espc.h -* -* Nome da base de software: Arcabouço para a automação de testes de programas redigidos em C -* Arquivo da base de software: C:\AUTOTEST\PROJETOS\ARCABOUC.BSW -* -* Projeto: INF 1301 / 1628 Automatização dos testes de módulos C -* Gestor: LES/DI/PUC-Rio -* Autores: avs -* -* $HA Histórico de evolução: -* Versão Autor Data Observações -* 4 avs 01/fev/2006 criar linguagem script simbólica -* 3 avs 08/dez/2004 uniformização dos exemplos -* 2 avs 07/jul/2003 unificação de todos os módulos em um só projeto -* 1 avs 16/abr/2003 início desenvolvimento -* -* $ED Descrição do módulo -* Este módulo consta somente do módulo de definição de todos os módulos -* de teste específicos a serem desenvolvidos, e também da especificação -* do tipo de condições de retorno deste módulo. -* -* Ele estabelece a interface a ser utilizada pelo módulo de teste -* genérico com todos os módulos de teste específico a serem -* desenvolvidos. -* -* Os módulos de teste específico devem sempre incluir este módulo -* de definição e, idealmente, não devem adicionar mais itens -* à interface. -* -* O módulo de teste específico contém a função de teste de um -* determinado módulo ou conjunto de módulos. Mais especificamente, -* contém a função que interpreta os comandos de teste que exercitarão -* as funções do(s) módulo(s) em teste. -* -* Poderá conter também diversas funções auxiliares requeridas para -* realizar os testes, vide "contexto" a seguir. -* -* O contexto é formado por variáveis e estruturas auxiliares necessárias -* para que se possa efetuar todos os comandos de teste. -* Por exemplo pode-se desejar testar várias instâncias de uma -* mesma estrutura. Uma forma de resolver isto é criar um vetor -* global static -* de n elementos em que cada elemento aponta para a cabeça de -* uma determinada instância dessa estrutura. Para realizar um -* teste relativo a uma determinada instância, torna-se necessário -* selecioná-la através de um índice contido no comando de teste. -* Este parâmetro, embora seja um índice, é na realidade o identificador -* da instância da estrutura a ser manipulada (idEstrutura). -* -* Caso o módulo em teste requeira um contexto, este deverá ser -* estabelecido no presente módulo. Para tal devem ser declaradas -* variáveis e estruturas encapsuladas e devem ser incluídos comandos -* de teste capazes de manipular o contexto. -* -* Uma das formas para estabelecer o contexto seria a de incluir -* no mçodulo de teste específico comando semelhantes a: -* -* =iniciaXXX que inicializa o contexto do módulo sob teste para -* vazio. Este comando deve ser utilizado uma única vez -* logo ao inciar a execução do teste. -* =reset restaura o contexto para vazio. Este comando usualmente -* assumirá que o contexto a esvaziar esteja correto. -* O comando deverá liberar os espaços alocados aos -* elementos, anular as referências a ele, inicializar -* valores de vetores de referências, etc. -* O comando tem utilidade especial ao segmentar um teste -* em partes estanques e ao controlar vazamento de -* memória. -* =terminaXXX este comando destrói todo o contexto e não o -* reinicializa. O objetivo é poder verificar vazamento -* de memória. -* -* Evidentemente, outra forma seria a de alterar as funções de -* inicialização e término do módulo de teste genérico o que é pouco -* recomendável pois viola o princípio de um mesmo módulo genérico -* servir para testar todos os construtos. -* -* Para cada função do módulo a ser testado deve existir pelo menos -* um comando de teste. Em alguns casos pode ser interessante criar -* comandos que armazenem, alterem ou consultem variáveis de -* estado do próprio módulo de teste. Ver os comentários sobre -* contexto acima. Ou seja, podem existir comandos de teste que -* têm o propósito de agir sobre o contexto e, não, o de efetuar -* um determinado teste. Alguns desses comandos podem inclusive -* realizar verificações entre um resultado esperado e existente -* no contexto. -* -* Todos os controles de consistência dos parâmetros dos comandos -* de teste devem ser realizados no módulo de teste específico. -* Recomenda-se que seja sempre retornado TST_CondRetParm, -* sinalizando erro de sintaxe do comando de teste ou valores -* não permitidos. Deve ser sempre assumido que os parâmetros -* podem estar em erro. Ou seja, o controle da integridade dos -* comando é mandatória. -* -* Caso seja necessário emitir mensagens especiais, -* deve ser utilizada a função genérica "TST_ExibirPrefixo". -* Caso seja desejado acrescentar um texto a alguma mensagem já exibida, -* (prefixo, ou comparar), utilize a função -* fprintf( TST_ObterArqLog( ) , "..." , ... ) -* na qual não deve ocorrer avanço de linha ou nova linha ("\n" ou "\r") -* no parâmetro indicador de formato (2o. parâmetro). Essa comvenção -* assegura a consistência do aspecto das mensagens com o restante do -* programa de teste. -* -* Cada comando deve ser completamente interpretado pelo seu -* respectivo fragmento de interpretação. Ou seja, não deverá ser -* retornado para o módulo genérico qualquer dado adicional à -* condição de retorno da função de teste específico. Veja -* "TST_ExibirPrefixo" acima, caso seja desejado adicionar detalhes -* à mensagen já exibida. -* -* A função TST_NotificarFalha sempre registra uma falha, enquanto que -* a função TST_ExibirPrefixo pode ser usada para emitir mensagens -* de informação ou mesmo de advertência. Caso a função TST_ExibirPrefixo -* seja utilizada para sinalizar uma falha, é necessário chamar -* também a função TST_ContarFalha( ) para que seja notificada a falha. -* Isto não é necessário no caso da função TST_NotificarFalha, pois -* esta sempre conta falhas. -* -* As funções a testar que retornem um valor sempre devem ter -* este valor verificado, mesmo que seja uma condição de retorno. -* Utilize para isto uma das funções " Comparar" do arcabouço. -* Caso uma função retorne dois ou mais valores, incluindo -* a condição de retorno, utilize um código semelhante ao -* descrito a seguir. -* -* Seja -* FuncATestar( p1, p2, p3 ... ) => v1, v2, ... -* a função a ser testada e, v1, v2, ... os dados retornados de -* alguma forma (valor retornado, parâmetro por referência, variável -* global). Assumindo que v1 seja o valor retornado. -* -* v1Obtido = FuncATestar( ... -* CondRet = TST_CompararXXX( v1Obtido , v1Esperado , "mensagem 1" ) ; -* if ( CondRet != TST_CondRetOK ) -* { -* return CondRet ; -* } -* -* CondRet = TST_CompararXXX( v2Obtido , v2Esperado , "mensagem 2" ) ; -* if ( CondRet != TST_CondRetOK ) -* { -* return CondRet ; -* } -* ... -* -* TST_CompararXXX( vnObtido , vnEsperado , "mensagem n" ) ; -* -***************************************************************************/ - -#if defined( Tst_Espc_OWN ) - #define Tst_Espc_EXT -#else - #define Tst_Espc_EXT extern -#endif - -/***** Declarações exportadas pelo módulo *****/ - -#define SINALIZA_ERRO ">>>" -#define SINALIZA_RECUPERA "<<<" -#define SINALIZA_COMENTARIO "!!!" - - -/*********************************************************************** -* -* $TC Tipo de dados: TST Cond ret módulo de teste específico -* -* -* $ED Descrição do tipo -* Este tipo enumera todas as condições de retorno que podem ser -* geradas pela função de teste específica. -* -***********************************************************************/ - - typedef enum { - - TST_CondRetOK , - /* Comando de teste executou corretamente */ - - TST_CondRetErro , - /* Comando de teste encontrou uma ou mais falhas - * - *$ED Descrição - * Esta condição sinaliza que um ou mais resultados da execução - * da função sob teste resultou em um valor diferente do esperado. */ - - TST_CondRetParm , - /* Comando de teste está com a sintaxe em erro - * - *$ED Descrição - * A presente condição de retorno deve ser retornada caso a sintaxe - * ou os valores do comando de teste estiverem em erro. - * - * Todos os fragmentos de interpretação devem: - * - realizar a análise dos parâmetros do comando - * - verificar se todos os parâmetros foram lidos - * - verificar se os valores dos parâmetros estão corretos - * por exemplo: verificar se os índices de acesso a elementos - * estão dentro dos limites dos correspondentes vetores. - * - efetuar a função a testar - * - verificar se os resultados retornados por esta função estão - * corretos */ - - TST_CondRetNaoExecutou , - /* Comando de teste não se destina ao presente interpretador - * - *$ED Descrição - * Esta condição deve ser retornada por todas as funções de interpretação - * de comandos de teste relativas a módulos do próprio arcabouço, - * caso não tenha sido encontrado um comando válido. Isso permite - * estabelecer um "daisy chain" de interpretadores em que cada qual - * tenha finalidade específica no contexto do arcabouço. */ - - TST_CondRetNaoConhec , - /* Comando de teste não é conhecido - * - *$ED Descrição - * Esta condição deve ser retornada por todas as funções de interpretação - * de casos de teste específico visando determinado módulo em teste, - * sempre que esse interpretador não consiga identificar o comando. - * - * Cabe salientar a diferença entre TST_CondRetNaoExecutou e - * TST_CondRetNaoConhec. A primeira corresponde à não interpretação - * de um comando possivelmente válido em interpretadores subsequentes. - * A segunda corresponde a comandos não válidos considerando todos - * os interpretadores. */ - - TST_CondRetNaoImplementado , - /* Comando de teste não implementado - * - *$ED Descrição - * Esta condição deve ser retornada ao interpretar um comando de teste - * específico ainda não implementado. - * - * Recomenda-se que o desenvolvimento dos módulos sob teste e do - * correpondente módulo de teste específico se dê incrementalmente. - * Consequentemente diversos comandos não estarão implementados - * no início do desenvolvimento. Esta incompleteza poderá ser - * sinalizada com esta condição de retorno. */ - - TST_CondRetMemoria - /* Faltou memória para executar o comando - * - *$ED Descrição - * Esta condição deve ser retornada caso tenha ocorrido algum erro - * quando o módulo de teste específico tentar alocar memória ou - * outro recurso. */ - - } TST_tpCondRet ; - - -/*********************************************************************** -* -* $FC Função: TSTE &Efetuar comandos de teste específicos -* -* $ED Descrição da função -* Efetua os diversos comandos de teste específicos para o módulo -* sendo testado. -* -* Cada módulo de teste específico deve desenvolver esta função. -* Poderá conter diversas outras conforme necessário. No entanto -* estas devem todas ser funções encapsuladas no módulo (static) -* -* Freqüentemente é necessário desenvolver um contexto para o teste. -* Por exemplo, pode ser necessário tratar n elementos disponibilizados -* pelo módulo sob teste. Neste caso deveria ser criado um vetor -* global com referências para estas elemento. Ao iniciar os teste -* este vetor deverá ser inicializado. Ao terminar, os elementos do -* vetor referenciando algum elemento devem ser destruídos. -* -* Todos os controles de consistência devem ser realizados no -* módulo de teste específico. -* -* A função TST_EfetuarComando( ) deve retornar as condições de retorno -* identificadas no tipo TST_tpCondRet. -* -* As funções do módulo sob teste que retornam algum valor sempre -* devem sempre ter este valor verificado, mesmo sendo uma condição de -* retorno. Para fazer a vereficação da corretude, recomenda-se -* utilizar as funções TST_CompararXXX definidas no módulo genérico. -* Assegura-se assim a uniformidade da saída gerada durante o teste. -* -* Para realizar a análise de um comando de teste recomenda-se -* utilizar as funções definidas no módulo LerParm. Elas, além -* de realizarem a análise léxica, permitem o uso intercambiável -* de parâmetros simbólicos ou literais. Também realizam a -* verificação da corretude dos tipos dos parâmetros, contribuindo -* assim para a redução de erros de redação de scripts de teste -* que possam passar despercebidos. -* -* As funções a serem testadas que requeiram algum argumento, devem -* ser chamadas com valores (parâmetros) extraídos do comando de -* teste sendo executado. Use sempre as funções do módulo LerParm -* para realizar a análise sintática. -* -* $EP Parâmetros -* $P ComandoTeste - String contendo o comando -* -* $FV Valor retornado -* TST_CondRetXXX - veja a descriÓcão dos possíveis valores -* retornados na especificação do correspondente -* enum -* -***********************************************************************/ - - TST_tpCondRet TST_EfetuarComando( char * ComandoTeste ) ; - -#undef Tst_Espc_EXT - -/********** Fim do módulo de definição: TSTE Interface de teste específico **********/ - -#else -#endif From c47f46003e68ebb601f5d2b7a5d19ad8186829c5 Mon Sep 17 00:00:00 2001 From: Felipe-Visgou Date: Tue, 29 Sep 2015 01:22:47 -0300 Subject: [PATCH 18/18] ready to send --- Arquitetura do Programa.pdf | Bin 18523 -> 0 bytes Dado/logtestedado.txt | 10 +++++----- INF1301_Escopo do Trabalho.pdf | Bin 0 -> 410903 bytes LEIA-ME.txt | 4 ++++ peca/TRAB2-2.exe => "Pe\303\247a/TRAB2-2.exe" | Bin .../logtestepeca.txt" | 0 .../source peca/ArcaboucoTeste.lib" | Bin .../source peca/GENERICO.H" | 0 .../source peca/LERPARM.H" | 0 .../PECA.C => "Pe\303\247a/source peca/PECA.C" | 0 .../PECA.h => "Pe\303\247a/source peca/PECA.h" | 0 .../source peca/TESTPECA.C" | 0 .../source peca/TST_ESPC.H" | 0 .../testepeca.bat" | 0 .../testepecascript.script" | 0 RELATORIO-Daniela.txt | 8 ++++++++ RELATORIO-Tassio.txt | 9 +++++++++ 17 files changed, 26 insertions(+), 5 deletions(-) delete mode 100644 Arquitetura do Programa.pdf create mode 100644 INF1301_Escopo do Trabalho.pdf rename peca/TRAB2-2.exe => "Pe\303\247a/TRAB2-2.exe" (100%) rename peca/logtestepeca.txt => "Pe\303\247a/logtestepeca.txt" (100%) rename peca/source peca/ArcaboucoTeste.lib => "Pe\303\247a/source peca/ArcaboucoTeste.lib" (100%) rename peca/source peca/GENERICO.H => "Pe\303\247a/source peca/GENERICO.H" (100%) rename peca/source peca/LERPARM.H => "Pe\303\247a/source peca/LERPARM.H" (100%) rename peca/source peca/PECA.C => "Pe\303\247a/source peca/PECA.C" (100%) rename peca/source peca/PECA.h => "Pe\303\247a/source peca/PECA.h" (100%) rename peca/source peca/TESTPECA.C => "Pe\303\247a/source peca/TESTPECA.C" (100%) rename peca/source peca/TST_ESPC.H => "Pe\303\247a/source peca/TST_ESPC.H" (100%) rename peca/testepeca.bat => "Pe\303\247a/testepeca.bat" (100%) rename peca/testepecascript.script => "Pe\303\247a/testepecascript.script" (100%) create mode 100644 RELATORIO-Daniela.txt create mode 100644 RELATORIO-Tassio.txt diff --git a/Arquitetura do Programa.pdf b/Arquitetura do Programa.pdf deleted file mode 100644 index 8c237d88736c59fbdff1ae7a8f7077f0f1dfb92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18523 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 diff --git a/Dado/logtestedado.txt b/Dado/logtestedado.txt index c0964c1..fbfbf49 100644 --- a/Dado/logtestedado.txt +++ b/Dado/logtestedado.txt @@ -18,19 +18,19 @@ LES - Laborat dado: 2 - dado: 6 + dado: 2 - dado: 6 + dado: 4 dado: 1 - dado: 6 + dado: 4 dado: 3 - dado: 4 - dado: 6 + + dado: 4 !!! Número de linhas lidas: 14 diff --git a/INF1301_Escopo do Trabalho.pdf b/INF1301_Escopo do Trabalho.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9cd7e3d539fc6068e99b428bd7b7fd458f05c994 GIT binary patch literal 410903 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�yzb+cfiXmi?q|`}9XyP1_Syx=Oin{iM{< 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%0AId{NNai2SXf--KmrZNW=j&!Bm0);l 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%0D@g@zL!oK>Z?+{I1i0#4MPT4oa`nT&!Q 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

o&v5TKE7idqiBX0N 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 x@#hu9$Cj3M)Cl0