Added preprocessor unit tests (on the fly declarations of types).

time-shift
Stéphane Adjemian(Charybdis) 2018-07-19 23:43:24 +02:00
parent 39d1d5461a
commit 3dcd8fc9f5
7 changed files with 209 additions and 22 deletions

View File

@ -52,8 +52,13 @@ MODFILES = \
ramst.mod \
ramst_a.mod \
ramst_static_tag.mod \
on-the-fly/ex1.mod \
on-the-fly/ex2.mod \
on-the-fly/ex3.mod \
on-the-fly/ex4.mod \
on-the-fly/ex5.mod \
on-the-fly/ex6.mod \
example1.mod \
example1_on_the_fly.mod \
example2.mod \
example1_use_dll.mod \
example1_with_tags.mod \
@ -482,13 +487,13 @@ deterministic_simulations/multiple_lead_lags/sim_lead_lag_aux_vars.o.trs: determ
deterministic_simulations/multiple_lead_lags/sim_lead_lag.m.trs: deterministic_simulations/multiple_lead_lags/sim_base.m.trs deterministic_simulations/multiple_lead_lags/sim_lead_lag_aux_vars.m.trs
deterministic_simulations/multiple_lead_lags/sim_lead_lag.o.trs: deterministic_simulations/multiple_lead_lags/sim_base.o.trs deterministic_simulations/multiple_lead_lags/sim_lead_lag_aux_vars.o.trs
deterministic_simulations/multiple_lead_lags/ramst_augmented_histval.m.trs: ramst.m.trs
deterministic_simulations/multiple_lead_lags/ramst_augmented_histval.m.trs: ramst.m.trs
deterministic_simulations/multiple_lead_lags/ramst_augmented_histval.o.trs: ramst.o.trs
loglinear/example4_loglinear.m.trs: loglinear/example4_exp.m.trs
loglinear/example4_loglinear.o.trs: loglinear/example4_exp.o.trs
loglinear/example4_loglinear_lagged_exogenous_a.m.trs: loglinear/example4_loglinear_lagged_exogenous.m.trs
loglinear/example4_loglinear_lagged_exogenous_a.o.trs: loglinear/example4_loglinear_lagged_exogenous.o.trs
loglinear/example4_loglinear_lagged_exogenous_a.m.trs: loglinear/example4_loglinear_lagged_exogenous.m.trs
loglinear/example4_loglinear_lagged_exogenous_a.o.trs: loglinear/example4_loglinear_lagged_exogenous.o.trs
loglinear/example4_loglinear_histval.m.trs: loglinear/example4_exp_histval.m.trs
loglinear/example4_loglinear_histval.o.trs: loglinear/example4_exp_histval.o.trs
@ -581,6 +586,10 @@ external_function: m/external_function o/external_function
m/external_function: $(patsubst %.mod, %.m.trs, $(filter external_function/%.mod, $(MODFILES)))
o/external_function: $(patsubst %.mod, %.o.trs, $(filter external_function/%.mod, $(MODFILES)))
on-the-fly: m/on-the-fly o/on-the-fly
m/on-the-fly: $(patsubst %.mod, %.m.trs, $(filter on-the-fly/%.mod, $(MODFILES)))
o/on-the-fly: $(patsubst %.mod, %.o.trs, $(filter on-the-fly/%.mod, $(MODFILES)))
trend_var: m/trend_var o/trend_var
m/trend_var: $(patsubst %.mod, %.m.trs, $(filter trend_var/%.mod, $(MODFILES)))
o/trend_var: $(patsubst %.mod, %.o.trs, $(filter trend_var/%.mod, $(MODFILES)))
@ -882,7 +891,7 @@ check-octave: $(O_XFAIL_TRS_FILES) $(O_TRS_FILES)
%.m.trs %.m.log : %.m
@echo "`tput bold``tput setaf 8`MATLAB: $(PWD)/$*... `tput sgr0`"
@DYNARE_VERSION="$(PACKAGE_VERSION)" TOP_TEST_DIR="$(PWD)" \
$(MATLAB)/bin/matlab -nosplash -nodisplay -r $* > $*.m.log 2> /dev/null
$(MATLAB)/bin/matlab -nosplash -nodisplay -r $* > $*.m.log 2> /dev/null
@echo "`tput bold``tput setaf 8`MATLAB: $(PWD)/$* Done!`tput sgr0`"
%.o.trs %.o.log: %.mod

View File

@ -30,24 +30,16 @@ beta = 0.99;
delta = 0.025;
psi = 0;
theta = 2.95;
phi = 0.1;
initval;
y = 1.08068253095672;
c = 0.80359242014163;
h = 0.29175631001732;
k = 11.08360443260358;
a = 0;
b = 0;
e = 0;
u = 0;
end;
if ~isequal(length(intersect(M_.endo_names, {'c'; 'h'; 'y'; 'k'; 'b'; 'a'})), 6)
error('Endogenous variables are wrong.')
end
shocks;
var e; stderr 0.009;
var u; stderr 0.009;
var e, u = phi*0.009*0.009;
end;
if ~isequal(length(intersect(M_.param_names, {'theta'; 'psi'; 'alpha'; 'beta'; 'delta'; 'rho'; 'tau'})), 7)
error('Parameters are wrong.')
end
stoch_simul;
if ~isequal(length(intersect(M_.exo_names, {'e'; 'u'})), 2)
error('Exogenous variables are wrong.')
end

38
tests/on-the-fly/ex2.mod Normal file
View File

@ -0,0 +1,38 @@
// --+ options: nostrict +--
/*
** Same as ex1.mod without the first equation -> h is an exogenous variable, psi is not a model object (because it
** is not used in the remaining equations), and theta is an exogenous equation (see the last equation).
*/
model;
//c*theta|p*h|e^(1+psi|p)=(1-alpha)*y;
k|e = beta|p*(((exp(b)*c)/(exp(b(+1))*c(+1)))
*(exp(b(+1))*alpha|p*y(+1)+(1-delta)*k));
y|e = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
k = exp(b)*(y-c|e)+(1-delta|p)*k(-1);
a|e = rho|p*a(-1)+tau*b(-1) + e|x;
b|e = tau|p*a(-1)+rho*b(-1) + u|x + .0*theta; // The last term is here just for testing purpose.
end;
alpha = 0.36;
rho = 0.95;
tau = 0.025;
beta = 0.99;
delta = 0.025;
psi = 0;
// If the following line is uncommented, this will trigger an error from the preprocessor
// because it is not allowed to give a value to an exogenous variable.
//theta = 2.95;
phi = 0.1;
if ~isequal(length(intersect(M_.endo_names, {'c'; 'y'; 'k'; 'b'; 'a'})), 5)
error('Endogenous variables are wrong.')
end
if ~isequal(length(intersect(M_.param_names, {'alpha'; 'beta'; 'delta'; 'rho'; 'tau'})), 5)
error('Parameters are wrong.')
end
if ~isequal(length(intersect(M_.exo_names, {'e'; 'u'; 'h'; 'theta'})), 4)
error('Exogenous variables are wrong.')
end

40
tests/on-the-fly/ex3.mod Normal file
View File

@ -0,0 +1,40 @@
// --+ options: nostrict +--
/*
** In the following example, we only declare one endogenous variable per equation. Because the other objects are not declared
** they are treated as exogenous variables. An equation tag is used to associate an endogenous variable to each equation.
*/
model;
[endogenous='h']
c*theta*h^(1+psi)=(1-alpha)*y;
[endogenous='k']
k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))
*(exp(b(+1))*alpha*y(+1)+(1-delta)*k));
[endogenous='y']
y = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
[endogenous='c']
k = exp(b)*(y-c)+(1-delta)*k(-1);
[endogenous='a']
a = rho*a(-1)+tau*b(-1) + e;
[endogenous='b']
b = tau*a(-1)+rho*b(-1) + u;
end;
if ~isequal(length(intersect(M_.endo_names, {'c'; 'y'; 'k'; 'b'; 'a'; 'h'})), 6)
error('Endogenous variables are wrong.')
end
if isfield(M_, 'param_names')
error('Parameters are wrong.')
end
if ~isequal(length(intersect(M_.exo_names, {'e'; 'u'; 'theta'; 'psi'; 'alpha'; 'beta'; 'delta'; 'rho'; 'tau'})), 9)
error('Exogenous variables are wrong.')
end

39
tests/on-the-fly/ex4.mod Normal file
View File

@ -0,0 +1,39 @@
// --+ options: nostrict +--
/*
** Same as ex3.mod without the first equation, hours (h) are exogenous.
*/
model;
//[endogenous='h']
//c*theta*h^(1+psi)=(1-alpha)*y;
[endogenous='k']
k = beta*(((exp(b)*c)/(exp(b(+1))*c(+1)))
*(exp(b(+1))*alpha*y(+1)+(1-delta)*k));
[endogenous='y']
y = exp(a)*(k(-1)^alpha)*(h^(1-alpha));
[endogenous='c']
k = exp(b)*(y-c)+(1-delta)*k(-1);
[endogenous='a']
a = rho*a(-1)+tau*b(-1) + e;
[endogenous='b']
b = tau*a(-1)+rho*b(-1) + u;
end;
if ~isequal(length(intersect(M_.endo_names, {'c'; 'y'; 'k'; 'b'; 'a'})), 5)
error('Endogenous variables are wrong.')
end
if isfield(M_, 'param_names')
error('Parameters are wrong.')
end
if ~isequal(length(intersect(M_.exo_names, {'e'; 'u'; 'h'; 'alpha'; 'beta'; 'delta'; 'rho'; 'tau'})), 8)
error('Exogenous variables are wrong.')
end

36
tests/on-the-fly/ex5.mod Normal file
View File

@ -0,0 +1,36 @@
// --+ options: nostrict +--
/*
** It is possible to associate an endogenous variable to an equation were the variable does not appear (if it makes sense).
*/
parameters a0, a1, b0, b1;
a0 = 1.0;
a1 = 0.1;
b0 = 0.5;
b1 = 0.2;
model;
[endogenous='D']
D = a0 - a1*p;
[endogenous='S']
S = b0 + b1*p;
[endogenous='p']
S = D;
end;
if ~isequal(length(intersect(M_.endo_names, {'D'; 'S'; 'p'})), 3)
error('Endogenous variables are wrong.')
end
if isfield(M_, 'exo_names')
error('Exogenous variables are wrong.')
end

33
tests/on-the-fly/ex6.mod Normal file
View File

@ -0,0 +1,33 @@
// --+ options: nostrict +--
/*
** Same as ex5.mod, but price is treated as an exoenous variable.
*/
parameters a0, a1, b0, b1;
a0 = 1.0;
a1 = 0.1;
b0 = 0.5;
b1 = 0.2;
model;
[endogenous='D']
D = a0 - a1*p;
[endogenous='S']
S = b0 + b1*p;
//[endogenous='p']
//S = D;
end;
if ~isequal(length(intersect(M_.endo_names, {'D'; 'S'})), 2)
error('Endogenous variables are wrong.')
end
if ~isequal(M_.exo_names, {'p'})
error('Exogenous variables are wrong.')
end