/*
 *  test_multithreading.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_multithreading - sli script for several tests regarding multithreading

Synopsis: (test_multithreading) run

Description:
This is a simple testscript to test if multithreading is working
correctly. The following things are tested:
  * Does setting the number of threads to x result in x threads?
  * Does ResetKernel reset the number of threads to 1?
  * Does default node distribution (modulo) work as expected?
  * Does the /children_on_same_vp property of subnets do the right
    thing?

The data collection over threads is tested in a separate script. See
SeeAlso key below.

SeeAlso:testsuite::test_multithreading_devices

Author: Jochen Martin Eppler
FirstVersion: July 2008 
*/

% don't run this test if we didn't compile with threads 
statusdict/threading :: (no) eq {statusdict/exitcodes/success :: quit_i} if

/unittest (6688) require
/unittest using

/threads 4 def

% check if setting the number of threads works
0 << /local_num_threads threads >> SetStatus
0 [ /local_num_threads ] get threads eq assert_or_die

% check ResetKernel
ResetKernel
0 [ /local_num_threads ] get 1 eq assert_or_die

% use 4 threads again
0 << /local_num_threads threads >> SetStatus

% check if modulo node distribution works
/iaf_neuron 4 Create ;
[1 2 3 4 ] {
  dup threads mod exch [ /vp ] get eq assert_or_die
} forall

% check if /children_on_same_vp works
/subnet Create /sn Set
sn << /children_on_same_vp true >> SetStatus
sn ChangeSubnet
sn threads mod /snvp Set
/iaf_neuron 2 Create ;
sn GetGlobalNodes {
  [ /vp ] get snvp eq assert_or_die
} forall