/*
 *  ticket-460.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-460 - Check that local and global Get{Node/Leaves/Children} work

Synopsis: (ticket-460) run -> NEST exits if test fails

Description:
 This test creates a network and extracts nodes, leaves and children both locally 
 and globally.

Note:
 This should be run with 1 and 2 MPI processes automatically.
 
Author: Hans Ekkehard Plesser, 2010-09-24
 */

/unittest (9715) require
/unittest using

[1 2]
{
 M_INFO setverbosity

 ResetKernel
 /s1 /subnet Create def   % gid 1
 s1 ChangeSubnet
 /s2 /subnet Create def   % gid 2
 /s3 /subnet Create def   % gid 3

 0 ChangeSubnet
 /voltmeter 2 Create  ;   % gid 4,5

 /iaf_neuron 2 Create ;   % gid 6,7

 s2 ChangeSubnet
 /iaf_neuron 6 Create ;   % gid 8,9,10,11,12,13
 s1 ChangeSubnet
 /iaf_neuron 4 Create ;   % gid 14,15,16,17
 s3 ChangeSubnet
 /iaf_neuron 3 Create ;   % gid 18,19,20

 0 GetGlobalNodes    Sort [1 20] Range eq % 1..20
 0 GetGlobalLeaves   Sort [4 20] Range eq  % 4..20
 0 GetGlobalChildren Sort [1 4 5 6 7]  eq  % 1, 4..5, 6..7

 NumProcesses 1 eq {
  % 1 mpi process: local == global
  0 GetLocalNodes    Sort [1 20] Range eq % 1..20
  0 GetLocalLeaves   Sort [4 20] Range eq  % 4..20
  0 GetLocalChildren Sort [1 4 5 6 7]  eq  % 1, 4..5, 6..7
 }
 {
  NumProcesses 2 eq {
     Rank 0 eq {
       0 GetLocalNodes    Sort [1 5] Range [6 20 2] Range join eq
       0 GetLocalLeaves   Sort [4 5] [6 20 2] Range join eq
       0 GetLocalChildren Sort [1 4 5 6] eq 
     }
     {
       0 GetLocalNodes    Sort [1 5] Range [7 20 2] Range join eq
       0 GetLocalLeaves   Sort [4 5] [7 20 2] Range join eq
       0 GetLocalChildren Sort [1 4 5 7] eq 
     } 
     ifelse
  }
  {
   (ERROR: only 1 or 2 procs) ==
  }
  ifelse
 }
 ifelse

 6 arraystore true exch { and } Fold  % all jobs of all runs should return true
}
distributed_collect_assert_or_die