/*
 *  test_get_node_fncs.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_get_node_fncs - sli script for test of Get(Local/Global)(Nodes/Leaves/Children)

Synopsis: nest_indirect test_get_node_fncs --> success

Description:

 The following network is created

      0
    __|__
   / / \ \
  1 2   3 4
      __|__
     / / \ \
     5 6  7 8
            |
           / \
          9   10

 where the gids 0, 3, 4, 7 and 8 refer to subnets.

 test_get_node_fncs checks if GetGlobalNodes, GetLocalNodes,
 GetGlobalLeaves, GetLocalLeaves, GetGlobalChildren, GetLocalChildren
 return the correct array of gids when given the subnet gids 0, 3, 8
 and 4.

Author: February 2012, Kunkel
*/

/unittest (9715) require
/unittest using

[1 2 4] % check for 1, 2 and 4 processes
{
  /iaf_neuron 2 Create ; % gids 1,2

  /subnet 2 Create ;     % gids 3,4
  3 ChangeSubnet

  /iaf_neuron 2 Create ; % gids 5,6

  /subnet 2 Create ;     % gids 7,8
  8 ChangeSubnet

  /iaf_neuron 2 Create ; % gids 9,10
  0 GetGlobalNodes [1 2 3 4 5 6 7 8 9 10] eq
  3 GetGlobalNodes [5 6 7 8 9 10] eq and
  8 GetGlobalNodes [9 10] eq and
  4 GetGlobalNodes empty exch pop and

  0 GetLocalNodes [1 2 3 4 5 6 7 8 9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  3 GetLocalNodes [5 6 7 8 9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  8 GetLocalNodes [9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  4 GetLocalNodes empty exch pop and

  0 GetGlobalLeaves [1 2 5 6 9 10] eq and
  3 GetGlobalLeaves [5 6 9 10] eq and
  8 GetGlobalLeaves [9 10] eq and
  4 GetGlobalLeaves empty exch pop and

  0 GetLocalLeaves [1 2 5 6 9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  3 GetLocalLeaves [5 6 9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  8 GetLocalLeaves [9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  4 GetLocalLeaves empty exch pop and

  0 GetGlobalChildren [1 2 3 4] eq and
  3 GetGlobalChildren [5 6 7 8] eq and
  8 GetGlobalChildren [9 10] eq and
  4 GetGlobalChildren empty exch pop and

  0 GetLocalChildren [1 2 3 4] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  3 GetLocalChildren [5 6 7 8] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  8 GetLocalChildren [9 10] {dup [3 4 7 8] exch MemberQ exch NumProcesses mod Rank eq or} Select eq and
  4 GetLocalChildren empty exch pop and
}
distributed_collect_assert_or_die