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