1#!perl -I..
2
3# Test Scalar vs Scalar1 functionality
4
5use strict;
6use Test::More tests => 21;
7
8# Find the module (1 test)
9BEGIN {use_ok('Readonly'); }
10
11sub expected
12{
13    my $line = shift;
14    $@ =~ s/\.$//;   # difference between croak and die
15    return "Modification of a read-only value attempted at " . __FILE__ . " line $line\n";
16}
17
18use vars qw/$s1 $s2 $s3 $s4/;
19my $m1 = 17;
20my $m2 = \$m1;
21
22# Create (4 tests)
23eval {Readonly::Scalar1 $s1 => ["this", "is", "a", "test", {x => 5}]};
24is $@ => '', 'Create a shallow reference scalar';
25eval {Readonly::Scalar  $s2 => ["this", "is", "a", "test", {x => 5}]};
26is $@ => '', 'Create a deep reference scalar';
27eval {Readonly::Scalar1 $s3 => $m2};
28is $@ => '', 'Create a shallow scalar ref';
29eval {Readonly::Scalar  $s4 => $m2};
30is $@ => '', 'Create a deep scalar ref';
31
32# Modify (16 tests)
33eval {$s1 = 7};
34is $@ => expected(__LINE__-1), 'Modify s1';
35eval {$s2 = 7};
36is $@ => expected(__LINE__-1), 'Modify s2';
37eval {$s3 = 7};
38is $@ => expected(__LINE__-1), 'Modify s3';
39eval {$s4 = 7};
40is $@ => expected(__LINE__-1), 'Modify s4';
41
42eval {$s1->[2] = "the"};
43is $@ => '', 'Deep-modify s1';
44is $s1->[2] => 'the', 's1 modification successful';
45
46eval {$s2->[2] = "the"};
47is $@ => expected(__LINE__-1), 'Deep-modify s2';
48is $s2->[2] => 'a', 's2 modification supposed to fail';
49
50eval {$s1->[4]{z} = 42};
51is $@ => '', 'Deep-deep modify s1';
52is $s1->[4]{z} => 42, 's1 mod successful';
53
54eval {$s2->[4]{z} = 42};
55is $@ => expected(__LINE__-1), 'Deep-deep modify s2';
56ok !exists($s2->[4]{z}), 's2 mod supposed to fail';
57
58eval {$$s4 = 21};
59is $@ => expected(__LINE__-1), 'Deep-modify s4 should fail';
60is $m1 => 17, 's4 mod should fail';
61
62eval {$$s3 = "bah"};
63is $@ => '', 'deep s3 mod';
64is $m1 => 'bah', 'deep s3 mod';
65