package interpreter import ( "testing" ) func TestDefineAndGet(t *testing.T) { env := newEnvironment(nil) env.define("x", 42) value := env.get("x") if value != 42 { t.Errorf("expected 42, got %v", value) } } func TestGetUndefinedVariable(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("expected panic for undefined variable") } }() env := newEnvironment(nil) env.get("x") } func TestAssign(t *testing.T) { env := newEnvironment(nil) env.define("x", 42) env.assign("x", 43) value := env.get("x") if value != 43 { t.Errorf("expected 43, got %v", value) } } func TestAssignUndefinedVariable(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("expected panic for assigning undefined variable") } }() env := newEnvironment(nil) env.assign("x", 43) } func TestEnclosingEnvironmentGet(t *testing.T) { global := newEnvironment(nil) global.define("x", 42) local := newEnvironment(global) value := local.get("x") if value != 42 { t.Errorf("expected 42, got %v", value) } } func TestEnclosingEnvironmentAssign(t *testing.T) { global := newEnvironment(nil) global.define("x", 42) local := newEnvironment(global) local.assign("x", 43) value := global.get("x") if value != 43 { t.Errorf("expected 43, got %v", value) } } func TestEnclosingEnvironmentAssignUndefined(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("expected panic for assigning undefined variable in enclosing environment") } }() global := newEnvironment(nil) local := newEnvironment(global) local.assign("x", 43) }