fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / packfileconstanttable.t
blobab801e4d65b949e1c98f09571c465f6c024ea189
1 #!./parrot
2 # Copyright (C) 2009-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/packfileconstanttable.t - test the PackfileConstantTable PMC
9 =head1 SYNOPSIS
11     % make test_prep
12     % prove t/pmc/packfileconstanttable.t
14 =head1 DESCRIPTION
16 Tests the PackfileConstantTable PMC.
18 =cut
20 # Having some known data would be helpful, here.  For now, just make sure
21 # the values returned from get_type look right, and that the corresponding
22 # fetches for the found types don't crash.
25 .include 't/pmc/testlib/packfile_common.pir'
27 .sub 'main' :main
28 .include 'test_more.pir'
29 .include 'packfile_constants.pasm'
30     'plan'(16)
32     'test_sanity'()
33     'test_elements'()
34     'test_get'()
35     'test_set'()
36     'test_get_or_create'()
37 .end
40 # sanity check we have a PackfileConstantTable
41 .sub 'test_sanity'
42     .local pmc pbc, pftable
43     .local string name
44     push_eh load_error
45     pbc     = _pbc()
46     pop_eh
47     pftable = _get_consttable(pbc)
48     isa_ok(pftable, "PackfileConstantTable")
49     .return ()
50 load_error:
51     .get_results($P0)
52     pop_eh
53     report_load_error($P0, "PackfileConstantTable")
54     .return()
55 .end
58 # PackfileConstantTable.elements
59 .sub 'test_elements'
60     .local pmc pf, pftable
61     .local int size
62     push_eh load_error
63     pf      = _pbc()
64     pop_eh
65     pftable = _get_consttable(pf)
67     # Make sure the mark vtable is exercised and the content survives
68     sweep 1
70     size    = elements pftable
71     ok(size, "PackfileConstantTable.elements returns non-zero")
72     .return ()
73 load_error:
74     .get_results($P0)
75     pop_eh
76     report_load_error($P0, "PackfileConstantTable.elements returns non-zero")
77     .return()
78 .end
81 # PackfileConstantTable.get_type and PackfileConstantTable.get_*_keyed_int
82 .sub 'test_get'
83     .local pmc pf, pftable
84     .local int size, this, type
85     push_eh load_error
86     pf      = _pbc()
87     pop_eh
88     pftable = _get_consttable(pf)
89     size    = elements pftable
90     this    = 0
91   loop:
92     type = pftable.'get_type'(this)
93     eq type, .PFC_NONE, next
94     eq type, .PFC_NUMBER, const_num
95     eq type, .PFC_STRING, const_str
96     eq type, .PFC_PMC, const_pmc
97     eq type, .PFC_KEY, const_key
98     goto bad
99   const_num:
100     $N0 = pftable[this]
101     goto next
102   const_str:
103     $S0 = pftable[this]
104     goto next
105   const_pmc:
106     $P0 = pftable[this]
107     goto next
108   const_key:
109     $P0 = pftable[this]
110     $S0 = typeof $P0
111     eq $S0, 'Key', next
112     $S0 = concat 'constant Key with wrong type: ', $S0
113     ok(0, $S0)
114     .return()
116   next:
117     this = this + 1
118     ge this, size, done
119     goto loop
120     gt size, 0, done
122   done:
123     ok(1, 'PackfileConstantTable.get_*_int works')
124     .return()
125   bad:
126     ok(0, 'Unknown constant type')
127     .return()
128 load_error:
129     .get_results($P0)
130     pop_eh
131     report_load_error($P0, 'PackfileConstantTable.get_*_int works')
132     .return()
133 .end
135 # Test setting constants into PackfileConstantTable
136 .sub 'test_set'
137     .local pmc ct
138     .local int size
139     ct = new ['PackfileConstantTable']
141     # Initial PackfileConstantTable is empty
142     size = elements ct
143     is(size, 0, "Empty PackfileConstantTable created")
145     # Set first string
146     ct[0] = "string"
147     $I0 = elements ct
148     is($I0, 1, "String element added")
150     ct[1] = 1.0
151     $I0 = elements ct
152     is($I0, 2, "Number elements added")
154     $P0 = new 'Integer'
155     $P0 = 42
156     ct[2] = $P0
157     $I0 = elements ct
158     is($I0, 3, "PMC elements added")
160     # Check types of created constants
161     $I0 = ct.'get_type'(0)
162     is($I0, .PFC_STRING, "First element is string")
163     $I0 = ct.'get_type'(1)
164     is($I0, .PFC_NUMBER, "Second element is number")
165     $I0 = ct.'get_type'(2)
166     is($I0, .PFC_PMC, "Third element is PMC")
168 .end
170 .sub 'test_get_or_create'
171     .local pmc pfc
172     pfc = new 'PackfileConstantTable'
173     $I1 = pfc.'get_or_create_constant'('foo')
174     $I2 = pfc.'get_or_create_constant'('foo')
175     is($I1, $I2, "get_or_create_constant returs same string value for same key")
177     $I2 = pfc.'get_or_create_constant'('bar')
178     $I0 = $I1 != $I2
179     ok($I0, "get_or_create_constant returs different string values for different keys")
182     $I1 = pfc.'get_or_create_constant'(1.0)
183     $I2 = pfc.'get_or_create_constant'(1.0)
184     is($I1, $I2, "get_or_create_constant returs same number value for same key")
186     $I2 = pfc.'get_or_create_constant'(42.1)
187     $I0 = $I1 != $I2
188     ok($I0, "get_or_create_constant returs different number values for different keys")
190     $P0 = new ['FixedIntegerArray']
191     $P0 = 1
192     $P0[0] = 42
193     $P1 = new ['FixedIntegerArray']
194     $P1 = 1
195     $P1[0] = 42
196     $P2 = new ['FixedIntegerArray']
197     $P2 = 1
198     $P2[0] = 84
200     $I0 = pfc.'get_or_create_constant'($P0)
201     $I1 = pfc.'get_or_create_constant'($P1)
202     is($I0, $I1, "get_or_create_constant returns same index for equal PMCs")
203     $I2 = pfc.'get_or_create_constant'($P2)
204     isnt($I0, $I2, "get_or_create_constant returns different index for different PMCs")
205 .end
207 .sub '_get_consttable'
208     .param pmc pf
209     .local pmc dir, it
210     dir = pf.'get_directory'()
211     it = iter dir
212   loop:
213     unless it goto done
214     $S0 = shift it
215     $P0 = dir[$S0]
216     $I0 = isa $P0, 'PackfileConstantTable'
217     unless $I0 goto loop
218     .return ($P0)
219   done:
220     die "Can't find ConstantTable in Packfile!"
221     .return ()
222 .end
224 # Local Variables:
225 #   mode: pir
226 #   fill-column: 100
227 # End:
228 # vim: expandtab shiftwidth=4 ft=pir: