fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / stringbuilder.t
blob7e44f801de03e1d0bd8939493a6793083bcf55c7
1 #!./parrot
2 # Copyright (C) 2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/stringbuilder.t - StringBuilder
9 =head1 SYNOPSIS
11     % prove t/pmc/stringbuilder.t
13 =head1 DESCRIPTION
15 Tests the C<StringBuilder> PMC.
17 =cut
20 .sub 'main' :main
21     .include 'test_more.pir'
23     test_create()               # 3 tests
24     test_init_pmc()
25     test_push_string()
26     test_push_pmc()             # 4 tests
27     test_push_string_unicode()  # 1 test
28     test_i_concatenate()        # 1 test
29     test_set_string_native()    # 4 tests
30     test_set_string_native_with_hash()    # 2 tests
31     test_set_pmc()
32     test_substr()
34     emit_with_pos_args()
35     emit_with_percent_args()
36     emit_with_named_args()
37     emit_with_pos_and_named_args()
39     test_unicode_conversion_tt1665()
40     test_encodings()
42     done_testing()
44     # END_OF_TESTS
45 .end
47 .sub 'test_create'
48     .local pmc sb
49     sb = new ['StringBuilder']
51     $I0 = isnull sb
52     not $I0
53     ok( $I0, 'StringBuilder created' )
55     $S0 = sb
56     is( $S0, '', '... with empty content')
58     .local pmc ar
59     ar = new ['FixedStringArray']
60     sb = new ['StringBuilder'], ar
61     $I0 = isnull sb
62     not $I0
63     ok( $I0, 'StringBuilder created from empty array' )
64 .end
66 .sub 'test_push_string'
67     .local pmc sb
68     sb = new ["StringBuilder"]
70     push sb, "foo"
71     $S0 = sb
72     is( $S0, "foo", "First string pushed")
74     push sb, "bar"
75     $S1 = sb
76     is( $S1, "foobar", "Second string pushed")
78     is( $S0, "foo", "... without clobbering first string")
80     $I0 = sb.'get_string_length'()
81     is( $I0, 6,   "... and string length is correct")
83     # Push large string which will cause reallocate
84     $S99 = repeat "x", 128
85     push sb, $S99
87     $S0 = concat "foobar", $S99
88     $S1 = sb
89     is( $S0, $S1, "Push 128 chars string works")
91     $S99 = repeat "x", 1000
92     push sb, $S99
94     $S0 = concat $S0, $S99
95     $S1 = sb
96     is( $S0, $S1, "Push 1000 chars string works")
98     $S99 = repeat "x", 12000
99     push sb, $S99
101     $S0 = concat $S0, $S99
102     $S1 = sb
103     is( $S0, $S1, "Push 10000 chars string works")
105     null $S99
106     push sb, $S99
108     $S1 = sb
109     is( $S0, $S1, "push a null string does nothing" )
110 .end
112 .sub 'test_push_pmc'
113     .local pmc sb
114     sb = new ["StringBuilder"]
116     box $P0, "foo"
117     push sb, $P0
118     $S0 = sb
119     is( $S0, "foo", "First string pushed")
121     box $P0, "bar"
122     push sb, $P0
123     $S1 = sb
124     is( $S1, "foobar", "Second string pushed")
126     is( $S0, "foo", "... without clobbering first string")
128     $I0 = sb
129     is( $I0, 128, "... and capacity still 128" )
130 .end
132 .sub 'test_push_string_unicode'
133     .local pmc sb
134     sb = new ["StringBuilder"]
136     push sb, "le"
137     push sb, unicode:"o "
138     push sb, iso-8859-1:"tötsch"
140     $S0 = sb
141     is( $S0, iso-8859-1:"leo tötsch", "Unicode strings appened")
142 .end
144 .sub 'test_i_concatenate'
145     .local pmc sb
146     sb = new ["StringBuilder"]
148     concat sb, "foo"
150     $P0 = new ["String"]
151     $P0 = "bar"
152     concat sb, $P0
154     sb .= "baz"
156     $S0 = sb
157     is( $S0, "foobarbaz", "StringBuilder handles concat properly")
158 .end
160 .sub 'test_set_string_native'
161     .local pmc sb
162     sb = new ["StringBuilder"]
164     $S99 = "foo"
165     sb   = $S99
167     $S0  = sb
168     is( $S0, "foo", "Assignment works")
170     sb .= "bar"
171     $S0  = sb
172     is( $S0, "foobar", "... with appending string after")
173     is( $S99, "foo", "... without touching of original string")
175     # Assumed that the previous operations does not reach initial
176     # capacity of the buffer, the next test should cause a
177     # reallocation, ensuring full coverage of the set_string_native
178     # vtable function.
179     $S1 = repeat 'x', 4096
180     sb = $S1
181     $I0 = sb.'get_string_length'()
182     is( $I0, 4096, "... with a big size change")
183 .end
185 .sub 'test_set_string_native_with_hash'
186     .local pmc sb, hash
187     sb   = new ["StringBuilder"]
188     hash = new ['Hash']
190     $S0 = "foo"
191     hash[$S0] = "foo"
192     sb   = $S0
193     # Used later
194     $S0  = sb
196     sb .= "bar"
197     $S1  = sb
198     hash[$S1] = $S1
200     $S99 = hash[$S0]
201     is ( $S99, "foo", "First string stored in hash" )
203     $S99 = hash[$S1]
204     is ( $S99, "foobar", "Second string stored in hash" )
206 .end
208 .sub 'test_set_pmc'
209     .local pmc sb, i
210     sb = new ["StringBuilder"]
211     i  = new ["Integer"], 17
212     assign sb, i
213     $S0 = sb
214     $I0 = iseq $S0, '17'
215     is( $I0, 1, "set_pmc gives the pmc string value")
216 .end
218 .sub test_substr
219     .local pmc sb
220     sb = new ["StringBuilder"]
221     sb = 'foobar'
222     $S0 = substr sb, 2, 3
223     is( $S0, 'oba', "substr result is correct")
224 .end
226 .sub emit_with_pos_args
227     .local pmc code
228     code = new ["StringBuilder"]
229     code."append_format"("label_%0:\n",          1234)
230     code."append_format"("    say '%0, %1'\n",   "Hello", "World")
231     code."append_format"("    %0 = %2\n", "$I0", 24, 48)
232     is(code, <<'CODE', "code string with positional args looks fine")
233 label_1234:
234     say 'Hello, World'
235     $I0 = 48
236 CODE
237 .end
239 .sub emit_with_percent_args
240     .local pmc code
241     code = new ['StringBuilder']
242     code."append_format"("label_%0:\n",    1234)
243     code."append_format"("    say '%,'\n", "Hello")
244     code."append_format"("    say '%,'\n", "Hello", "World", "of", "Parrot")
245     code."append_format"("    say '%%0'\n")
246     is(code, <<'CODE', "code string with % args looks fine")
247 label_1234:
248     say 'Hello'
249     say 'Hello, World, of, Parrot'
250     say '%0'
251 CODE
252 .end
254 .sub emit_with_named_args
255     .local pmc code
256     code = new ['StringBuilder']
257     code."append_format"("label_%a:\n",         "a"=>1234)
258     code."append_format"("    say '%b, %c'\n",  "b"=>"Hello", "c"=>"World")
259     code."append_format"("    say '%d'\n",      "b"=>"Hello", "c"=>"World")
260     is(code, <<'CODE', "emit with named args looks fine")
261 label_1234:
262     say 'Hello, World'
263     say '%d'
264 CODE
265 .end
267 .sub emit_with_pos_and_named_args
268     .local pmc code
269     code = new ['StringBuilder']
270     code."append_format"("label_%a:\n", "a"=>1234)
271     code."append_format"("    %0 '%b, %c'\n", "say", "print", "b"=>"H", "c"=>"W")
272     code."append_format"("    say '%,, %c'\n", "alpha", "beta", "b"=>"H", "c"=>"W")
273     is(code, <<'CODE', "emit with pos + named args")
274 label_1234:
275     say 'H, W'
276     say 'alpha, beta, W'
277 CODE
278 .end
280 .sub "test_unicode_conversion_tt1665"
281     .local pmc list
282     list = new 'ResizablePMCArray'
283     push list, 195
284     push list, 182
286     .local pmc iterator
287     iterator = iter list
288     .local pmc sb
289     sb = new 'StringBuilder'
290     sb = unicode:""
291     loop:
292       unless iterator goto done
293       $P1 = shift iterator
294       $I1 = $P1
295       $S1 = chr $I1
296       sb .= $S1
297       goto loop
298     done:
299       $S0 = sb
301     ok( $S0, "Pushing unicode strings doesn't kill StringBuilder")
302 .end
304 .sub 'test_init_pmc'
305     .local pmc ar
306     ar = new ['ResizableStringArray']
308     push ar, "foo"
309     push ar, "bar"
311     $S99 = repeat "x", 12
312     push ar, $S99
313     $S1 = 'foobar' . $S99
315     $S99 = repeat "y", 13
316     push ar, $S99
317     $S1 = $S1 . $S99
319     $S99 = repeat "z", 14
320     push ar, $S99
321     $S1 = $S1 . $S99
323     null $S0
324     push ar, $S0
326     .local pmc sb
327     sb  = new ["StringBuilder"], ar
328     $S0 = sb
329     is( $S0, $S1, 'init_pmc() should join all passed strings' )
330 .end
332 .sub 'test_encodings'
333     .local pmc sb
334     sb  = new ["StringBuilder"]
336     push sb, "foo"
337     push sb, iso-8859-1:"\x{E4}\x{F6}\x{FC}"
338     push sb, utf8:unicode:"БДЖ"
339     push sb, "bar"
341     $S0 = sb
342     is( $S0, utf8:unicode:"fooäöüБДЖbar", 'push strings with different encodings' )
343 .end
345 # Local Variables:
346 #   mode: pir
347 #   fill-column: 100
348 # End:
349 # vim: expandtab shiftwidth=4 ft=pir: