-
Notifications
You must be signed in to change notification settings - Fork 138
/
packfiledirectory.t
175 lines (145 loc) · 3.62 KB
/
packfiledirectory.t
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#!./parrot
# Copyright (C) 2009-2010, Parrot Foundation.
=head1 NAME
t/pmc/packfiledirectory.t - test the PackfileDirectory PMC
=head1 SYNOPSIS
% make test_prep
% prove t/pmc/packfiledirectory.t
=head1 DESCRIPTION
Tests the PackfileDirectory PMC.
=cut
.include 't/pmc/testlib/packfile_common.pir'
.sub 'main' :main
.include 'test_more.pir'
plan(17)
'test_create'()
'test_typeof'()
'test_elements'()
'test_get_iter'()
'test_set_pmc_keyed_str'()
.end
# Test creation of fresh directory
.sub 'test_create'
.local pmc dir, seg
dir = new 'PackfileDirectory'
isa_ok(dir, 'PackfileDirectory')
seg = new 'PackfileRawSegment'
# We should set owner
$P0 = seg.'get_directory'()
$I0 = defined $P0
$I0 = not $I0
ok($I0, "Owner of fresh segment unknown")
dir['RAWSEGMENT'] = seg
# We should set owner
$P0 = seg.'get_directory'()
$I0 = defined $P0
ok($I0, "Owner of segment set correctly")
.end
# PackfileDirectory.typeof
.sub 'test_typeof'
.local pmc pf
pf = new ['Packfile']
$P1 = pf.'get_directory'()
isa_ok($P1, 'PackfileDirectory', 'PackfileDirectory.get_directory')
.end
# PackfileDirectory.elements
.sub 'test_elements'
.local pmc pf, pfdir
push_eh load_error
pf = _pbc()
pop_eh
pfdir = pf.'get_directory'()
$I0 = elements pfdir
is($I0, 3, 'PackfileDirectory.elements')
.return()
load_error:
.get_results($P0)
pop_eh
report_load_error($P0, 'PackfileDirectory.elements')
.return()
.end
# PackfileDirectory.get_iter
.sub 'test_get_iter'
.local pmc pf, pfdir, it, expected
.local string name
# expected contains all expected segment "prefixes" with count
expected = new 'Hash'
expected["BYTECODE"] = 2
expected["FIXUP"] = 1
expected["CONSTANT"] = 1
push_eh load_error
pf = _pbc()
pop_eh
pfdir = pf.'get_directory'()
$I0 = elements pfdir
it = iter pfdir
loop:
unless it goto done
name = shift it
# Get prefix
$P0 = split '_', name
$S0 = shift $P0
$I0 = expected[$S0]
ok($I0, $S0)
# Decrease expectation count
dec $I0
expected[$S0] = $I0
$P1 = pfdir[name]
isa_ok($P1, 'PackfileSegment')
$P2 = $P1.'get_directory'()
$I0 = defined $P2
ok($I0, "Loaded Segment has proper directory")
goto loop
done:
.return ()
load_error:
.get_results($P0)
pop_eh
report_load_error($P0, "can't run get_iter tests")
skip(11, "can't run get_iter tests")
.return()
.end
## PackfileDirectory.set_pmc_keyed_str
.sub 'test_set_pmc_keyed_str'
.local pmc pf, pfdir, seg
push_eh load_error
pf = _pbc()
pop_eh
pfdir = pf.'get_directory'()
seg = new [ 'PackfileRawSegment' ]
# Adding segment with same name replaces old one
$I0 = elements pfdir
$P0 = iter pfdir
$S0 = shift $P0
pfdir[$S0] = seg
$I1 = elements pfdir
is($I0, $I1, "Segment with old name was added")
# Add segment with new name
add_new:
seg = new [ 'PackfileRawSegment' ]
$S0 = 'BYTECODE_foo'
pfdir[$S0] = seg
$I1 = elements pfdir
inc $I0
is($I0, $I1, "New segment added")
# Remove that segment again
delete_seg:
delete pfdir[$S0]
dec $I0
$I1 = elements pfdir
is($I0, $I1, "segment deleted")
done:
.return()
load_error:
.get_results($P0)
pop_eh
report_load_error($P0, "Segment with old name was added")
report_load_error($P0, "New segment added")
report_load_error($P0, "segment deleted")
.return()
.end
# Local Variables:
# mode: pir
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: