The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -I../../lib

# Test Scalar vs Scalar1 functionality

use strict;
use Test::More tests => 21;

# Find the module (1 test)
BEGIN {use_ok('Readonly'); }

sub expected
{
    my $line = shift;
    $@ =~ s/\.$//;   # difference between croak and die
    return "Modification of a read-only value attempted at " . __FILE__ . " line $line\n";
}

use vars qw/$s1 $s2 $s3 $s4/;
my $m1 = 17;
my $m2 = \$m1;

# Create (4 tests)
eval {Readonly::Scalar1 $s1 => ["this", "is", "a", "test", {x => 5}]};
is $@ => '', 'Create a shallow reference scalar';
eval {Readonly::Scalar  $s2 => ["this", "is", "a", "test", {x => 5}]};
is $@ => '', 'Create a deep reference scalar';
eval {Readonly::Scalar1 $s3 => $m2};
is $@ => '', 'Create a shallow scalar ref';
eval {Readonly::Scalar  $s4 => $m2};
is $@ => '', 'Create a deep scalar ref';

# Modify (16 tests)
eval {$s1 = 7};
is $@ => expected(__LINE__-1), 'Modify s1';
eval {$s2 = 7};
is $@ => expected(__LINE__-1), 'Modify s2';
eval {$s3 = 7};
is $@ => expected(__LINE__-1), 'Modify s3';
eval {$s4 = 7};
is $@ => expected(__LINE__-1), 'Modify s4';

eval {$s1->[2] = "the"};
is $@ => '', 'Deep-modify s1';
is $s1->[2] => 'the', 's1 modification successful';

eval {$s2->[2] = "the"};
is $@ => expected(__LINE__-1), 'Deep-modify s2';
is $s2->[2] => 'a', 's2 modification supposed to fail';

eval {$s1->[4]{z} = 42};
is $@ => '', 'Deep-deep modify s1';
is $s1->[4]{z} => 42, 's1 mod successful';

eval {$s2->[4]{z} = 42};
is $@ => expected(__LINE__-1), 'Deep-deep modify s2';
ok !exists($s2->[4]{z}), 's2 mod supposed to fail';

eval {$$s4 = 21};
is $@ => expected(__LINE__-1), 'Deep-modify s4 should fail';
is $m1 => 17, 's4 mod should fail';

eval {$$s3 = "bah"};
is $@ => '', 'deep s3 mod';
is $m1 => 'bah', 'deep s3 mod';