1#!./perl 2 3use strict; 4use warnings; 5 6use Scalar::Util qw(dualvar isdual); 7use Test::More tests => 41; 8use Config; 9 10my $var; 11$var = dualvar( 2.2,"string"); 12 13ok( isdual($var), 'Is a dualvar'); 14ok( $var == 2.2, 'Numeric value'); 15ok( $var eq "string", 'String value'); 16 17my $var2 = $var; 18 19ok( isdual($var2), 'Is a dualvar'); 20ok( $var2 == 2.2, 'copy Numeric value'); 21ok( $var2 eq "string", 'copy String value'); 22 23$var++; 24 25ok( ! isdual($var), 'No longer dualvar'); 26ok( $var == 3.2, 'inc Numeric value'); 27ok( $var ne "string", 'inc String value'); 28 29my $numstr = "10.2"; 30my $numtmp = int($numstr); # use $numstr as an int 31 32$var = dualvar($numstr, ""); 33 34ok( isdual($var), 'Is a dualvar'); 35ok( $var == $numstr, 'NV'); 36 37SKIP: { 38 skip("dualvar with UV value known to fail with $]",3) if $] < 5.006_001; 39 my $bits = ($Config{'use64bitint'}) ? 63 : 31; 40 $var = dualvar(1<<$bits, ""); 41 ok( isdual($var), 'Is a dualvar'); 42 ok( $var == (1<<$bits), 'UV 1'); 43 ok( $var > 0, 'UV 2'); 44} 45 46# Create a dualvar "the old fashioned way" 47$var = "10"; 48ok( ! isdual($var), 'Not a dualvar'); 49my $foo = $var + 0; 50ok( isdual($var), 'Is a dualvar'); 51 52{ 53 package Tied; 54 55 sub TIESCALAR { bless {} } 56 sub FETCH { 7.5 } 57} 58 59tie my $tied, 'Tied'; 60$var = dualvar($tied, "ok"); 61ok(isdual($var), 'Is a dualvar'); 62ok($var == 7.5, 'Tied num'); 63ok($var eq 'ok', 'Tied str'); 64 65 66SKIP: { 67 skip("need utf8::is_utf8",2) unless defined &utf8::is_utf8; 68 ok(!!utf8::is_utf8(dualvar(1,chr(400))), 'utf8'); 69 ok( !utf8::is_utf8(dualvar(1,"abc")), 'not utf8'); 70} 71 72BEGIN { 73 if($Config{'useithreads'}) { 74 require threads; import threads; 75 require threads::shared; import threads::shared; 76 require constant; import constant HAVE_THREADS => 1; 77 } 78 else { 79 require constant; import constant HAVE_THREADS => 0; 80 } 81} 82 83SKIP: { 84 skip("Perl not compiled with 'useithreads'",20) unless HAVE_THREADS; 85 skip("Requires threads::shared v1.42 or later",20) unless ($threads::shared::VERSION >= 1.42); 86 87 my $siv; 88 share($siv); 89 $siv = dualvar(42, 'Fourty-Two'); 90 91 my $snv; 92 share($snv); 93 $snv = dualvar(3.14, 'PI'); 94 95 my $suv; 96 share($suv); 97 my $bits = ($Config{'use64bitint'}) ? 63 : 31; 98 $suv = dualvar(1<<$bits, 'Large unsigned int'); 99 100 ok($siv == 42, 'Shared IV number preserved'); 101 ok($siv eq 'Fourty-Two', 'Shared string preserved'); 102 ok(isdual($siv), 'Is a dualvar'); 103 ok($snv == 3.14, 'Shared NV number preserved'); 104 ok($snv eq 'PI', 'Shared string preserved'); 105 ok(isdual($snv), 'Is a dualvar'); 106 ok($suv == (1<<$bits), 'Shared UV number preserved'); 107 ok($suv > 0, 'Shared UV number preserved'); 108 ok($suv eq 'Large unsigned int', 'Shared string preserved'); 109 ok(isdual($suv), 'Is a dualvar'); 110 111 my @ary; 112 share(@ary); 113 $ary[0] = $siv; 114 $ary[1] = $snv; 115 $ary[2] = $suv; 116 117 ok($ary[0] == 42, 'Shared IV number preserved'); 118 ok($ary[0] eq 'Fourty-Two', 'Shared string preserved'); 119 ok(isdual($ary[0]), 'Is a dualvar'); 120 ok($ary[1] == 3.14, 'Shared NV number preserved'); 121 ok($ary[1] eq 'PI', 'Shared string preserved'); 122 ok(isdual($ary[1]), 'Is a dualvar'); 123 ok($ary[2] == (1<<$bits), 'Shared UV number preserved'); 124 ok($ary[2] > 0, 'Shared UV number preserved'); 125 ok($ary[2] eq 'Large unsigned int', 'Shared string preserved'); 126 ok(isdual($ary[2]), 'Is a dualvar'); 127} 128 129