def test_context_update(spf):
    context = ContextDict(spf, None)
    child_context = context.create_child_context()
    context['t1'] = "hello world"
    child_context['t2'] = "hello2"
    assert child_context['t1'] == "hello world"
    child_context.update({'t1': "test1", 't2': "test2"})
    assert context['t1'] == "test1"
    assert child_context['t2'] == "test2"
def test_context_replace(spf):
    context = ContextDict(spf, None)
    child_context = context.create_child_context()
    context['t1'] = "hello world"
    assert child_context['t1'] == "hello world"
    child_context['t1'] = "goodbye world"
    assert context['t1'] != "goodbye world"
    del(child_context['t1'])
    child_context.replace('t1', 'goodbye world')
    assert context['t1'] == "goodbye world"
def test_context_pickle(spf):
    context = ContextDict(spf, None)
    child_context = context.create_child_context()
    child_context['t1'] = "hello world"
    p_bytes = pickle.dumps(child_context)
    un_p = pickle.loads(p_bytes)
    # the spf and the parent context are not the same as before, because
    # their state got pickled and unpicked too
    assert un_p._spf != spf
    assert un_p._parent_context != context
    assert un_p['t1'] == "hello world"
def test_recursive_dict(spf):
    context = ContextDict(spf, None)
    context['t1'] = "hello world"
    c2 = context.create_child_context()
    c2['t2'] = "hello 2"
    c3 = c2.create_child_context()
    c3['t3'] = "hello 3"
    context._parent_context = c3  # This is dodgy, why would anyone do this?
    exceptions = []
    try:
        _ = c2['t4']
    except RuntimeError as e:
        assert len(e.args) > 0
        assert "recursive" in str(e.args[0]).lower()
        exceptions.append(e)
    finally:
        assert len(exceptions) == 1