|
|
@@ -9,10 +9,9 @@ |
|
|
from core import state # module under test
|
|
|
from core import util
|
|
|
|
|
|
# Hm this doesn't use scope_e or var_flags_e
|
|
|
scope = runtime.scope
|
|
|
scope_e = runtime.scope_e
|
|
|
value_e = runtime.value_e
|
|
|
var_flags = runtime.var_flags
|
|
|
var_flags_e = runtime.var_flags_e
|
|
|
|
|
|
|
|
|
class MemTest(unittest.TestCase):
|
|
|
@@ -33,7 +32,7 @@ def testSetVarClearFlag(self): |
|
|
|
|
|
# local x=y
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('x'), runtime.Str('y'), (), scope.LocalOnly)
|
|
|
runtime.LhsName('x'), runtime.Str('y'), (), scope_e.LocalOnly)
|
|
|
self.assertEqual('y', mem.var_stack[-1]['x'].val.s)
|
|
|
|
|
|
# New frame
|
|
|
@@ -42,78 +41,78 @@ def testSetVarClearFlag(self): |
|
|
|
|
|
# x=y -- test out dynamic scope
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('x'), runtime.Str('YYY'), (), scope.Dynamic)
|
|
|
runtime.LhsName('x'), runtime.Str('YYY'), (), scope_e.Dynamic)
|
|
|
self.assertEqual('YYY', mem.var_stack[-2]['x'].val.s)
|
|
|
self.assertEqual(None, mem.var_stack[-1].get('x'))
|
|
|
|
|
|
# myglobal=g
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('myglobal'), runtime.Str('g'), (), scope.Dynamic)
|
|
|
runtime.LhsName('myglobal'), runtime.Str('g'), (), scope_e.Dynamic)
|
|
|
self.assertEqual('g', mem.var_stack[0]['myglobal'].val.s)
|
|
|
self.assertEqual(False, mem.var_stack[0]['myglobal'].exported)
|
|
|
|
|
|
# 'export PYTHONPATH=/'
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('PYTHONPATH'), runtime.Str('/'), (var_flags.Exported,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('PYTHONPATH'), runtime.Str('/'), (var_flags_e.Exported,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual('/', mem.var_stack[0]['PYTHONPATH'].val.s)
|
|
|
self.assertEqual(True, mem.var_stack[0]['PYTHONPATH'].exported)
|
|
|
|
|
|
self.assertEqual({'PYTHONPATH': '/'}, mem.GetExported())
|
|
|
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('PYTHONPATH'), None, (var_flags.Exported,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('PYTHONPATH'), None, (var_flags_e.Exported,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(True, mem.var_stack[0]['PYTHONPATH'].exported)
|
|
|
|
|
|
# 'export myglobal'. None means don't touch it. Undef would be confusing
|
|
|
# because it might mean "unset", but we have a separated API for that.
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('myglobal'), None, (var_flags.Exported,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('myglobal'), None, (var_flags_e.Exported,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(True, mem.var_stack[0]['myglobal'].exported)
|
|
|
|
|
|
# export g2 -- define and export empty
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('g2'), None, (var_flags.Exported,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('g2'), None, (var_flags_e.Exported,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(value_e.Undef, mem.var_stack[0]['g2'].val.tag)
|
|
|
self.assertEqual(True, mem.var_stack[0]['g2'].exported)
|
|
|
|
|
|
# readonly myglobal
|
|
|
self.assertEqual(False, mem.var_stack[0]['myglobal'].readonly)
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('myglobal'), None, (var_flags.ReadOnly,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('myglobal'), None, (var_flags_e.ReadOnly,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(True, mem.var_stack[0]['myglobal'].readonly)
|
|
|
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('PYTHONPATH'), runtime.Str('/lib'), (),
|
|
|
scope.Dynamic)
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual('/lib', mem.var_stack[0]['PYTHONPATH'].val.s)
|
|
|
self.assertEqual(True, mem.var_stack[0]['PYTHONPATH'].exported)
|
|
|
|
|
|
# COMPREPLY=(1 2 3)
|
|
|
# invariant to enforce: arrays can't be exported
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('COMPREPLY'), runtime.StrArray(['1', '2', '3']),
|
|
|
(), scope.GlobalOnly)
|
|
|
(), scope_e.GlobalOnly)
|
|
|
self.assertEqual(['1', '2', '3'], mem.var_stack[0]['COMPREPLY'].val.strs)
|
|
|
|
|
|
# export COMPREPLY
|
|
|
try:
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('COMPREPLY'), None, (var_flags.Exported,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('COMPREPLY'), None, (var_flags_e.Exported,),
|
|
|
scope_e.Dynamic)
|
|
|
except util.FatalRuntimeError as e:
|
|
|
pass
|
|
|
else:
|
|
|
self.fail("Expected failure")
|
|
|
|
|
|
# readonly r=1
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('r'), runtime.Str('1'), (var_flags.ReadOnly,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('r'), runtime.Str('1'), (var_flags_e.ReadOnly,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual('1', mem.var_stack[0]['r'].val.s)
|
|
|
self.assertEqual(False, mem.var_stack[0]['r'].exported)
|
|
|
self.assertEqual(True, mem.var_stack[0]['r'].readonly)
|
|
|
@@ -122,58 +121,58 @@ def testSetVarClearFlag(self): |
|
|
# r=newvalue
|
|
|
try:
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('r'), runtime.Str('newvalue'), (), scope.Dynamic)
|
|
|
runtime.LhsName('r'), runtime.Str('newvalue'), (), scope_e.Dynamic)
|
|
|
except util.FatalRuntimeError as e:
|
|
|
pass
|
|
|
else:
|
|
|
self.fail("Expected failure")
|
|
|
|
|
|
# readonly r2 -- define empty readonly
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('r2'), None, (var_flags.ReadOnly,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('r2'), None, (var_flags_e.ReadOnly,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(value_e.Undef, mem.var_stack[0]['r2'].val.tag)
|
|
|
self.assertEqual(True, mem.var_stack[0]['r2'].readonly)
|
|
|
|
|
|
# export -n PYTHONPATH
|
|
|
# Remove the exported property. NOTE: scope is LocalOnly for Oil?
|
|
|
self.assertEqual(True, mem.var_stack[0]['PYTHONPATH'].exported)
|
|
|
mem.ClearFlag('PYTHONPATH', var_flags.Exported, scope.Dynamic)
|
|
|
mem.ClearFlag('PYTHONPATH', var_flags_e.Exported, scope_e.Dynamic)
|
|
|
self.assertEqual(False, mem.var_stack[0]['PYTHONPATH'].exported)
|
|
|
|
|
|
# a[2]=2
|
|
|
mem.SetVar(
|
|
|
runtime.LhsIndexedName('a', 1), runtime.Str('2'), (),
|
|
|
scope.Dynamic)
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(['', '2'], mem.var_stack[0]['a'].val.strs)
|
|
|
|
|
|
# a[2]=3
|
|
|
mem.SetVar(
|
|
|
runtime.LhsIndexedName('a', 1), runtime.Str('3'), (),
|
|
|
scope.Dynamic)
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(['', '3'], mem.var_stack[0]['a'].val.strs)
|
|
|
|
|
|
# a[2]=(x y z) # illegal
|
|
|
try:
|
|
|
mem.SetVar(
|
|
|
runtime.LhsIndexedName('a', 1), runtime.StrArray(['x', 'y', 'z']), (),
|
|
|
scope.Dynamic)
|
|
|
scope_e.Dynamic)
|
|
|
except util.FatalRuntimeError as e:
|
|
|
pass
|
|
|
else:
|
|
|
self.fail("Expected failure")
|
|
|
|
|
|
# readonly a
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('a'), None, (var_flags.ReadOnly,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('a'), None, (var_flags_e.ReadOnly,),
|
|
|
scope_e.Dynamic)
|
|
|
self.assertEqual(True, mem.var_stack[0]['a'].readonly)
|
|
|
|
|
|
try:
|
|
|
# a[2]=3
|
|
|
mem.SetVar(
|
|
|
runtime.LhsIndexedName('a', 1), runtime.Str('3'), (),
|
|
|
scope.Dynamic)
|
|
|
scope_e.Dynamic)
|
|
|
except util.FatalRuntimeError as e:
|
|
|
pass
|
|
|
else:
|
|
|
@@ -184,13 +183,13 @@ def testGetVar(self): |
|
|
|
|
|
# readonly a=x
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('a'), runtime.Str('x'), (var_flags.ReadOnly,),
|
|
|
scope.Dynamic)
|
|
|
runtime.LhsName('a'), runtime.Str('x'), (var_flags_e.ReadOnly,),
|
|
|
scope_e.Dynamic)
|
|
|
|
|
|
val = mem.GetVar('a', scope.Dynamic)
|
|
|
val = mem.GetVar('a', scope_e.Dynamic)
|
|
|
self.assertEqual(runtime.Str('x'), val)
|
|
|
|
|
|
val = mem.GetVar('undef', scope.Dynamic)
|
|
|
val = mem.GetVar('undef', scope_e.Dynamic)
|
|
|
self.assertEqual(runtime.Undef(), val)
|
|
|
|
|
|
def testExportThenAssign(self):
|
|
|
@@ -199,25 +198,25 @@ def testExportThenAssign(self): |
|
|
|
|
|
# export U
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('U'), None, (var_flags.Exported,), scope.Dynamic)
|
|
|
runtime.LhsName('U'), None, (var_flags_e.Exported,), scope_e.Dynamic)
|
|
|
print(mem)
|
|
|
|
|
|
# U=u
|
|
|
mem.SetVar(
|
|
|
runtime.LhsName('U'), runtime.Str('u'), (), scope.Dynamic)
|
|
|
runtime.LhsName('U'), runtime.Str('u'), (), scope_e.Dynamic)
|
|
|
print(mem)
|
|
|
e = mem.GetExported()
|
|
|
self.assertEqual({'U': 'u'}, e)
|
|
|
|
|
|
def testUnset(self):
|
|
|
mem = state.Mem('', [], {})
|
|
|
# unset a
|
|
|
mem.Unset(runtime.LhsName('a'), scope.Dynamic)
|
|
|
mem.Unset(runtime.LhsName('a'), scope_e.Dynamic)
|
|
|
|
|
|
return # not implemented yet
|
|
|
|
|
|
# unset a[1]
|
|
|
mem.Unset(runtime.LhsIndexedName('a', 1), scope.Dynamic)
|
|
|
mem.Unset(runtime.LhsIndexedName('a', 1), scope_e.Dynamic)
|
|
|
|
|
|
def testArgv(self):
|
|
|
mem = state.Mem('', [], {})
|
|
|
|