1#!./perl -w
2$|=1;
3BEGIN {
4    if($ENV{PERL_CORE}) {
5	chdir 't' if -d 't';
6	@INC = '../lib';
7    }
8    require Config; import Config;
9    if ($Config{'extensions'} !~ /\bOpcode\b/ && $Config{'osname'} ne 'VMS') {
10        print "1..0\n";
11        exit 0;
12    }
13
14}
15
16# Tests Todo:
17#	'main' as root
18
19package test;	# test from somewhere other than main
20
21use vars qw($bar);
22
23use Opcode 1.00, qw(opdesc opset opset_to_ops opset_to_hex
24	opmask_add full_opset empty_opset opcodes opmask define_optag);
25
26use Safe 1.00;
27
28my $last_test; # initalised at end
29print "1..$last_test\n";
30
31my $t = 1;
32my $cpt;
33# create and destroy some automatic Safe compartments first
34$cpt = new Safe or die;
35$cpt = new Safe or die;
36$cpt = new Safe or die;
37
38$cpt = new Safe "Root" or die;
39
40foreach(1..3) {
41	$foo = 42;
42
43	$cpt->share(qw($foo));
44
45	print ${$cpt->varglob('foo')}       == 42 ? "ok $t\n" : "not ok $t\n"; $t++;
46
47	${$cpt->varglob('foo')} = 9;
48
49	print $foo == 9	? "ok $t\n" : "not ok $t\n"; $t++;
50
51	print $cpt->reval('$foo')       == 9	? "ok $t\n" : "not ok $t\n"; $t++;
52	# check 'main' has been changed:
53	print $cpt->reval('$::foo')     == 9	? "ok $t\n" : "not ok $t\n"; $t++;
54	print $cpt->reval('$main::foo') == 9	? "ok $t\n" : "not ok $t\n"; $t++;
55	# check we can't see our test package:
56	print $cpt->reval('$test::foo')     	? "not ok $t\n" : "ok $t\n"; $t++;
57	print $cpt->reval('${"test::foo"}')		? "not ok $t\n" : "ok $t\n"; $t++;
58
59	$cpt->erase;	# erase the compartment, e.g., delete all variables
60
61	print $cpt->reval('$foo') ? "not ok $t\n" : "ok $t\n"; $t++;
62
63	# Note that we *must* use $cpt->varglob here because if we used
64	# $Root::foo etc we would still see the original values!
65	# This seems to be because the compiler has created an extra ref.
66
67	print ${$cpt->varglob('foo')} ? "not ok $t\n" : "ok $t\n"; $t++;
68}
69
70print "ok $last_test\n";
71BEGIN { $last_test = 28 }
72