/*
 *  test_pulsepacket_generator.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::test_pulsepacket_generator - minimal test of pulsepacket_generator

Synopsis: (test_pulsepacket_generator) run -> dies if assertion fails

Description:
Tests parameter setting and statistical correctness for one application.

Author: July 2008, Plesser
SeeAlso: noise_generator, testsuite::test_poisson_ps_min_interval
*/

/unittest (7471) require
/unittest using

% flatten arrays that may contain vectors and numbers
/allflat {
  { { cva } stopped { ; errordict begin /newerror false def end } if  } Map 
    Flatten
} def

% First test: parameter setting on model and instance
{
    ResetKernel
    /tdict << /pulse_times [ 1.0 2.5 4.6 ] 
              /activity    150
              /sdev        0.1234  >> def

    /ng1 /pulsepacket_generator Create def
    ng1 tdict SetStatus

    /pulsepacket_generator tdict SetDefaults
    /ng2 /pulsepacket_generator Create def

    ng1 [tdict keys] get allflat
    ng2 [tdict keys] get allflat
    eq
} assert_or_die
clear
ResetKernel

% Second test: error if sdev negative
{
  ResetKernel
  /pulsepacket_generator << /sdev -0.5 >> SetDefaults
} fail_or_die  

% Third test: error if activity negative
{
  ResetKernel
  /pulsepacket_generator << /activity -5 >> SetDefaults
} fail_or_die  

% Fourth test: assure empty pulse times and zero otherwise is ok
{
  ResetKernel
  /pulsepacket_generator Create
  << /pulse_times [] /activity 0 /sdev 0.0 >> SetStatus
  1 Simulate
} pass_or_die  

% Fifth test: feed spike detector
{
  ResetKernel
  0 << /resolution 0.1 >> SetStatus
  /ppg /pulsepacket_generator Create def
  /sd  /spike_detector Create def
 
  /tstart  75.0 def
  /tstop  225.0 def
  /nspk    10   def
  /pulset [ 10.0 125.0 175.0 275.0 ] def
  /stddev   5.0 def
  % find number of pulse centers in start..stop
  /npulseff
    0 pulset { dup tstart gt exch tstop lt and { 1 } { 0 } ifelse add } Fold
  def
  % since start, stop are far from pulse times, it is highly likely that
  % only spikes belonging to the pulses with centers in start..stop are
  % fired and then we get for the total spike number 
  /nspktot nspk npulseff mul def

  ppg << /start        tstart
         /stop         tstop
         /pulse_times  pulset
         /activity     nspk
         /sdev         stddev
      >> SetStatus

  sd << /record_to [/memory] /time_in_steps false >> SetStatus

  ppg sd Connect

  300 Simulate

  sd [ /events /times ] get cva /spks Set

  % check min and max are inside start .. stop
  tstart spks Min leq
  spks Max tstop  leq and

  % check number of spikes
  spks length nspktot eq
  and 

} assert_or_die

endusing