def test_bad_design_tree_spec():
    spec = {
        'main': [
            {
                'name': 'participant',
                'ivs': {
                    'a': [1, 2],
                    'b': [1, 2]
                },
                'number': 3,
                'ordering': 'Shuffle',
            },
            {
                'name': 'session',
                'ivs': {
                    'design': ['practice', 'test']
                },
                'design_matrix': [[0], [1], [1]],
            },
        ],
        'practice': [
            {
                'name': 'block'
            },
            {
                'name': 'trial',
                'ivs': {
                    'difficulty': [1, 2]
                },
                'n': 2,
                'order': 'Shuffle',
            },
        ],
        'test': [
            {
                'name': 'block',
                'n': 2,
            },
            [
                {
                    'name': 'trial',
                    'ivs': {
                        'difficulty': [1, 3]
                    },
                    'number': 2,
                    'order': 'Shuffle',
                },
                {
                    'name': 'not-trial',
                    'ivs': {
                        'difficulty': [5, 7]
                    },
                    'n': 3,
                    'order': 'Shuffle',
                },
            ],
        ],
    }
    with pytest.raises(ValueError):
        DesignTree.from_spec(spec)
def test_bad_design_tree_spec():
    spec = {
        'main':
        [
            {
                'name': 'participant',
                'ivs': {'a': [1, 2], 'b': [1, 2]},
                'number': 3,
                'ordering': 'Shuffle',
            },
            {
                'name': 'session',
                'ivs': {'design': ['practice', 'test']},
                'design_matrix': [[0], [1], [1]],
            },
        ],
        'practice':
        [
            {
                'name': 'block'
            },
            {
                'name': 'trial',
                'ivs': {'difficulty': [1, 2]},
                'n': 2,
                'order': 'Shuffle',
            },
        ],
        'test':
        [
            {
                'name': 'block',
                'n': 2,
            },
            [
                {
                    'name': 'trial',
                    'ivs': {'difficulty': [1, 3]},
                    'number': 2,
                    'order': 'Shuffle',
                },
                {
                    'name': 'not-trial',
                    'ivs': {'difficulty': [5, 7]},
                    'n': 3,
                    'order': 'Shuffle',
                },
            ],
        ],
    }
    with pytest.raises(ValueError):
        DesignTree.from_spec(spec)
def test_design_tree_from_spec():
    spec = {
        "main": [
            {"name": "participant", "ivs": {"a": [1, 2], "b": [1, 2]}, "number": 3, "ordering": "Shuffle"},
            {"name": "session", "ivs": {"design": ["practice", "test"]}, "design_matrix": [[0], [1], [1]]},
        ],
        "practice": [{"name": "block"}, {"name": "trial", "ivs": {"difficulty": [1, 2]}, "n": 2, "order": "Shuffle"}],
        "test": [
            {"name": "block", "n": 2},
            [
                {"name": "trial", "ivs": {"difficulty": [1, 3]}, "number": 2, "order": "Shuffle"},
                {"ivs": {"difficulty": [5, 7]}, "n": 3, "order": "Shuffle"},
            ],
        ],
    }
    tree = DesignTree.from_spec(spec)
    yield check_length, tree, 4
    participant = next(tree)
    yield check_length, participant, 3
    sessions = next(participant)
    yield check_type, sessions, dict
    yield check_length, sessions, 2
    yield check_length, sessions["practice"], 2
    yield check_length, sessions["test"], 2
    yield check_equality, sessions["practice"].levels_and_designs[0][0], "block"
    yield check_equality, sessions["test"].levels_and_designs[0][0], "block"
    practice_block = next(sessions["practice"])
    test_block = next(sessions["test"])
    yield check_equality, practice_block.levels_and_designs[0][0], "trial"
    yield check_equality, test_block.levels_and_designs[0][0], "trial"
def test_bad_design_tree_spec():
    spec = {
        "main": [
            {"name": "participant", "ivs": {"a": [1, 2], "b": [1, 2]}, "number": 3, "ordering": "Shuffle"},
            {"name": "session", "ivs": {"design": ["practice", "test"]}, "design_matrix": [[0], [1], [1]]},
        ],
        "practice": [{"name": "block"}, {"name": "trial", "ivs": {"difficulty": [1, 2]}, "n": 2, "order": "Shuffle"}],
        "test": [
            {"name": "block", "n": 2},
            [
                {"name": "trial", "ivs": {"difficulty": [1, 3]}, "number": 2, "order": "Shuffle"},
                {"name": "not-trial", "ivs": {"difficulty": [5, 7]}, "n": 3, "order": "Shuffle"},
            ],
        ],
    }
    with pytest.raises(ValueError):
        DesignTree.from_spec(spec)
def test_simple_design_tree_spec():
    spec = [
        {"name": "participant", "ivs": {"a": [1, 2], "b": [1, 2]}, "number": 3, "ordering": "Shuffle"},
        {"ivs": {"type": ["over", "under"]}, "design_matrix": [[0], [1], [1]]},
    ]
    tree = DesignTree.from_spec(spec)
    yield check_length, tree, 2
    yield check_equality, next(tree), next(tree)
    participant = next(tree)
    yield check_length, participant, 1
    yield check_equality, participant.levels_and_designs[0][0], None
