def test_stacked_dict_with_newpop():
    '''Test that stacked.pop has the same semantics has dict.pop.'''
    from xoutil.collections import StackedDict
    sd = StackedDict(a='level-0', b=1)
    assert sd.pop('a') == 'level-0'
    assert sd.pop('non', sd) is sd
    try:
        sd.pop('non')
    except KeyError:
        pass
    else:
        assert False, 'Should have raised a KeyError'
def test_stacked_dict():
    from xoutil.collections import StackedDict
    sd = StackedDict(a='level-0')
    assert sd.peek() == dict(a='level-0')
    sd.push_level(a=1, b=2, c=10)
    assert sd.level == 1
    assert sd.peek() == dict(a=1, b=2, c=10)
    sd.push_level(b=4, c=5)
    assert sd.peek() == dict(b=4, c=5)
    assert sd.level == 2
    assert sd['b'] == 4
    assert sd['a'] == 1
    assert sd['c'] == 5
    assert len(sd) == 3
    del sd['c']
    try:
        del sd['c']
        assert False, 'Should have raise KeyError'
    except KeyError:
        pass
    except:
        assert False, 'Should have raise KeyError'
    assert sd.pop_level() == {'b': 4}
    assert sd['b'] == 2
    assert sd['a'] == 1
    assert len(sd) == 3
    sd.pop_level()
    assert sd['a'] == 'level-0'
    try:
        sd.pop_level()
        assert False, ('Level 0 cannot be poped. '
                       'It should have raised a TypeError')
    except TypeError:
        pass
    except:
        assert False, ('Level 0 cannot be poped. '
                       'It should have raised a TypeError')