#!/usr/bin/ruby

#
## Test 1
#

class Example {
    method foo(arg) {
        assert_eq(self{:bar}, arg);
    }
}

var obj = Example();

obj{:bar} = 21;     # add some value inside the object
obj.foo(21);        # call the method foo

do {
    local obj{:bar} = 42;       # localize the value of 'bar' to 42
    obj.foo(42);                # call the method foo
    assert_eq(obj{:bar}, 42);
}

obj.foo(21);               # the value of bar is unlocalized here
assert_eq(obj{:bar}, 21);  # test again to be sure


#
## Test 2
#

global x = 42;

do {
    assert_eq(x, 42);
    local x = 100;
    assert_eq(x, 100);
}

assert_eq(x, 42);

#
## Test 3 (multi-local)
#

global y = 99

do {
    local(x, y) = (1, 2)
    assert_eq(x, 1)
    assert_eq(y, 2)
}

assert_eq(x, 42)
assert_eq(y, 99)


say "** Test passed!";