fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / hashiterator.t
blob766fa2bf4281522f2608d84629072fb1cbf41c6a
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/hashiterator.t - Test the HashIterator PMC
9 =head1 SYNOPSIS
11     % prove t/pmc/hashiterator.t
13 =head1 DESCRIPTION
15 Tests the C<HashIterator> PMC. Checks key access with various types of
16 normal and potentially hazardous keys. Does a bit of stress testing as
17 well.
19 =cut
21 .include 'except_types.pasm'
23 .sub main :main
24     .include 'test_more.pir'
26     plan(10)
28     iter_over_empty_hash()
29     iter_over_single_element()
30     iter_over_single_element_with_checks()
31     iter_invalid_type()
32     iter_clone()
33 .end
35 .sub 'iter_over_empty_hash'
36     .local pmc hash, it
37     hash = new 'Hash'
38     it   = new 'HashIterator', hash
39     $I0  = isfalse it
40     ok($I0, "Iterator for empty Hash is empty")
42     # shift_pmc throws on empty Hash but shift_string doesn't.
44     $S0 = shift it
45     is($S0, '', 'shift string for empty hash gives empty string')
47     .local pmc eh
48     .local int i
49     i = 1
50     eh = new 'ExceptionHandler'
51     eh.'handle_types'(.EXCEPTION_OUT_OF_BOUNDS)
52     set_addr eh, catch
53     push_eh catch
54     $P0 = shift it
55     i = 0
56     goto report
57   catch:
58     finalize eh
59   report:
60     pop_eh
61     ok(i, 'shift pmc for empty hash throws')
62 .end
64 .sub 'iter_over_single_element'
65     .local pmc hash, it
66     hash = new 'Hash'
67     hash["foo"] = "bar"
68     it   = new 'HashIterator', hash
69     $I0  = istrue it
70     ok($I0, "Iterator for non empty Hash is not empty")
71     $P0  = shift it
72     $I0  = isfalse it
73     ok($I0, "And contains one element")
74 .end
76 .sub 'iter_over_single_element_with_checks'
77     .local pmc hash, it
78     hash = new 'Hash'
79     hash["foo"] = "bar"
81     it   = new 'HashIterator', hash
82     $P0  = shift it
83     $I0  = isa $P0, 'HashIteratorKey'
84     ok($I0, "HashIteratorKey fetched successfully")
86     $S0  = $P0 # Get key
87     is($S0, "foo", "Key fetched successfully")
88     $S1  = hash[$P0]
89     is($S1, "bar", "Value fetched successfully")
91 .end
93 .sub 'iter_invalid_type'
94     .local pmc hash, it
95     hash = new 'Hash'
96     it   = new 'HashIterator', hash
97     .local pmc eh
98     .local int i
99     i = 1
100     eh = new 'ExceptionHandler'
101     eh.'handle_types'(.EXCEPTION_INVALID_OPERATION)
102     set_addr eh, catch
103     push_eh catch
104     it = 987 # Arbitrary value, let's hope we never use
105     i = 0
106     goto report
107   catch:
108     finalize eh
109   report:
110     pop_eh
111     ok(i, 'setting invalid type throws')
112 .end
114 .sub iter_clone
115     .local pmc oh, it, cl
116     .local int result
117     oh = new ['Hash']
118     it = iter oh
120     # This chekcs the de facto behavior for code coverage purposes.
121     cl = clone it
122     result = isnull cl
123     ok(result, 'clone of HashIterator gives null')
124 .end
126 # Local Variables:
127 #   mode: pir
128 #   fill-column: 100
129 # End:
130 # vim: expandtab shiftwidth=4 ft=pir: