/* * ticket-686-positive-parameters.sli * * This file is part of NEST. * * Copyright (C) 2004 The NEST Initiative * * NEST 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 2 of the License, or * (at your option) any later version. * * NEST 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 NEST. If not, see <http://www.gnu.org/licenses/>. * */ /* BeginDocumentation Name: testsuite::ticket-686 - catch nodes which do not require tau_*, C_m > 0 Synopsis: (ticket-686-positive-parameters) run -> NEST exits if test fails Description: This tests ensures that models with parameters C_m or tau_* throw an exception when trying to set a value that is not strictly positive. The test also ensures that values can actually be set to different, positive values. Author: Hans Ekkehard Plesser, 2013-04-18 */ (unittest) run /unittest using M_ERROR setverbosity % Add models that have C_m or tau_* and that should not be checked % This should be devices only. /skipped_models [ /correlation_detector /correlomatrix_detector ] def skipped_models { modeldict exch undef } forall % model GetPositiveKeyes -> list of keys requiring positive values % any of C_m and tau_* /GetPositiveKeys { GetDefaults keys { cvs /key Set key (C_m) eq key length 4 geq { key 0 4 getinterval (tau_) eq } { false } ifelse or } Select } def % first test: ensure values <= 0 provoke exception { modeldict keys { ResetKernel % Avoid exceptions in case a model has C_m or % tau_* that cannot be changed. 0 << /dict_miss_is_error false >> SetStatus /model Set /all_fine true def % pass by default % now test one at a time model GetPositiveKeys { /key Set [ 0.0 -1.0 ] % test for zero and negative { /val Set % the next line shall provoke an error mark { /neuron model Create def neuron key get /origval Set neuron << >> dup key val put_d SetStatus } stopped { % we got an exception, need to clean up % remove error code errordict /message undef errordict /command undef errordict begin /newerror false def end % clear stack counttomark npop pop % need to pop mark separately % now check that value is unchanged /all_fine all_fine neuron key get origval eq and def } { % model failed to raise exception pop % mark /all_fine false def } ifelse % stopped } forall % values } forall % keys all_fine % leave result on stack dup not { (ERROR: ) model cvs join == } if } Map % modeldict keys true exch { and } Fold } assert_or_die % second test: ensure positive values can be set { modeldict keys { ResetKernel % Avoid exceptions in case a model has C_m or % tau_* that cannot be changed. 0 << /dict_miss_is_error false >> SetStatus /model Set % now test one at a time model GetPositiveKeys { /key Set /nrn model Create def /newval nrn key get 1.0 add def nrn << >> dup key newval put SetStatus nrn key get newval eq } Map true exch { and } Fold dup not { (ERROR2: ) model cvs join == } if } Map % modeldict keys true exch { and } Fold } assert_or_die endusing