-
Notifications
You must be signed in to change notification settings - Fork 3
/
test.pl
132 lines (107 loc) · 3.51 KB
/
test.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env perl
use v5.28.0;
use POSIX ();
# The nasty ones:
use Storable;
use Clone;
use lib '.';
use RSPM::Bless;
use RSPM::Foo142;
use RSPM::Option;
use RSPM::Magic;
STDOUT->autoflush;
# Let's combine stderr and stdout:
POSIX::dup2(fileno(STDOUT), fileno(STDERR));
my $v = RSPM::Bless->new("Hello");
$v->something();
$v->something_nonraw();
my ($a, $b, $c) = $v->multi_return();
say "Got ($a, $b, $c)";
my @ret = $v->multi_return();
say "Got: ".scalar(@ret)." values: @ret";
$v->another(54);
my $param = { a => 1 };
my $s = "Hello You";
print "These should be called with a valid substr:\n";
RSPM::Foo142::test(substr($s, 3, 3));
RSPM::Foo142::teststr(substr($s, 3, 3));
print "Parameter exists: " . (exists($param->{x}) ? "YES" : "NO") . "\n";
RSPM::Foo142::test($param->{x});
print "Was auto-vivified: " . (exists($param->{x}) ? "YES" : "NO") . "\n";
RSPM::Foo142::teststr($param->{x});
my $a = "Can I have some coffee please?\n";
print $a;
my $b = RSPM::Foo142::test_serde($a);
print $b;
my $c = RSPM::Foo142::test_serde($b);
print $c;
use utf8;
binmode STDOUT, ':utf8';
my $a = "Can I have some ☕ please?\n";
print $a;
my $b = RSPM::Foo142::test_serde($a);
print $b;
my $c = RSPM::Foo142::test_serde($b);
print $c;
sub to_string {
my ($param) = @_;
my $state = $param->{tristate};
$state = int($state) if defined($state);
my $a;
if (defined($state)) {
$a = $state ? "Some(true)" : "Some(false)";
} else {
$a = "None";
}
my $b = RSPM::Option::to_string($state);
my $c = RSPM::Option::struct_to_string({ 'tristate' => $state });
print "$a\n";
print "$b\n";
print "$c\n";
}
to_string({ 'tristate' => '0' });
to_string({ 'tristate' => '1' });
to_string({ 'tristate' => undef });
my $ref1 = { x => "x was stored" };
my $ref2 = RSPM::Foo142::test_refs({ copied => "copied string", reference => $ref1 });
print($ref1->{x}, "\n");
$ref2->{x} = "x was changed";
print($ref1->{x}, "\n");
my $magic = RSPM::Magic->new('magic test');
$magic->call();
sub test_unsafe_clone($) {
my ($bad) = @_;
eval { $bad->call() };
if (!$@) {
die "cloned object not properly detected!\n";
} elsif ($@ ne "value blessed into RSPM::Magic did not contain its declared magic pointer\n") {
die "cloned object error message changed to: [$@]\n";
}
undef $bad;
print("unsafe dclone dropped\n");
}
print("Testing unsafe dclone\n");
test_unsafe_clone(Storable::dclone($magic));
print("Testing unsafe clone\n");
test_unsafe_clone(Clone::clone($magic));
undef $magic;
print("Testing enum deserialization\n");
my $ra = RSPM::Foo142::test_enums("something");
die "unexpected result from test_enums: $ra\n" if $ra ne 'result-a';
print("Testing optional parameters\n");
RSPM::Foo142::test_trailing_optional(1, 99);
RSPM::Foo142::test_trailing_optional(2, undef);
RSPM::Foo142::test_trailing_optional(3);
print("Substring test\n");
my $orig = "OneTwoThree";
my $sub = RSPM::Foo142::test_substr_return($orig);
print("[$orig] [$sub]\n");
my $ok = RSPM::Foo142::test_deserialized_error(0);
die "test_deserialized_error failed to set errno value\n" if $! != 77;
die "test_deserialized_error failed to return a value\n" if $ok ne 'worked';
$ok = eval { RSPM::Foo142::test_deserialized_error(1) };
die "test_deserialized_error error case returned a value\n" if defined $ok;
my $err = $@;
die "test_deserialized_error error is not a hash\n" if ref($err) ne 'HASH';
die "structured error has invalid fields\n" if join(',', sort(keys(%$err))) ne 'a,b';
print('error type: { a: ', $err->{a}, ', b: ', $err->{b}, " }\n");