diff --git a/meson.build b/meson.build index 20ccf1ad8376ce6a2c7b097b3d06d102d572b04d..06161dda9f5868304b674c41e67ae1f8783c1e4b 100644 --- a/meson.build +++ b/meson.build @@ -1740,42 +1740,23 @@ mod_and_m_tests = [ { 'test' : [ 'riccatiupdate.m' ] }, { 'test' : [ 'contribs.m' ], 'extra' : [ 'sandbox.mod', - 'simulateddata.m' ] } + 'simulateddata.m' ] }, + { 'test' : [ 'run_block_bytecode_tests.m' ], + 'extra' : [ 'block_bytecode/run_ls2003.m', + 'block_bytecode/ls2003.mod' ] }, + { 'test' : [ 'run_reporting_tests.m' ], + 'extra' : [ 'reporting/AnnualTable.m', + 'reporting/CommResidTablePage.m', + 'reporting/CountryGraphPage.m', + 'reporting/CountryTablePage.m', + 'reporting/db_a.csv', + 'reporting/db_q.csv', + 'reporting/dc_a.csv', + 'reporting/dc_q.csv', + 'reporting/ResidTablePage.m', + 'reporting/runDynareReport.m' ] } ] -if get_option('build_for') == 'matlab' - mod_and_m_tests += [ { 'test' : [ 'run_block_byte_tests_matlab.m' ], - 'extra' : [ 'block_bytecode/run_ls2003.m', - 'block_bytecode/ls2003.mod' ] }, - { 'test' : [ 'run_reporting_test_matlab.m' ], - 'extra' : [ 'reporting/AnnualTable.m', - 'reporting/CommResidTablePage.m', - 'reporting/CountryGraphPage.m', - 'reporting/CountryTablePage.m', - 'reporting/db_a.csv', - 'reporting/db_q.csv', - 'reporting/dc_a.csv', - 'reporting/dc_q.csv', - 'reporting/ResidTablePage.m', - 'reporting/runDynareReport.m' ] } ] -else - mod_and_m_tests += [ { 'test' : [ 'run_block_byte_tests_octave.m' ], - 'extra' : [ 'block_bytecode/run_ls2003.m', - 'block_bytecode/ls2003.mod' ] }, - { 'test' : [ 'run_reporting_test_octave.m' ], - 'extra' : [ 'reporting/AnnualTable.m', - 'reporting/CommResidTablePage.m', - 'reporting/CountryGraphPage.m', - 'reporting/CountryTablePage.m', - 'reporting/db_a.csv', - 'reporting/db_q.csv', - 'reporting/dc_a.csv', - 'reporting/dc_q.csv', - 'reporting/ResidTablePage.m', - 'reporting/runDynareReport.m' ] } ] -endif - - base_test_driver_args = [ get_option('build_for') ] if get_option('build_for') == 'matlab' base_test_driver_args += [ matlab_exe.full_path(), matlab_version, matlab_arch ] diff --git a/tests/run_block_byte_tests_octave.m b/tests/run_block_byte_tests_octave.m deleted file mode 100644 index 55fd054345c5561e94b4276aca709abc0593e98e..0000000000000000000000000000000000000000 --- a/tests/run_block_byte_tests_octave.m +++ /dev/null @@ -1,138 +0,0 @@ -## Copyright © 2009-2023 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 <https://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'). -## Note that we take care of clearing oo_ before saving the workspace, -## otherwise the newly created oo_ will be scratched upon loading, -## thus making the path comparison bogus. - -source_dir = getenv('source_root'); -addpath([source_dir filesep 'tests' filesep 'utils']); -addpath([source_dir filesep 'matlab']); - -## Test block_bytecode/ls2003.mod with various combinations of -## block/bytecode/solve_algo/stack_solve_algo -failedBlock = {}; -cd block_bytecode -tic; -for blockFlag = 0:1 - for storageFlag = 0:2 % 0=M-file, 1=use_dll, 2=bytecode - default_solve_algo = 2; - default_stack_solve_algo = 0; - if !blockFlag && storageFlag != 2 - solve_algos = [0:4 9]; - stack_solve_algos = [0 1 6]; - elseif blockFlag && storageFlag != 2 - solve_algos = [0:4 6:9]; - stack_solve_algos = [0:4 6]; - else - solve_algos = 0:9; - stack_solve_algos = 0:6; - endif - - # Workaround for strange race condition related to the static/dynamic - # files (especially when we switch to/from use_dll) - if exist('+ls2003_tmp') - rmdir('+ls2003_tmp', 's'); - pause(1) - endif - - for i = 1:length(solve_algos) - if !blockFlag && storageFlag == 0 && (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, storageFlag, 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(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; - printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], lasterror); - end_try_catch - else - try - old_path = path; - clear oo_ # Ensure that oo_.endo_simul won’t be overwritten when loading wsOct - save wsOct - run_ls2003(blockFlag, storageFlag, 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 max(max(abs(diff))) > options_.dynatol.x - failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' 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(storageFlag) ',' 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(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; - printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], lasterror); - end_try_catch - endif - endfor - for i = 1:length(stack_solve_algos) - try - old_path = path; - clear oo_ # Ensure that oo_.endo_simul won’t be overwritten when loading wsOct - save wsOct - run_ls2003(blockFlag, storageFlag, 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 max(max(abs(diff))) > options_.dynatol.x - failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' 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(storageFlag) ',' 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(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')']; - printMakeCheckOctaveErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')'], lasterror); - end_try_catch - endfor - endfor -endfor - -delete('wsOct'); - -if size(failedBlock,2) > 0 - fprintf('\n*** Failed tests: %s\n', failedBlock{:}) -end - -fprintf('\n*** Elapsed time (in seconds): %.1f\n\n', toc); - -quit(size(failedBlock,2) > 0) - -## Local variables: -## mode: Octave -## End: diff --git a/tests/run_block_byte_tests_matlab.m b/tests/run_block_bytecode_tests.m similarity index 74% rename from tests/run_block_byte_tests_matlab.m rename to tests/run_block_bytecode_tests.m index d1b28e70913d11a87ecea50c14e59058354aba9e..820db3f84310c0a77e658e0484c33fc33ef9febe 100644 --- a/tests/run_block_byte_tests_matlab.m +++ b/tests/run_block_bytecode_tests.m @@ -35,7 +35,6 @@ addpath([source_dir filesep 'matlab']); % block/bytecode/solve_algo/stack_solve_algo failedBlock = {}; cd block_bytecode -has_optimization_toolbox = user_has_matlab_license('optimization_toolbox'); tic; for blockFlag = 0:1 for storageFlag = 0:2 % 0=M-file, 1=use_dll, 2=bytecode @@ -51,8 +50,15 @@ for blockFlag = 0:1 solve_algos = 1:9; stack_solve_algos = 0:6; end - if has_optimization_toolbox - solve_algos = [ solve_algos 0 ]; + if isoctave || user_has_matlab_license('optimization_toolbox') + solve_algos = [ 0 solve_algos ]; + end + + % Workaround for strange race condition related to the static/dynamic + % files (especially when we switch to/from use_dll) + if isoctave && exist('+ls2003_tmp') + rmdir('+ls2003_tmp', 's'); + pause(1) end for i = 1:length(solve_algos) @@ -71,7 +77,7 @@ for blockFlag = 0:1 load wsMat path(old_path); failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; - printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + printTestError(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); clear exception end else @@ -87,15 +93,19 @@ for blockFlag = 0:1 diff = oo_.endo_simul - y_ref; if max(max(abs(diff))) > options_.dynatol.x failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; - exception = MException('Dynare:simerr', 'ERROR: simulation path differs from the reference path'); - printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + if isoctave + exception.message = 'ERROR: simulation path differs from the reference path'; + else + exception = MException('Dynare:simerr', 'ERROR: simulation path differs from the reference path'); + end + printTestError(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' 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(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')']; - printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); + printTestError(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(solve_algos(i)) ',' num2str(default_stack_solve_algo) ')'], exception); clear exception end end @@ -113,15 +123,19 @@ for blockFlag = 0:1 diff = oo_.endo_simul - y_ref; if max(max(abs(diff))) > options_.dynatol.x failedBlock{size(failedBlock,2)+1} = ['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')']; - exception = MException('Dynare:simerr', 'ERROR: simulation path difers from the reference path'); - printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')'], exception); + if isoctave + exception.message = 'ERROR: simulation path differs from the reference path'; + else + exception = MException('Dynare:simerr', 'ERROR: simulation path difers from the reference path'); + end + printTestError(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' 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(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')']; - printMakeCheckMatlabErrMsg(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')'], exception); + printTestError(['block_bytecode' filesep 'run_ls2003.m(' num2str(blockFlag) ',' num2str(storageFlag) ',' num2str(default_solve_algo) ',' num2str(stack_solve_algos(i)) ')'], exception); clear exception end end diff --git a/tests/run_mod_file.m b/tests/run_mod_file.m index 5e3c5a5603f5c1c5290ca4c1b1137431b6003e28..521c612245a7f12d1ad24ef01026024232f07eb7 100644 --- a/tests/run_mod_file.m +++ b/tests/run_mod_file.m @@ -32,12 +32,8 @@ try dynare(getenv('mod_file'), 'console') testFailed = false; catch exception - if isoctave - printMakeCheckOctaveErrMsg(getenv('mod_file'), exception); - else - printMakeCheckMatlabErrMsg(getenv('mod_file'), exception); - end - testFailed = true; + printTestError(getenv('mod_file'), exception); + testFailed = true; end diff --git a/tests/run_reporting_test_octave.m b/tests/run_reporting_test_octave.m deleted file mode 100644 index 18f3eef8a5390edb03b6a96ecc74f9bc728d960b..0000000000000000000000000000000000000000 --- a/tests/run_reporting_test_octave.m +++ /dev/null @@ -1,44 +0,0 @@ -## Copyright © 2013-2023 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 <https://www.gnu.org/licenses/>. - -source_dir = getenv('source_root'); -addpath([source_dir filesep 'tests' filesep 'utils']); -addpath([source_dir filesep 'matlab']); - -load_octave_packages - -## To add default directories, empty dseries objects -dynare_config(); - -printf("\n*** TESTING: run_reporting_test_octave.m ***\n"); -try - cd reporting - db_a = dseries('db_a.csv'); - db_q = dseries('db_q.csv'); - dc_a = dseries('dc_a.csv'); - dc_q = dseries('dc_q.csv'); - runDynareReport(dc_a, dc_q, db_a, db_q); - testFailed = false; -catch - testFailed = true; -end - -quit(testFailed) - -## Local variables: -## mode: Octave -## End: diff --git a/tests/run_reporting_test_matlab.m b/tests/run_reporting_tests.m similarity index 88% rename from tests/run_reporting_test_matlab.m rename to tests/run_reporting_tests.m index 6c8bf22c058745c0489eb13fbe7301ef06934ff3..161d594b1d574a82e2bb457367ab733921fdb888 100644 --- a/tests/run_reporting_test_matlab.m +++ b/tests/run_reporting_tests.m @@ -17,12 +17,16 @@ source_dir = getenv('source_root'); addpath([source_dir filesep 'matlab']); +if isoctave + addpath([source_dir filesep 'tests' filesep 'utils']); + load_octave_packages +end % To add default directories, empty dseries objects dynare_config; disp(''); -disp(['*** TESTING: run_reporting_test_matlab.m ***']); +disp(['*** TESTING: run_reporting_tests.m ***']); try cd reporting db_a = dseries('db_a.csv'); diff --git a/tests/utils/printMakeCheckMatlabErrMsg.m b/tests/utils/printMakeCheckMatlabErrMsg.m deleted file mode 100644 index a72b55401be47b9e76475d9c69f66f18d809dfb2..0000000000000000000000000000000000000000 --- a/tests/utils/printMakeCheckMatlabErrMsg.m +++ /dev/null @@ -1,9 +0,0 @@ -function printMakeCheckMatlabErrMsg(modfilename, exception) - fprintf('\n********************************************\n'); - disp('*** DYNARE-TEST-MATLAB ERROR ENCOUNTERED ***'); - disp('********************************************'); - disp([' WHILE RUNNING MODFILE: ' modfilename]); - fprintf('\n'); - disp(getReport(exception)); - fprintf('*************************************\n\n\n'); -end diff --git a/tests/utils/printMakeCheckOctaveErrMsg.m b/tests/utils/printMakeCheckOctaveErrMsg.m deleted file mode 100644 index ed66ea68c2e1e6eb43c3dbd43e920e5cbc057658..0000000000000000000000000000000000000000 --- a/tests/utils/printMakeCheckOctaveErrMsg.m +++ /dev/null @@ -1,16 +0,0 @@ -function printMakeCheckOctaveErrMsg(modfilename, err) - printf("\n"); - printf("********************************************\n"); - printf("*** DYNARE-TEST-OCTAVE ERROR ENCOUNTERED ***\n"); - printf("********************************************\n"); - printf(" WHILE RUNNING MODFILE: %s\n", modfilename); - printf(" MSG: %s\n", err.message); - if (isfield(err, 'stack')) - printf("\n STACKTRACE:\n"); - for i=1:size(err.stack, 1) - printf(" %s(%s):%d.%d\n", err.stack(i).file, err.stack(i).name, - err.stack(i).line, err.stack(i).column); - endfor - end - printf("********************************************\n\n\n"); -end diff --git a/tests/utils/printTestError.m b/tests/utils/printTestError.m new file mode 100644 index 0000000000000000000000000000000000000000..5afb38bfccc83260b6f7a5657514dde6a98b48bb --- /dev/null +++ b/tests/utils/printTestError.m @@ -0,0 +1,20 @@ +function printTestError(filename, exception) + fprintf('\n********************************************\n') + fprintf('****** Dynare test error encountered *******\n') + fprintf('********************************************\n') + fprintf(' While running file: %s\n', filename); + if isoctave + fprintf(' message: %s\n', exception.message) + if (isfield(exception, 'stack')) + fprintf('\n Stacktrace:\n') + for i=1:size(exception.stack, 1) + fprintf(' %s(%s):%d.%d\n', exception.stack(i).file, exception.stack(i).name, ... + exception.stack(i).line, exception.stack(i).column); + end + end + else + fprintf('\n') + disp(getReport(exception)) + end + fprintf('********************************************\n\n\n') +end