| 1 | #!./perl -- -*- mode: cperl; cperl-indent-level: 4 -*-
|
|---|
| 2 |
|
|---|
| 3 | BEGIN {
|
|---|
| 4 | chdir 't' if -d 't';
|
|---|
| 5 | @INC = '../lib';
|
|---|
| 6 | require Config;
|
|---|
| 7 | if (($Config::Config{'extensions'} !~ m!\bList/Util\b!) ){
|
|---|
| 8 | print "1..0 # Skip -- Perl configured without List::Util module\n";
|
|---|
| 9 | exit 0;
|
|---|
| 10 | }
|
|---|
| 11 | }
|
|---|
| 12 |
|
|---|
| 13 | use strict;
|
|---|
| 14 |
|
|---|
| 15 | $|=1;
|
|---|
| 16 |
|
|---|
| 17 | my @prgs;
|
|---|
| 18 | {
|
|---|
| 19 | local $/;
|
|---|
| 20 | @prgs = split "########\n", <DATA>;
|
|---|
| 21 | close DATA;
|
|---|
| 22 | }
|
|---|
| 23 |
|
|---|
| 24 | use Test::More;
|
|---|
| 25 |
|
|---|
| 26 | plan tests => scalar @prgs;
|
|---|
| 27 |
|
|---|
| 28 | require "dumpvar.pl";
|
|---|
| 29 |
|
|---|
| 30 | sub unctrl { print dumpvar::unctrl($_[0]), "\n" }
|
|---|
| 31 | sub uniescape { print dumpvar::uniescape($_[0]), "\n" }
|
|---|
| 32 | sub stringify { print dumpvar::stringify($_[0]), "\n" }
|
|---|
| 33 | sub dumpvalue {
|
|---|
| 34 | # Call main::dumpValue exactly as the perl5db.pl calls it.
|
|---|
| 35 | local $\ = '';
|
|---|
| 36 | local $, = '';
|
|---|
| 37 | local $" = ' ';
|
|---|
| 38 | my @params = @_;
|
|---|
| 39 | &main::dumpValue(\@params,-1);
|
|---|
| 40 | }
|
|---|
| 41 |
|
|---|
| 42 | package Foo;
|
|---|
| 43 |
|
|---|
| 44 | sub new { my $class = shift; bless [ @_ ], $class }
|
|---|
| 45 |
|
|---|
| 46 | package Bar;
|
|---|
| 47 |
|
|---|
| 48 | sub new { my $class = shift; bless [ @_ ], $class }
|
|---|
| 49 |
|
|---|
| 50 | use overload '""' => sub { "Bar<@{$_[0]}>" };
|
|---|
| 51 |
|
|---|
| 52 | package main;
|
|---|
| 53 |
|
|---|
| 54 | my $foo = Foo->new(1..5);
|
|---|
| 55 | my $bar = Bar->new(1..5);
|
|---|
| 56 |
|
|---|
| 57 | for (@prgs) {
|
|---|
| 58 | my($prog, $expected) = split(/\nEXPECT\n?/, $_);
|
|---|
| 59 | # TODO: dumpvar::stringify() is controlled by a pile of package
|
|---|
| 60 | # dumpvar variables: $printUndef, $unctrl, $quoteHighBit, $bareStringify,
|
|---|
| 61 | # and so forth. We need to test with various settings of those.
|
|---|
| 62 | my $out = tie *STDOUT, 'TieOut';
|
|---|
| 63 | eval $prog;
|
|---|
| 64 | my $ERR = $@;
|
|---|
| 65 | untie $out;
|
|---|
| 66 | if ($ERR) {
|
|---|
| 67 | ok(0, "$prog - $ERR");
|
|---|
| 68 | } else {
|
|---|
| 69 | if ($expected =~ m:^/:) {
|
|---|
| 70 | like($$out, $expected, $prog);
|
|---|
| 71 | } else {
|
|---|
| 72 | is($$out, $expected, $prog);
|
|---|
| 73 | }
|
|---|
| 74 | }
|
|---|
| 75 | }
|
|---|
| 76 |
|
|---|
| 77 | package TieOut;
|
|---|
| 78 |
|
|---|
| 79 | sub TIEHANDLE {
|
|---|
| 80 | bless( \(my $self), $_[0] );
|
|---|
| 81 | }
|
|---|
| 82 |
|
|---|
| 83 | sub PRINT {
|
|---|
| 84 | my $self = shift;
|
|---|
| 85 | $$self .= join('', @_);
|
|---|
| 86 | }
|
|---|
| 87 |
|
|---|
| 88 | sub read {
|
|---|
| 89 | my $self = shift;
|
|---|
| 90 | substr( $$self, 0, length($$self), '' );
|
|---|
| 91 | }
|
|---|
| 92 |
|
|---|
| 93 | __END__
|
|---|
| 94 | unctrl("A");
|
|---|
| 95 | EXPECT
|
|---|
| 96 | A
|
|---|
| 97 | ########
|
|---|
| 98 | unctrl("\cA");
|
|---|
| 99 | EXPECT
|
|---|
| 100 | ^A
|
|---|
| 101 | ########
|
|---|
| 102 | uniescape("A");
|
|---|
| 103 | EXPECT
|
|---|
| 104 | A
|
|---|
| 105 | ########
|
|---|
| 106 | uniescape("\x{100}");
|
|---|
| 107 | EXPECT
|
|---|
| 108 | \x{0100}
|
|---|
| 109 | ########
|
|---|
| 110 | stringify(undef);
|
|---|
| 111 | EXPECT
|
|---|
| 112 | undef
|
|---|
| 113 | ########
|
|---|
| 114 | stringify("foo");
|
|---|
| 115 | EXPECT
|
|---|
| 116 | 'foo'
|
|---|
| 117 | ########
|
|---|
| 118 | stringify("\cA");
|
|---|
| 119 | EXPECT
|
|---|
| 120 | "\cA"
|
|---|
| 121 | ########
|
|---|
| 122 | stringify(*a);
|
|---|
| 123 | EXPECT
|
|---|
| 124 | *main::a
|
|---|
| 125 | ########
|
|---|
| 126 | stringify(\undef);
|
|---|
| 127 | EXPECT
|
|---|
| 128 | /^'SCALAR\(0x[0-9a-f]+\)'$/i
|
|---|
| 129 | ########
|
|---|
| 130 | stringify([]);
|
|---|
| 131 | EXPECT
|
|---|
| 132 | /^'ARRAY\(0x[0-9a-f]+\)'$/i
|
|---|
| 133 | ########
|
|---|
| 134 | stringify({});
|
|---|
| 135 | EXPECT
|
|---|
| 136 | /^'HASH\(0x[0-9a-f]+\)'$/i
|
|---|
| 137 | ########
|
|---|
| 138 | stringify(sub{});
|
|---|
| 139 | EXPECT
|
|---|
| 140 | /^'CODE\(0x[0-9a-f]+\)'$/i
|
|---|
| 141 | ########
|
|---|
| 142 | stringify(\*a);
|
|---|
| 143 | EXPECT
|
|---|
| 144 | /^'GLOB\(0x[0-9a-f]+\)'$/i
|
|---|
| 145 | ########
|
|---|
| 146 | stringify($foo);
|
|---|
| 147 | EXPECT
|
|---|
| 148 | /^'Foo=ARRAY\(0x[0-9a-f]+\)'$/i
|
|---|
| 149 | ########
|
|---|
| 150 | stringify($bar);
|
|---|
| 151 | EXPECT
|
|---|
| 152 | /^'Bar=ARRAY\(0x[0-9a-f]+\)'$/i
|
|---|
| 153 | ########
|
|---|
| 154 | dumpValue(undef);
|
|---|
| 155 | EXPECT
|
|---|
| 156 | undef
|
|---|
| 157 | ########
|
|---|
| 158 | dumpValue(1);
|
|---|
| 159 | EXPECT
|
|---|
| 160 | 1
|
|---|
| 161 | ########
|
|---|
| 162 | dumpValue("\cA");
|
|---|
| 163 | EXPECT
|
|---|
| 164 | "\cA"
|
|---|
| 165 | ########
|
|---|
| 166 | dumpValue("\x{100}");
|
|---|
| 167 | EXPECT
|
|---|
| 168 | '\x{0100}'
|
|---|
| 169 | ########
|
|---|
| 170 | dumpValue("1\n2\n3");
|
|---|
| 171 | EXPECT
|
|---|
| 172 | '1
|
|---|
| 173 | 2
|
|---|
| 174 | 3'
|
|---|
| 175 | ########
|
|---|
| 176 | dumpValue([1..3],1);
|
|---|
| 177 | EXPECT
|
|---|
| 178 | 0 1
|
|---|
| 179 | 1 2
|
|---|
| 180 | 2 3
|
|---|
| 181 | ########
|
|---|
| 182 | dumpValue([1..3]);
|
|---|
| 183 | EXPECT
|
|---|
| 184 | 0 1
|
|---|
| 185 | 1 2
|
|---|
| 186 | 2 3
|
|---|
| 187 | ########
|
|---|
| 188 | dumpValue({1..4},1);
|
|---|
| 189 | EXPECT
|
|---|
| 190 | 1 => 2
|
|---|
| 191 | 3 => 4
|
|---|
| 192 | ########
|
|---|
| 193 | dumpValue({1..4});
|
|---|
| 194 | EXPECT
|
|---|
| 195 | 1 => 2
|
|---|
| 196 | 3 => 4
|
|---|
| 197 | ########
|
|---|
| 198 | dumpValue($foo,1);
|
|---|
| 199 | EXPECT
|
|---|
| 200 | 0 1
|
|---|
| 201 | 1 2
|
|---|
| 202 | 2 3
|
|---|
| 203 | 3 4
|
|---|
| 204 | 4 5
|
|---|
| 205 | ########
|
|---|
| 206 | dumpValue($foo);
|
|---|
| 207 | EXPECT
|
|---|
| 208 | 0 1
|
|---|
| 209 | 1 2
|
|---|
| 210 | 2 3
|
|---|
| 211 | 3 4
|
|---|
| 212 | 4 5
|
|---|
| 213 | ########
|
|---|
| 214 | dumpValue($bar,1);
|
|---|
| 215 | EXPECT
|
|---|
| 216 | 0 1
|
|---|
| 217 | 1 2
|
|---|
| 218 | 2 3
|
|---|
| 219 | 3 4
|
|---|
| 220 | 4 5
|
|---|
| 221 | ########
|
|---|
| 222 | dumpValue($bar);
|
|---|
| 223 | EXPECT
|
|---|
| 224 | 0 1
|
|---|
| 225 | 1 2
|
|---|
| 226 | 2 3
|
|---|
| 227 | 3 4
|
|---|
| 228 | 4 5
|
|---|
| 229 | ########
|
|---|
| 230 | dumpvalue("a");
|
|---|
| 231 | EXPECT
|
|---|
| 232 | 0 'a'
|
|---|
| 233 | ########
|
|---|
| 234 | dumpvalue("\cA");
|
|---|
| 235 | EXPECT
|
|---|
| 236 | 0 "\cA"
|
|---|
| 237 | ########
|
|---|
| 238 | dumpvalue("\x{100}");
|
|---|
| 239 | EXPECT
|
|---|
| 240 | 0 '\x{0100}'
|
|---|
| 241 | ########
|
|---|
| 242 | dumpvalue(undef);
|
|---|
| 243 | EXPECT
|
|---|
| 244 | 0 undef
|
|---|
| 245 | ########
|
|---|
| 246 | dumpvalue("foo");
|
|---|
| 247 | EXPECT
|
|---|
| 248 | 0 'foo'
|
|---|
| 249 | ########
|
|---|
| 250 | dumpvalue(\undef);
|
|---|
| 251 | EXPECT
|
|---|
| 252 | /0 SCALAR\(0x[0-9a-f]+\)\n -> undef\n/i
|
|---|
| 253 | ########
|
|---|
| 254 | dumpvalue(\\undef);
|
|---|
| 255 | EXPECT
|
|---|
| 256 | /0 REF\(0x[0-9a-f]+\)\n -> SCALAR\(0x[0-9a-f]+\)\n -> undef\n/i
|
|---|
| 257 | ########
|
|---|
| 258 | dumpvalue([]);
|
|---|
| 259 | EXPECT
|
|---|
| 260 | /0 ARRAY\(0x[0-9a-f]+\)\n empty array/i
|
|---|
| 261 | ########
|
|---|
| 262 | dumpvalue({});
|
|---|
| 263 | EXPECT
|
|---|
| 264 | /0 HASH\(0x[0-9a-f]+\)\n\s+empty hash/i
|
|---|
| 265 | ########
|
|---|
| 266 | dumpvalue(sub{});
|
|---|
| 267 | EXPECT
|
|---|
| 268 | /0 CODE\(0x[0-9a-f]+\)\n -> &CODE\(0x[0-9a-f]+\) in /i
|
|---|
| 269 | ########
|
|---|
| 270 | dumpvalue(\*a);
|
|---|
| 271 | EXPECT
|
|---|
| 272 | /0 GLOB\(0x[0-9a-f]+\)\n -> \*main::a\n/i
|
|---|
| 273 | ########
|
|---|
| 274 | dumpvalue($foo);
|
|---|
| 275 | EXPECT
|
|---|
| 276 | /0 Foo=ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 3 4\n 4 5\n/i
|
|---|
| 277 | ########
|
|---|
| 278 | dumpvalue($bar);
|
|---|
| 279 | EXPECT
|
|---|
| 280 | /0 Bar=ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 3 4\n 4 5\n/i
|
|---|
| 281 | ########
|
|---|
| 282 | dumpvalue("1\n2\n3")
|
|---|
| 283 | EXPECT
|
|---|
| 284 | /0 '1\n2\n3'\n/i
|
|---|
| 285 | ########
|
|---|
| 286 | dumpvalue([1..4]);
|
|---|
| 287 | EXPECT
|
|---|
| 288 | /0 ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 3 4\n/i
|
|---|
| 289 | ########
|
|---|
| 290 | dumpvalue({1..4});
|
|---|
| 291 | EXPECT
|
|---|
| 292 | /0 HASH\(0x[0-9a-f]+\)\n 1 => 2\n 3 => 4\n/i
|
|---|
| 293 | ########
|
|---|
| 294 | dumpvalue({1=>2,3=>4});
|
|---|
| 295 | EXPECT
|
|---|
| 296 | /0 HASH\(0x[0-9a-f]+\)\n 1 => 2\n 3 => 4\n/i
|
|---|
| 297 | ########
|
|---|
| 298 | dumpvalue({a=>1,b=>2});
|
|---|
| 299 | EXPECT
|
|---|
| 300 | /0 HASH\(0x[0-9a-f]+\)\n 'a' => 1\n 'b' => 2\n/i
|
|---|
| 301 | ########
|
|---|
| 302 | dumpvalue([{a=>[1,2,3],b=>{c=>1,d=>2}},{e=>{f=>1,g=>2},h=>[qw(i j k)]}]);
|
|---|
| 303 | EXPECT
|
|---|
| 304 | /0 ARRAY\(0x[0-9a-f]+\)\n 0 HASH\(0x[0-9a-f]+\)\n 'a' => ARRAY\(0x[0-9a-f]+\)\n 0 1\n 1 2\n 2 3\n 'b' => HASH\(0x[0-9a-f]+\)\n 'c' => 1\n 'd' => 2\n 1 HASH\(0x[0-9a-f]+\)\n 'e' => HASH\(0x[0-9a-f]+\)\n 'f' => 1\n 'g' => 2\n 'h' => ARRAY\(0x[0-9a-f]+\)\n 0 'i'\n 1 'j'\n 2 'k'/i
|
|---|
| 305 | ########
|
|---|
| 306 | dumpvalue({reverse map {$_=>1} sort qw(the quick brown fox)})
|
|---|
| 307 | EXPECT
|
|---|
| 308 | /0 HASH\(0x[0-9a-f]+\)\n 1 => 'brown'\n/i
|
|---|
| 309 | ########
|
|---|
| 310 | my @x=qw(a b c); dumpvalue(\@x);
|
|---|
| 311 | EXPECT
|
|---|
| 312 | /0 ARRAY\(0x[0-9a-f]+\)\n 0 'a'\n 1 'b'\n 2 'c'\n/i
|
|---|
| 313 | ########
|
|---|
| 314 | my %x=(a=>1, b=>2); dumpvalue(\%x);
|
|---|
| 315 | EXPECT
|
|---|
| 316 | /0 HASH\(0x[0-9a-f]+\)\n 'a' => 1\n 'b' => 2\n/i
|
|---|