def test_simple_design_tree_spec():
    spec = [
        {
            'name': 'participant',
            'ivs': {'a': [1, 2], 'b': [1, 2]},
            'number': 3,
            'ordering': 'Shuffle',
        },
        {
            'ivs': {'type': ['over', 'under']},
            'design_matrix': [[0], [1], [1]],
        },
    ]
    tree = DesignTree.from_spec(spec)
    yield check_length, tree, 2
    yield check_equality, next(tree), next(tree)
    participant = next(tree)
    yield check_length, participant, 1
    yield check_equality, participant.levels_and_designs[0][0], None
def test_simple_design_tree_spec():
    spec = [
        {
            'name': 'participant',
            'ivs': {
                'a': [1, 2],
                'b': [1, 2]
            },
            'number': 3,
            'ordering': 'Shuffle',
        },
        {
            'ivs': {
                'type': ['over', 'under']
            },
            'design_matrix': [[0], [1], [1]],
        },
    ]
    tree = DesignTree.from_spec(spec)
    yield check_length, tree, 2
    yield check_equality, next(tree), next(tree)
    participant = next(tree)
    yield check_length, participant, 1
    yield check_equality, participant.levels_and_designs[0][0], None
def test_design_tree_from_spec():
    spec = {
        'main':
        [
            {
                'name': 'participant',
                'ivs': {'a': [1, 2], 'b': [1, 2]},
                'number': 3,
                'ordering': 'Shuffle',
            },
            {
                'name': 'session',
                'ivs': {'design': ['practice', 'test']},
                'design_matrix': [[0], [1], [1]],
            },
        ],
        'practice':
        [
            {
                'name': 'block'
            },
            {
                'name': 'trial',
                'ivs': {'difficulty': [1, 2]},
                'n': 2,
                'order': 'Shuffle',
            },
        ],
        'test':
        [
            {
                'name': 'block',
                'n': 2,
            },
            [
                {
                    'name': 'trial',
                    'ivs': {'difficulty': [1, 3]},
                    'number': 2,
                    'order': 'Shuffle',
                },
                {
                    'ivs': {'difficulty': [5, 7]},
                    'n': 3,
                    'order': 'Shuffle',
                },
            ],
        ],
    }
    tree = DesignTree.from_spec(spec)
    yield check_length, tree, 4
    participant = next(tree)
    yield check_length, participant, 3
    sessions = next(participant)
    yield check_type, sessions, dict
    yield check_length, sessions, 2
    yield check_length, sessions['practice'], 2
    yield check_length, sessions['test'], 2
    yield check_equality, sessions['practice'].levels_and_designs[0][0], 'block'
    yield check_equality, sessions['test'].levels_and_designs[0][0], 'block'
    practice_block = next(sessions['practice'])
    test_block = next(sessions['test'])
    yield check_equality, practice_block.levels_and_designs[0][0], 'trial'
    yield check_equality, test_block.levels_and_designs[0][0], 'trial'
def test_design_tree_from_spec():
    spec = {
        'main': [
            {
                'name': 'participant',
                'ivs': {
                    'a': [1, 2],
                    'b': [1, 2]
                },
                'number': 3,
                'ordering': 'Shuffle',
            },
            {
                'name': 'session',
                'ivs': {
                    'design': ['practice', 'test']
                },
                'design_matrix': [[0], [1], [1]],
            },
        ],
        'practice': [
            {
                'name': 'block'
            },
            {
                'name': 'trial',
                'ivs': {
                    'difficulty': [1, 2]
                },
                'n': 2,
                'order': 'Shuffle',
            },
        ],
        'test': [
            {
                'name': 'block',
                'n': 2,
            },
            [
                {
                    'name': 'trial',
                    'ivs': {
                        'difficulty': [1, 3]
                    },
                    'number': 2,
                    'order': 'Shuffle',
                },
                {
                    'ivs': {
                        'difficulty': [5, 7]
                    },
                    'n': 3,
                    'order': 'Shuffle',
                },
            ],
        ],
    }
    tree = DesignTree.from_spec(spec)
    yield check_length, tree, 4
    participant = next(tree)
    yield check_length, participant, 3
    sessions = next(participant)
    yield check_type, sessions, dict
    yield check_length, sessions, 2
    yield check_length, sessions['practice'], 2
    yield check_length, sessions['test'], 2
    yield check_equality, sessions['practice'].levels_and_designs[0][
        0], 'block'
    yield check_equality, sessions['test'].levels_and_designs[0][0], 'block'
    practice_block = next(sessions['practice'])
    test_block = next(sessions['test'])
    yield check_equality, practice_block.levels_and_designs[0][0], 'trial'
    yield check_equality, test_block.levels_and_designs[0][0], 'trial'