def test_nested_sequence_persistence1():
    # Test writing a nested pulse sequence to a ConfigObj.
    root = RootSequence()
    context = BaseContext()
    root.context = context
    root.external_vars = {'a': 1.5}

    pulse1 = Pulse(def_1='1.0', def_2='{a}')
    pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0')
    pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10',
                   kind='Analogical', shape=SquareShape())
    seq = Sequence(items=[Pulse(def_1='{2_stop} + 0.5', def_2='10',
                                kind='Analogical', shape=SquareShape())])
    root.items.extend([pulse1, pulse2, pulse3, seq])

    pref = root.preferences_from_members()
    assert_items_equal(pref.keys(),
                       ['name', 'local_vars', 'time_constrained',
                        'enabled', 'item_class', 'sequence_duration',
                        'item_0', 'item_1', 'item_2', 'item_3',
                        'context', 'def_1', 'def_2', 'def_mode',
                        'external_vars'])
    assert_items_equal(pref['item_3'].keys(),
                       ['item_class', 'enabled', 'name', 'item_0',
                        'def_1', 'def_2', 'def_mode', 'local_vars',
                        'time_constrained'])
def test_build_from_config():
    # Test building a pulse sequence.
    root = RootSequence()
    context = BaseContext()
    root.context = context
    root.external_vars = {'a': 1.5}

    pulse1 = Pulse(def_1='1.0', def_2='{a}')
    pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0')
    pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10',
                   kind='Analogical', shape=SquareShape())
    seq = Sequence(items=[Pulse(def_1='{2_stop} + 0.5', def_2='10',
                                kind='Analogical', shape=SquareShape())])
    root.items.extend([pulse1, pulse2, pulse3, seq])

    pref = root.preferences_from_members()
    dependecies = {'pulses': {'Sequence': Sequence, 'Pulse': Pulse,
                              'shapes': {'SquareShape': SquareShape},
                              'contexts': {'BaseContext': BaseContext}}}

    aux = RootSequence.build_from_config(pref, dependecies)
    assert_equal(aux.external_vars, {'a': 1.5})
    assert_equal(len(aux.items), 4)
    assert_is_instance(aux.context, BaseContext)

    pulse1 = aux.items[0]
    assert_equal(pulse1.def_1, '1.0')
    assert_equal(pulse1.def_2, '{a}')

    pulse2 = aux.items[1]
    assert_equal(pulse2.def_1, '{a} + 1.0')
    assert_equal(pulse2.def_2, '3.0')

    pulse3 = aux.items[2]
    assert_equal(pulse3.def_1, '{2_stop} + 0.5')
    assert_equal(pulse3.def_2, '10')
    assert_equal(pulse3.kind, 'Analogical')
    assert_is_instance(pulse3.shape, SquareShape)

    seq = aux.items[3]
    assert_equal(len(seq.items), 1)
def test_walk_sequence():
    # Test walking a pulse sequence.
    root = RootSequence()
    context = BaseContext()
    root.context = context
    root.external_vars = {'a': 1.5}

    pulse1 = Pulse(def_1='1.0', def_2='{a}')
    pulse2 = Pulse(def_1='{a} + 1.0', def_2='3.0')
    pulse3 = Pulse(def_1='{2_stop} + 0.5', def_2='10',
                   kind='Analogical', shape=SquareShape())
    seq = Sequence(items=[Pulse(def_1='{2_stop} + 0.5', def_2='10',
                                kind='Analogical', shape=SquareShape())])
    root.items.extend([pulse1, pulse2, pulse3, seq])

    walk = root.walk(['item_class', 'shape_class'], {})

    flat = flatten_walk(walk, ['item_class', 'shape_class'])
    assert_in('item_class', flat)
    assert_equal(flat['item_class'],
                 set(['Pulse', 'RootSequence', 'Sequence']))
    assert_in('shape_class', flat)
    assert_equal(flat['shape_class'], set(['SquareShape']))