diff --git a/.gitignore b/.gitignore index e65d5cda1aa281ba43fd4a04d15abba30e7ed518..fa8064d26b8b39df63b6425fa622cf5ae77e9920 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,9 @@ missing ylwrap ar-lib +# Make Check Rules +*.trs + # Doc rules *.pdf *.aux diff --git a/tests/Makefile.am b/tests/Makefile.am index bca08e4744dc397267097789ade2aa86d313e53c..f39bfd900727cd2c813d285d411b0ee04b46e52a 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,9 @@ MODFILES = \ + estimation/fs2000_mc4.mod \ + estimation/fs2000_mc4_mf.mod \ + estimation/fs2000_mc6.mod \ + estimation/fs2000_mc6_mf.mod \ + gsa/ls2003.mod \ ramst.mod \ ramst_a.mod \ example1.mod \ @@ -96,7 +101,6 @@ MODFILES = \ external_function/example1_no_deriv_functions_provided.mod \ external_function/example1_no_deriv_functions_provided_dll.mod \ seeds.mod \ - gsa/ls2003.mod \ identification/kim/kim2.mod \ identification/as2007/as2007.mod \ simul/example1.mod \ @@ -142,21 +146,72 @@ MODFILES = \ deterministic_simulations/rbc_det4.mod \ deterministic_simulations/rbc_det5.mod \ fs2000/fs2000_sd.mod \ - walsh.mod \ - estimation/fs2000_mc4.mod \ - estimation/fs2000_mc4_mf.mod \ - estimation/fs2000_mc6.mod \ - estimation/fs2000_mc6_mf.mod + walsh.mod + +# Dependencies +example1_use_dll.m.trs: example1.m.trs +example1_use_dll.o.trs: example1.o.trs + +k_order_perturbation/fs2000k_1_m.m.trs: k_order_perturbation/fs2000k2_m.m.trs +k_order_perturbation/fs2000k2_m.m.trs k_order_perturbation/fs2000k3_m.m.trs k_order_perturbation/fs2000k2_use_dll.m.trs k_order_perturbation/fs2000k3_use_dll.m.trs: k_order_perturbation/fs2000k2a.m.trs +k_order_perturbation/fs2000k_1_use_dll.m.trs: k_order_perturbation/fs2000k2_use_dll.m.trs +k_order_perturbation/fs2000k4.m.trs: k_order_perturbation/fs2000k++.m.trs + +k_order_perturbation/fs2000k_1_m.o.trs: k_order_perturbation/fs2000k2_m.o.trs +k_order_perturbation/fs2000k2_m.o.trs k_order_perturbation/fs2000k3_m.o.trs k_order_perturbation/fs2000k2_use_dll.o.trs k_order_perturbation/fs2000k3_use_dll.o.trs: k_order_perturbation/fs2000k2a.o.trs +k_order_perturbation/fs2000k_1_use_dll.o.trs: k_order_perturbation/fs2000k2_use_dll.o.trs +k_order_perturbation/fs2000k4.o.trs: k_order_perturbation/fs2000k++.o.trs + +kalman_filter_smoother/algo1.m.trs kalman_filter_smoother/algo3.m.trs kalman_filter_smoother/algo4a.m.trs kalman_filter_smoother/algo4b.m.trs kalman_filter_smoother/algoH1.m.trs kalman_filter_smoother/algoH3.m.trs kalman_filter_smoother/fs2000.m.trs kalman_filter_smoother/fs2000_1.m.trs kalman_filter_smoother/fs2000_2.m.trs kalman_filter_smoother/fs2000a.m.trs: kalman_filter_smoother/gen_data.m.trs +kalman_filter_smoother/algo1.o.trs kalman_filter_smoother/algo3.o.trs kalman_filter_smoother/algo4a.o.trs kalman_filter_smoother/algo4b.o.trs kalman_filter_smoother/algoH1.o.trs kalman_filter_smoother/algoH3.o.trs kalman_filter_smoother/fs2000.o.trs kalman_filter_smoother/fs2000_1.o.trs kalman_filter_smoother/fs2000_2.o.trs kalman_filter_smoother/fs2000a.o.trs: kalman_filter_smoother/gen_data.o.trs + +kalman_filter_smoother/algo2.m.trs: kalman_filter_smoother/algo1.m.trs +kalman_filter_smoother/algo2.o.trs: kalman_filter_smoother/algo1.o.trs + +kalman_filter_smoother/algoH2.m.trs: kalman_filter_smoother/algoH1.m.trs +kalman_filter_smoother/algoH2.o.trs: kalman_filter_smoother/algoH1.o.trs + +kalman_filter_smoother/algo4.m.trs: kalman_filter_smoother/algo3.m.trs +kalman_filter_smoother/algo4.o.trs: kalman_filter_smoother/algo3.o.trs + +optimal_policy/nk_ramsey_expectation_a.m.trs: optimal_policy/nk_ramsey_expectation.m.trs +optimal_policy/nk_ramsey_expectation_a.o.trs: optimal_policy/nk_ramsey_expectation.o.trs + +second_order/ds2.m.trs: second_order/ds1.m.trs +second_order/ds2.o.trs: second_order/ds1.o.trs + +AIM/fs2000_b1L1L_AIM.m.trs: AIM/fs2000_b1L1L.m.trs +AIM/fs2000x10L9_L_AIM.m.trs: AIM/fs2000x10L9_L.m.trs +AIM/fs2000x10_L9_L_AIM.m.trs: AIM/fs2000x10_L9_L.m.trs +AIM/ls2003_2L0L_AIM.m.trs: AIM/ls2003_2L0L.m.trs +AIM/ls2003_2L2L_AIM.m.trs: AIM/ls2003_2L2L.m.trs +AIM/fs2000_b1L1L_AIM.o.trs: AIM/fs2000_b1L1L.o.trs +AIM/fs2000x10L9_L_AIM.o.trs: AIM/fs2000x10L9_L.o.trs +AIM/fs2000x10_L9_L_AIM.o.trs: AIM/fs2000x10_L9_L.o.trs +AIM/ls2003_2L0L_AIM.o.trs: AIM/ls2003_2L0L.o.trs +AIM/ls2003_2L2L_AIM.o.trs: AIM/ls2003_2L2L.o.trs + +# Matlab TRS Files +MTRSFILES = $(patsubst %.mod, %.m.trs, $(MODFILES)) +MTRSFILES += run_block_byte_tests_matlab.m.trs + +# Octave TRS Files +OTRSFILES = $(patsubst %.mod, %.o.trs, $(MODFILES)) +OTRSFILES += run_block_byte_tests_octave.o.trs + EXTRA_DIST = \ + read_trs_files.sh \ + run_test_matlab.m \ + run_test_octave.m \ $(MODFILES) \ + run_block_byte_tests_matlab.m \ + run_block_byte_tests_octave.m \ homotopy/common.mod \ block_bytecode/ls2003.mod \ fs2000_ssfile_aux.m \ printMakeCheckMatlabErrMsg.m \ printMakeCheckOctaveErrMsg.m \ ramst_initval_file_data.m \ - run_test_matlab.m \ - run_test_octave.m \ test.m \ AIM/data_ca1.m \ AIM/fs2000_b1L1L_AIM_steadystate.m \ @@ -213,13 +268,44 @@ endif check-local: $(TARGETS) -check-matlab: - DYNARE_VERSION="$(PACKAGE_VERSION)" MODFILES="$(MODFILES)" $(MATLAB)/bin/matlab -nodesktop -nosplash -r run_test_matlab +if HAVE_OCTAVE + ./read_trs_files.sh "$(OTRSFILES)" +endif + +if HAVE_CMD_LINE_MATLAB + ./read_trs_files.sh "$(MTRSFILES)" +endif + @cat run_test_matlab_output.txt + @cat run_test_octave_output.txt + +check-matlab: $(MTRSFILES) + @echo 'Matlab Tests Done' + +check-octave: $(OTRSFILES) + @echo 'Octave Tests Done' -check-octave: - DYNARE_VERSION="$(PACKAGE_VERSION)" MODFILES="$(MODFILES)" $(OCTAVE) --no-init-file --silent --no-history run_test_octave.m +%.m.trs %.m.log: %.mod + DYNARE_VERSION="$(PACKAGE_VERSION)" TOP_TEST_DIR="$(PWD)" FILESTEM="$*" \ + $(MATLAB)/bin/matlab -nosplash -nodisplay -logfile $*.m.log -r run_test_matlab + +%.m.trs %.m.log : %.m + DYNARE_VERSION="$(PACKAGE_VERSION)" TOP_TEST_DIR="$(PWD)" \ + $(MATLAB)/bin/matlab -nosplash -nodisplay -logfile $*.m.log -r $* + +%.o.trs %.o.log: %.mod + DYNARE_VERSION="$(PACKAGE_VERSION)" TOP_TEST_DIR="$(PWD)" FILESTEM="$*" \ + $(OCTAVE) --no-init-file --silent --no-history run_test_octave.m > $*.o.log 2>&1 + +%.o.trs %.o.log : %.m + DYNARE_VERSION="$(PACKAGE_VERSION)" TOP_TEST_DIR="$(PWD)" \ + $(OCTAVE) --no-init-file --silent --no-history $< > $*.o.log 2>&1 clean-local: + rm -f $(MTRSFILES) \ + $(OTRSFILES) \ + $(patsubst %.trs, %.log, $(MTRSFILES)) \ + $(patsubst %.trs, %.log, $(OTRSFILES)) + rm -f $(patsubst %.mod, %.m, $(MODFILES)) \ $(patsubst %.mod, %_static.*, $(MODFILES)) \ $(patsubst %.mod, %_objective_static.m, $(MODFILES)) \ diff --git a/tests/read_trs_files.sh b/tests/read_trs_files.sh new file mode 100755 index 0000000000000000000000000000000000000000..b25ad9e777986e094e0e35a3c9246d0b182a18bd --- /dev/null +++ b/tests/read_trs_files.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +declare -i total=0; +declare -i failed=0; +declare -a failed_tests=(""); + +# Parse TRS Files +for file in $1 ; do + # Find number of tests run in trs file + ((total += `grep number-tests $file | cut -d: -f3`)) + + # Find number of tests failed in trs file + numfailed=`grep number-failed-tests $file | cut -d: -f3` + if [ $numfailed -ne 0 ] ; then + ((failed += $numfailed)) + for failedfile in `grep list-of-failed-tests $file | cut -d: -f3` ; do + failed_tests=("${failed_tests[@]}" "$failedfile"); + done + fi +done +((passed=$total-$failed)); + +# Determine if we are parsing Matlab or Octave trs files +if [ `grep -c '.m.trs' <<< $1` -eq 0 ]; then + prg='OCTAVE'; + outfile='run_test_octave_output.txt' +else + prg='MATLAB'; + outfile='run_test_matlab_output.txt' +fi + +# Print Output +echo '================================' > $outfile +echo 'DYNARE MAKE CHECK '$prg' RESULTS' >> $outfile +echo '================================' >> $outfile +echo '| TOTAL: '$total >> $outfile +echo '| PASS: '$passed >> $outfile +echo '| FAIL: '$failed >> $outfile +if [ $failed -gt 0 ] ; then + echo '| LIST OF FAILED TESTS:' >> $outfile + for file in ${failed_tests[@]} ; do + if [ "$prg" == "MATLAB" ]; then + modfile=`sed 's/\.m\.trs/\.mod/g' <<< $file` >> $outfile + else + modfile=`sed 's/\.o\.trs/\.mod/g' <<< $file` >> $outfile + fi + echo '| * '$modfile >> $outfile + done +fi +echo >> $outfile diff --git a/tests/run_block_byte_tests_matlab.m b/tests/run_block_byte_tests_matlab.m new file mode 100644 index 0000000000000000000000000000000000000000..144f6d9f09a8f04025281f6629d65725031e4252 --- /dev/null +++ b/tests/run_block_byte_tests_matlab.m @@ -0,0 +1,152 @@ +% Copyright (C) 2011-2012 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <http://www.gnu.org/licenses/>. + +% Implementation notes: +% +% Before every call to Dynare, the contents of the workspace is saved in +% 'wsMat.mat', and reloaded after Dynare has finished (this is necessary since +% Dynare does a 'clear -all'). Also note that we take care of clearing the +% 'exception' variable in all 'catch' block, because otherwise the next 'load +% wsMat' within a 'catch' block will overwrite the last exception. + +top_test_dir = getenv('TOP_TEST_DIR'); +addpath(top_test_dir); +addpath([top_test_dir filesep '..' filesep 'matlab']); + +% Test Dynare Version +if ~strcmp(dynare_version(), getenv('DYNARE_VERSION')) + error('Incorrect version of Dynare is being tested') +end + +% Test block_bytecode/ls2003.mod with various combinations of +% block/bytecode/solve_algo/stack_solve_algo +failedBlock = {}; +num_block_tests = 0; +cd([top_test_dir filesep 'block_bytecode']); +has_optimization_toolbox = user_has_matlab_license('optimization_toolbox'); +for blockFlag = 0:1 + for bytecodeFlag = 0:1 + default_solve_algo = 2; + default_stack_solve_algo = 0; + if ~blockFlag && ~bytecodeFlag + solve_algos = 1:4; + stack_solve_algos = [0 6]; + elseif blockFlag && ~bytecodeFlag + solve_algos = [1:4 6:8]; + stack_solve_algos = 0:4; + else + solve_algos = 1:8; + stack_solve_algos = 0:5; + end + if has_optimization_toolbox + solve_algos = [ solve_algos 0 ]; + end + + for i = 1:length(solve_algos) + num_block_tests = num_block_tests + 1; + if ~blockFlag && ~bytecodeFlag && (i == 1) + % This is the reference simulation path against which all + % other simulations will be tested + try + old_path = path; + save wsMat + run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) + load wsMat + path(old_path); + y_ref = oo_.endo_simul; + save('test.mat','y_ref'); + catch exception + load wsMat + path(old_path); + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + clear exception + end + else + try + old_path = path; + save wsMat + run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) + load wsMat + path(old_path); + % Test against the reference simulation path + load('test.mat','y_ref'); + diff = oo_.endo_simul - y_ref; + if(abs(diff) > options_.dynatol.x) + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + exception = MException('ERROR: simulation path differs from the reference path'); + printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + clear exception + end + catch exception + load wsMat + path(old_path); + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + clear exception + end + end + end + for i = 1:length(stack_solve_algos) + num_block_tests = num_block_tests + 1; + try + old_path = path; + save wsMat + run_ls2003(blockFlag, bytecodeFlag, default_solve_algo, stack_solve_algos(i)) + load wsMat + path(old_path); + % Test against the reference simulation path + load('test.mat','y_ref'); + diff = oo_.endo_simul - y_ref; + if(abs(diff) > options_.dynatol.x) + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')']; + exception = MException('ERROR: simulation path difers from the reference path'); + printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')'], exception); + clear exception + end + catch exception + load wsMat + path(old_path); + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + clear exception + end + end + end +end +delete('wsMat.mat') +cd(getenv('TOP_TEST_DIR')); +fid = fopen('run_block_byte_tests_matlab.m.trs', 'w+'); +if size(failedBlock,2) > 0 + fprintf(fid,':test-result: FAIL\n'); + fprintf(fid,':number-tests: %d\n', num_block_tests); + fprintf(fid,':number-failed-tests: %d\n', size(failedBlock,2)); + fprintf(fid,':list-of-failed-tests: %s\n', failedBlock{:}); + fprintf(fid,':copy-in-global-log: yes\n'); + fprintf(fid,':recheck: yes\n'); + fprintf(fid,':test-global-result: FAIL\n'); +else + fprintf(fid,':test-result: PASS\n'); + fprintf(fid,':number-tests: %d\n', num_block_tests); + fprintf(fid,':number-failed-tests: 0\n'); + fprintf(fid,':list-of-failed-tests: \n'); + fprintf(fid,':copy-in-global-log: no\n'); + fprintf(fid,':recheck: no\n'); + fprintf(fid,':test-global-result: PASS\n'); +end +fclose(fid); +exit; diff --git a/tests/run_block_byte_tests_octave.m b/tests/run_block_byte_tests_octave.m new file mode 100644 index 0000000000000000000000000000000000000000..b9107be60a46902d9d53834fea7d71f542bba405 --- /dev/null +++ b/tests/run_block_byte_tests_octave.m @@ -0,0 +1,153 @@ +## Copyright (C) 2009-2012 Dynare Team +## +## This file is part of Dynare. +## +## Dynare is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## Dynare is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Dynare. If not, see <http://www.gnu.org/licenses/>. + +## Implementation notes: +## +## Before every call to Dynare, the contents of the workspace is saved in +## 'wsOct', and reloaded after Dynare has finished (this is necessary since +## Dynare does a 'clear -all'). + +top_test_dir = getenv('TOP_TEST_DIR'); +addpath(top_test_dir); +addpath([top_test_dir filesep '..' filesep 'matlab']); + +## Test Dynare Version +if !strcmp(dynare_version(), getenv("DYNARE_VERSION")) + error("Incorrect version of Dynare is being tested") +endif + +## Ask gnuplot to create graphics in text mode +## Note that setenv() was introduced in Octave 3.0.2, for compatibility +## with MATLAB +putenv("GNUTERM", "dumb") + +## Test block_bytecode/ls2003.mod with various combinations of +## block/bytecode/solve_algo/stack_solve_algo +failedBlock = {}; +num_block_tests = 0; +cd([top_test_dir filesep 'block_bytecode']); +for blockFlag = 0:1 + for bytecodeFlag = 0:1 + ## Recall that solve_algo=7 and stack_solve_algo=2 are not supported + ## under Octave + default_solve_algo = 2; + default_stack_solve_algo = 0; + if !blockFlag && !bytecodeFlag + solve_algos = 0:4; + stack_solve_algos = [0 6]; + elseif blockFlag && !bytecodeFlag + solve_algos = [0:4 6 8]; + stack_solve_algos = [0 1 3 4]; + else + solve_algos = [0:6 8]; + stack_solve_algos = [0 1 3:5]; + endif + + sleep(1) # Workaround for strange race condition related to the _static.m file + + for i = 1:length(solve_algos) + num_block_tests = num_block_tests + 1; + if !blockFlag && !bytecodeFlag && (i == 1) + ## This is the reference simulation path against which all + ## other simulations will be tested + try + old_path = path; + save wsOct + run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) + load wsOct + path(old_path); + y_ref = oo_.endo_simul; + save('test.mat','y_ref'); + catch + load wsOct + path(old_path); + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], lasterror); + end_try_catch + else + try + old_path = path; + save wsOct + run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) + load wsOct + path(old_path); + ## Test against the reference simulation path + load('test.mat','y_ref'); + diff = oo_.endo_simul - y_ref; + if(abs(diff) > options_.dynatol.x) + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + differr.message = ["ERROR: simulation path differs from the reference path" ]; + printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], differr); + endif + catch + load wsOct + path(old_path); + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], lasterror); + end_try_catch + endif + endfor + for i = 1:length(stack_solve_algos) + num_block_tests = num_block_tests + 1; + try + old_path = path; + save wsOct + run_ls2003(blockFlag, bytecodeFlag, default_solve_algo, stack_solve_algos(i)) + load wsOct + path(old_path); + ## Test against the reference simulation path + load('test.mat','y_ref'); + diff = oo_.endo_simul - y_ref; + if(abs(diff) > options_.dynatol.x) + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')']; + differr.message = ["ERROR: simulation path differs from the reference path" ]; + printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')'], differr); + endif + catch + load wsOct + path(old_path); + failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; + printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(bytecodeFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], lasterror); + end_try_catch + endfor + endfor +endfor +delete('wsOct'); + +cd(getenv('TOP_TEST_DIR')); +fid = fopen('run_block_byte_tests_octave.o.trs', 'w+'); +if size(failedBlock,2) > 0 + fprintf(fid,':test-result: FAIL\n'); + fprintf(fid,':number-tests: %d\n', num_block_tests); + fprintf(fid,':number-failed-tests: %d\n', size(failedBlock,2)); + fprintf(fid,':list-of-failed-tests: %s\n', failedBlock{:}); + fprintf(fid,':copy-in-global-log: yes\n'); + fprintf(fid,':recheck: yes\n'); + fprintf(fid,':test-global-result: FAIL\n'); +else + fprintf(fid,':test-result: PASS\n'); + fprintf(fid,':number-tests: %d\n', num_block_tests); + fprintf(fid,':number-failed-tests: 0\n'); + fprintf(fid,':list-of-failed-tests: \n'); + fprintf(fid,':copy-in-global-log: no\n'); + fprintf(fid,':recheck: no\n'); + fprintf(fid,':test-global-result: PASS\n'); +end +fclose(fid); +## Local variables: +## mode: Octave +## End: diff --git a/tests/run_test_matlab.m b/tests/run_test_matlab.m index c861d7fdc954cfd2c90b5cf66820599e1872c2e0..149bf46d3dd0e4f2d6fcaa0c9d7937568a4a70c3 100644 --- a/tests/run_test_matlab.m +++ b/tests/run_test_matlab.m @@ -15,17 +15,9 @@ % You should have received a copy of the GNU General Public License % along with Dynare. If not, see <http://www.gnu.org/licenses/>. -% Implementation notes: -% -% Before every call to Dynare, the contents of the workspace is saved in -% 'wsMat.mat', and reloaded after Dynare has finished (this is necessary since -% Dynare does a 'clear -all'). Also note that we take care of clearing the -% 'exception' variable in all 'catch' block, because otherwise the next 'load -% wsMat' within a 'catch' block will overwrite the last exception. - -top_test_dir = pwd; +top_test_dir = getenv('TOP_TEST_DIR'); addpath(top_test_dir); -addpath([top_test_dir '/../matlab']); +addpath([top_test_dir filesep '..' filesep 'matlab']); % Test Dynare Version if ~strcmp(dynare_version(), getenv('DYNARE_VERSION')) @@ -33,171 +25,44 @@ if ~strcmp(dynare_version(), getenv('DYNARE_VERSION')) end % Test MOD files listed in Makefile.am -name=getenv('MODFILES'); -num_modfiles = 0; - -failedBase = {}; +[modfile, name] = strtok(getenv('FILESTEM')); +[directory, testfile, ext] = fileparts([top_test_dir '/' modfile]); +cd(directory); -while ~isempty(name) - [modfile, name] = strtok(name); - num_modfiles = num_modfiles + 1; - [directory, testfile, ext] = fileparts([top_test_dir '/' modfile]); - cd(directory); - disp(''); - disp(['*** TESTING: ' modfile ' ***']); - try - old_path = path; - save wsMat - dynare([testfile ext],'console') - clear -all - load wsMat - path(old_path); - catch exception - clear -all - load wsMat - path(old_path); - failedBase{size(failedBase,2)+1} = modfile; - printMakeCheckMatlabErrMsg(modfile, exception); - clear exception - end - close all - delete('wsMat.mat') - - cd(top_test_dir); +disp(''); +disp(['*** TESTING: ' modfile ' ***']); +try + dynare([testfile ext], 'console') + testFailed = false; +catch exception + printMakeCheckMatlabErrMsg(strtok(getenv('FILESTEM')), exception); + testFailed = true; end -% Test block_bytecode/ls2003.mod with various combinations of -% block/bytecode/solve_algo/stack_solve_algo -failedBlock = {}; -num_block_tests = 0; -cd([top_test_dir '/block_bytecode']); -has_optimization_toolbox = user_has_matlab_license('optimization_toolbox'); -for blockFlag = 0:1 - for bytecodeFlag = 0:1 - default_solve_algo = 2; - default_stack_solve_algo = 0; - if ~blockFlag && ~bytecodeFlag - solve_algos = 1:4; - stack_solve_algos = [0 6]; - elseif blockFlag && ~bytecodeFlag - solve_algos = [1:4 6:8]; - stack_solve_algos = 0:4; - else - solve_algos = 1:8; - stack_solve_algos = 0:5; - end - if has_optimization_toolbox - solve_algos = [ solve_algos 0 ]; - end - - for i = 1:length(solve_algos) - num_block_tests = num_block_tests + 1; - if ~blockFlag && ~bytecodeFlag && (i == 1) - % This is the reference simulation path against which all - % other simulations will be tested - try - old_path = path; - save wsMat - run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) - load wsMat - path(old_path); - y_ref = oo_.endo_simul; - save('test.mat','y_ref'); - catch exception - load wsMat - path(old_path); - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - printMakeCheckMatlabErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], exception); - clear exception - end - else - try - old_path = path; - save wsMat - run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) - load wsMat - path(old_path); - % Test against the reference simulation path - load('test.mat','y_ref'); - diff = oo_.endo_simul - y_ref; - if(abs(diff) > options_.dynatol.x) - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - exception = MException('ERROR: simulation path differs from the reference path'); - printMakeCheckMatlabErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], exception); - clear exception - end - catch exception - load wsMat - path(old_path); - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - printMakeCheckMatlabErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], exception); - clear exception - end - end - end - for i = 1:length(stack_solve_algos) - num_block_tests = num_block_tests + 1; - try - old_path = path; - save wsMat - run_ls2003(blockFlag, bytecodeFlag, default_solve_algo, stack_solve_algos(i)) - load wsMat - path(old_path); - % Test against the reference simulation path - load('test.mat','y_ref'); - diff = oo_.endo_simul - y_ref; - if(abs(diff) > options_.dynatol.x) - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(default_solve_algo) ', ' num2str(stack_solve_algos(i)) ')']; - exception = MException('ERROR: simulation path difers from the reference path'); - printMakeCheckMatlabErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(default_solve_algo) ', ' num2str(stack_solve_algos(i)) ')'], exception); - clear exception - end - catch exception - load wsMat - path(old_path); - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - printMakeCheckMatlabErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], exception); - clear exception - end - end - end +cd(getenv('TOP_TEST_DIR')); +name = strtok(getenv('FILESTEM')); +fid = fopen([name '.m.trs'], 'w'); +if fid < 0 + wd = pwd + filestep = getenv('FILESTEM') + error(['ERROR: problem opening file ' name '.m.trs for writing....']); end -delete('wsMat.mat') - -cd(top_test_dir); - -total_tests = num_modfiles+num_block_tests; - -% print output to screen and to file -fid = fopen('run_test_matlab_output.txt', 'w'); - -fprintf('\n\n\n'); -fprintf(fid,'\n\n\n'); -disp('***************************************'); -fprintf(fid,'***************************************\n'); -disp('* DYNARE TEST RESULTS *'); -fprintf(fid,'* DYNARE TEST RESULTS *\n'); -disp('* for make check-matlab *'); -fprintf(fid,'* for make check-matlab *\n'); -disp('***************************************'); -fprintf(fid,'***************************************\n'); -disp([' ' num2str(total_tests-size(failedBase,2)-size(failedBlock,2)) ' tests PASSED out of ' num2str(total_tests) ' tests run']); -fprintf(fid,' %d tests PASSED out of %d tests run\n', total_tests-size(failedBase,2)-size(failedBlock,2), total_tests); -disp('***************************************'); -fprintf(fid,'***************************************\n'); -if size(failedBase,2) > 0 || size(failedBlock,2) > 0 - disp(['List of ' num2str(size(failedBase,2)+size(failedBlock,2)) ' tests FAILED:']); - fprintf(fid,'List of %d tests FAILED:\n', size(failedBase,2)+size(failedBlock,2)); - for i=1:size(failedBase,2) - disp([' * ' failedBase{i}]); - fprintf(fid,' * %s\n', failedBase{i}); - end - for i=1:size(failedBlock,2) - disp([' * ' failedBlock{i}]); - fprintf(fid,' * %s\n', failedBlock{i}); - end - fprintf('***************************************\n\n'); - fprintf(fid,'***************************************\n\n'); +if testFailed + fprintf(fid,':test-result: FAIL\n'); + fprintf(fid,':number-tests: 1\n'); + fprintf(fid,':number-failed-tests: 1\n'); + fprintf(fid,':list-of-failed-tests: %s\n', [name '.mod']); + fprintf(fid,':copy-in-global-log: yes\n'); + fprintf(fid,':recheck: yes\n'); + fprintf(fid,':test-global-result: FAIL\n'); +else + fprintf(fid,':test-result: PASS\n'); + fprintf(fid,':number-tests: 1\n'); + fprintf(fid,':number-failed-tests: 0\n'); + fprintf(fid,':list-of-failed-tests: \n'); + fprintf(fid,':copy-in-global-log: no\n'); + fprintf(fid,':recheck: no\n'); + fprintf(fid,':test-global-result: PASS\n'); end fclose(fid); exit; diff --git a/tests/run_test_octave.m b/tests/run_test_octave.m index 26742a6a2277b93cc3d93a6e5507be92ca124f1f..d89132a94af7f7b9793cb0f73a0d19baddfbf2d8 100644 --- a/tests/run_test_octave.m +++ b/tests/run_test_octave.m @@ -1,4 +1,4 @@ -## Copyright (C) 2009-2011 Dynare Team +## Copyright (C) 2009-2012 Dynare Team ## ## This file is part of Dynare. ## @@ -21,9 +21,9 @@ ## 'wsOct', and reloaded after Dynare has finished (this is necessary since ## Dynare does a 'clear -all'). -top_test_dir = pwd; +top_test_dir = getenv('TOP_TEST_DIR'); addpath(top_test_dir); -addpath([top_test_dir '/../matlab']); +addpath([top_test_dir filesep '..' filesep 'matlab']); ## Test Dynare Version if !strcmp(dynare_version(), getenv("DYNARE_VERSION")) @@ -36,165 +36,41 @@ endif putenv("GNUTERM", "dumb") ## Test MOD files listed in Makefile.am -name = strsplit(getenv("MODFILES"), " "); - -failedBase = {}; - -for i=1:size(name,2) - [directory, testfile, ext] = fileparts([top_test_dir '/' name{i}]); - cd(directory); - printf("\n*** TESTING: %s ***\n", name{i}); - try - old_path = path; - save wsOct - dynare([testfile ext]) - clear -all - load wsOct - path(old_path); - catch - clear -all - load wsOct - path(old_path); - failedBase{size(failedBase,2)+1} = name{i}; - printMakeCheckOctaveErrMsg(name{i}, lasterror); - end_try_catch - delete('wsOct'); - cd(top_test_dir); -end - -## Test block_bytecode/ls2003.mod with various combinations of -## block/bytecode/solve_algo/stack_solve_algo -failedBlock = {}; -num_block_tests = 0; -cd([top_test_dir '/block_bytecode']); -for blockFlag = 0:1 - for bytecodeFlag = 0:1 - ## Recall that solve_algo=7 and stack_solve_algo=2 are not supported - ## under Octave - default_solve_algo = 2; - default_stack_solve_algo = 0; - if !blockFlag && !bytecodeFlag - solve_algos = 0:4; - stack_solve_algos = [0 6]; - elseif blockFlag && !bytecodeFlag - solve_algos = [0:4 6 8]; - stack_solve_algos = [0 1 3 4]; - else - solve_algos = [0:6 8]; - stack_solve_algos = [0 1 3:5]; - endif - - sleep(1) # Workaround for strange race condition related to the _static.m file - - for i = 1:length(solve_algos) - num_block_tests = num_block_tests + 1; - if !blockFlag && !bytecodeFlag && (i == 1) - ## This is the reference simulation path against which all - ## other simulations will be tested - try - old_path = path; - save wsOct - run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) - load wsOct - path(old_path); - y_ref = oo_.endo_simul; - save('test.mat','y_ref'); - catch - load wsOct - path(old_path); - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - printMakeCheckOctaveErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], lasterror); - end_try_catch - else - try - old_path = path; - save wsOct - run_ls2003(blockFlag, bytecodeFlag, solve_algos(i), default_stack_solve_algo) - load wsOct - path(old_path); - ## Test against the reference simulation path - load('test.mat','y_ref'); - diff = oo_.endo_simul - y_ref; - if(abs(diff) > options_.dynatol.x) - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - differr.message = ["ERROR: simulation path differs from the reference path" ]; - printMakeCheckOctaveErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], differr); - endif - catch - load wsOct - path(old_path); - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - printMakeCheckOctaveErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], lasterror); - end_try_catch - endif - endfor - for i = 1:length(stack_solve_algos) - num_block_tests = num_block_tests + 1; - try - old_path = path; - save wsOct - run_ls2003(blockFlag, bytecodeFlag, default_solve_algo, stack_solve_algos(i)) - load wsOct - path(old_path); - ## Test against the reference simulation path - load('test.mat','y_ref'); - diff = oo_.endo_simul - y_ref; - if(abs(diff) > options_.dynatol.x) - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(default_solve_algo) ', ' num2str(stack_solve_algos(i)) ')']; - differr.message = ["ERROR: simulation path differs from the reference path" ]; - printMakeCheckOctaveErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(default_solve_algo) ', ' num2str(stack_solve_algos(i)) ')'], differr); - endif - catch - load wsOct - path(old_path); - failedBlock{size(failedBlock,2)+1} = ['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')']; - printMakeCheckOctaveErrMsg(['block_bytecode/run_ls2003.m(' num2str(blockFlag) ', ' num2str(bytecodeFlag) ', ' num2str(solve_algos(i)) ', ' num2str(default_stack_solve_algo) ')'], lasterror); - end_try_catch - endfor - endfor -endfor - -delete('wsOct'); - +name = getenv("FILESTEM"); +[directory, testfile, ext] = fileparts([top_test_dir '/' name]); +cd(directory); +printf("\n*** TESTING: %s ***\n", name); + +try + dynare([testfile ext]) + testFailed = false; +catch + printMakeCheckOctaveErrMsg(getenv("FILESTEM"), lasterror); + testFailed = true; +end_try_catch + +top_test_dir = getenv('TOP_TEST_DIR'); cd(top_test_dir); - -total_tests = size(name,2)+num_block_tests; - - % print output to screen and to file -fid = fopen("run_test_octave_output.txt", "w"); - -printf("\n\n\n"); -fprintf(fid,'\n\n\n'); -printf("***************************************\n"); -fprintf(fid,"***************************************\n"); -printf("* DYNARE TEST RESULTS *\n"); -fprintf(fid,"* DYNARE TEST RESULTS *\n"); -printf("* for make check-octave *\n"); -fprintf(fid,"* for make check-octave *\n"); -printf("***************************************\n"); -fprintf(fid,"***************************************\n"); -printf(" %d tests PASSED out of %d tests run\n", total_tests-size(failedBase,2)-size(failedBlock,2), total_tests); -fprintf(fid," %d tests PASSED out of %d tests run\n", total_tests-size(failedBase,2)-size(failedBlock,2), total_tests); -printf("***************************************\n"); -fprintf(fid,"***************************************\n"); -if size(failedBase,2) > 0 || size(failedBlock,2) > 0 - printf("List of %d tests FAILED:\n", size(failedBase,2)+size(failedBlock,2)); - fprintf(fid,"List of %d tests FAILED:\n", size(failedBase,2)+size(failedBlock,2)); - for i=1:size(failedBase,2) - printf(" * %s\n",failedBase{i}); - fprintf(fid," * %s\n", failedBase{i}); - end - for i=1:size(failedBlock,2) - printf(" * %s\n",failedBlock{i}); - fprintf(fid," * %s\n", failedBlock{i}); - end - printf("***************************************\n\n"); - fprintf(fid,"***************************************\n\n"); - fclose(fid); - error("make check-octave FAILED"); +name = getenv("FILESTEM"); +fid = fopen([name '.o.trs'], 'w+'); +if testFailed + fprintf(fid,':test-result: FAIL\n'); + fprintf(fid,':number-tests: 1\n'); + fprintf(fid,':number-failed-tests: 1\n'); + fprintf(fid,':list-of-failed-tests: %s\n', [name '.mod']); + fprintf(fid,':copy-in-global-log: yes\n'); + fprintf(fid,':recheck: yes\n'); + fprintf(fid,':test-global-result: FAIL\n'); else - fclose(fid); -endif + fprintf(fid,':test-result: PASS\n'); + fprintf(fid,':number-tests: 1\n'); + fprintf(fid,':number-failed-tests: 0\n'); + fprintf(fid,':list-of-failed-tests: \n'); + fprintf(fid,':copy-in-global-log: no\n'); + fprintf(fid,':recheck: no\n'); + fprintf(fid,':test-global-result: PASS\n'); +end +fclose(fid); ## Local variables: ## mode: Octave