package bar;
use Test::More tests => 20;
BEGIN { use_ok('types') };
use types;
my int $int;
my float $float;
eval '$int = $float;';
like($@, qr/Type mismatch, can't sassign float \(\$float\) to int \(\$int\)/, "Check that we get type mismatch");
package foo;
{
no types;
eval '$int = $float;';
use Test::More;
is($@,"", "no type checking for this lexical scope");
}
package bar;
eval '$int = $float;';
is($@, 'Type mismatch, can\'t sassign float ($float) to int ($int) at (eval 8):1'."\n", "Check that we get type mismatch");
eval '$int = $float = $int;';
is($@, "Type mismatch, can't sassign float (\$float) to int (\$int) at (eval 10):1\n", "Workes nested aswell");
{
my int $int = 1;
eval '$int = 1.2';
like($@, qr/sassign float \(constant '1.2'\) to int \(\$int\)/, "Can't sassign float constant to integer" );
eval '$int = "hi"';
like($@, qr/sassign string \(constant 'hi'\) to int \(\$int\)/, "Can't sassign string to integer" );
my float $float = 2.3;
eval '$float = 5';
is($@, "", "Can assign integer constant to float");
eval '$float = "hi"';
like($@, qr/assign string \(constant 'hi'\) to float \(\$float\)/, "Can't assign string to float" );
my number $number = 2;
is($number, 2, "Number can be int (constant)");
$number = 2.5;
is($number, 2.5, "Number can be float (constant)");
$number = $int;
is($number, 1, "Number can be int");
$number = $float;
is($number, 5, "Number can float");
eval '$number = "hi"';
like($@, qr/assign string \(constant 'hi'\) to number \(\$number\)/, "Can't assign string to number" );
my string $string = "hi";
$string = $int;
is($string, 1, "Int can be assigned to string");
$string = 20;
is($string, 20, "Constant int can be assigned to string");
$string = $float;
is($string, 5, "Float can be assigned to string");
$string = 5.5;
is($string, 5.5, "Constant float can be assigned to string");
$string = $number;
is($string, 5, "Number can be assigned to string");
my $foo = 1;
$foo = 2.2;
$foo = "hi";
pass("Untyped lexicals can still access constant");
}