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