# Copyright 2009 Paul J. Davis # # This file is part of the python-spidermonkey package released # under the MIT license. import t @t.rt() def test_scope(rt): glbl = {} cx = rt.new_context(glbl=glbl) t.eq(cx.execute("var g=1; var x = 4; x * x;"), 16) t.eq(cx.add_global('a', 1), None) t.eq(cx.execute("g"), 1) t.eq(cx.execute("x"), 4) t.eq(glbl, {'g':1, 'a':1, 'x':4}) t.eq(cx.enter_scope(), None) t.eq(cx.execute("var dummy=0; var x = 5; x * x;"), 25) t.eq(cx.execute("g"), 1) t.eq(cx.execute("x"), 5) t.eq(cx.add_global('A', 1), None) t.eq(glbl, {'g':1, 'a':1, 'A':1, 'x':4}) t.eq(cx.leave_scope(), None) t.eq(cx.execute("a"), 1) t.eq(cx.execute("A"), 1) t.eq(cx.execute("g"), 1) t.eq(cx.execute("x"), 4) t.eq(glbl, {'g':1, 'a':1, 'A':1, 'x':4}) t.raises(Exception, cx.leave_scope) @t.rt() def test_named_scope(rt): glbl = {} cx = rt.new_context(glbl=glbl) t.eq(cx.enter_scope('s1'), None) t.eq('s1' in glbl, True) t.eq(cx.execute("var x = 5;"), None) t.eq(cx.enter_scope('s2'), None) t.eq('s2' in glbl, True) t.eq(cx.execute("var x = 9;"), None) t.eq(cx.enter_scope(), None) t.eq(cx.execute("s1.x"), 5) t.eq(cx.execute("s2.x"), 9) t.eq(cx.execute("x"), 9) t.eq(glbl['s1']['x'], 5) t.eq(glbl['s2']['x'], 9) t.eq(cx.leave_scope(), None) t.eq('s1' in glbl, True) t.eq('s2' in glbl, True) t.eq(cx.leave_scope(), None) t.eq('s1' in glbl, True) t.eq('s2' in glbl, False) t.eq(cx.leave_scope(), None) t.eq('s1' in glbl, False) t.eq('s2' in glbl, False) @t.rt() def test_leave_deleted_named_scope(rt): glbl = {} cx = rt.new_context(glbl=glbl) t.eq(cx.enter_scope('s1'), None) cx.rem_global('s1') # bad user! cx.leave_scope() # must be robust @t.rt() def test_delete(rt): glbl = {} cx = rt.new_context(glbl=glbl) t.eq(cx.enter_scope('s1'), None) t.eq(cx.enter_scope('s2'), None) t.eq(cx.enter_scope('s3'), None) t.eq('s1' in glbl, True) del cx # name gets deleted, not the object... how to test this case? ##t.eq(glbl, {})