fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / managedstruct.t
blobf1ddd0ed228557b306eebb8f3bc6427864683a94
1 #!./parrot
2 # Copyright (C) 2001-2008, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/managedstruct.t - Managed C Structure
9 =head1 SYNOPSIS
11     % prove t/pmc/managedstruct.t
13 =head1 DESCRIPTION
15 Tests the ManagedStruct PMC. Checks element access and memory allocation.
17 =cut
19 .sub main :main
20     .include 'test_more.pir'
21     plan(24)
23     set_managedstruct_size()
24     element_access()
25     named_element_access_int16()
26     nested_struct_offsets()
27     interface_check()
28 .end
30 .sub set_managedstruct_size
31     new $P0, ['ManagedStruct']
32     set $I0,$P0
33     is($I0, 0, "empty ManagedStruct has size 0")
34     set $P0,1
35     set $I0,$P0
36     is($I0, 1, "non-empty ManagedStruct has correct size")
37     set $P0,2
38     set $I0,$P0
39     is($I0, 2, "non-empty ManagedStruct has correct size")
40 .end
42 #pasm_output_is( <<'CODE', <<'OUTPUT', "element access - float, double" );
43 .sub element_access
45     #element access - float, double
46     new $P2, ['ResizablePMCArray']
47     .include "datatypes.pasm"
48     push $P2, .DATATYPE_FLOAT
49     push $P2, 2 # 2 elem array
50     push $P2, 0
51     push $P2, .DATATYPE_DOUBLE
52     push $P2, 0
53     push $P2, 0
54     new $P0, ['ManagedStruct'], $P2
55     # must have set size automatically
56     # this is hopefully 2*4+8 everywhere
57     set $I0, $P0
58     is($I0, 16, "ManagedStruct has correct size")
59     set $P0[0;0], 14.1
60     set $N0, $P0[0;0]
61     set $P0[0;1], 14.2
62     set $P0[1], 14.3
63     set $N0, $P0[0;0]
64     sub $N1, $N0, 14.1
65     cmp $I0, $N1, 0.000001
66     ok($I0, "stored float has correct value")
67     set $N0, $P0[0;1]
68     sub $N1, $N0, 14.2
69     cmp $I0, $N1, 0.000001
70     ok($I0, "stored float has correct value")
71     set $N0, $P0[1]
72     sub $N1, $N0, 14.3
73     cmp $I0, $N1, 0.000001
74     ok($I0, "stored float has correct value")
77     #element access - char, short
78     new $P2, ['ResizablePMCArray']
79     push $P2, .DATATYPE_CHAR
80     push $P2, 2 # 2 elem char array
81     push $P2, 0
82     new $P0, ['ManagedStruct'], $P2
83     set $I0, $P0
84     $I1 = isge $I0, 2
85     ok($I1, "ManagedStruct size is at least 2")
87     set $P0[0;0], 1
88     set $P0[0;1], 258   # must be truncated to 2
89     set $I0, $P0[0;0]
90     is($I0, 1, "char val of 1 is correct")
91     set $I0, $P0[0;1]
92     is($I0, 2, "char val of 258 retrieved as 2")
93     # now acces that as a short
94     new $P2, ['ResizablePMCArray']
95     push $P2, .DATATYPE_SHORT
96     push $P2, 1
97     push $P2, 0
98     assign $P0, $P2
99     # should be 2*256+1 or 1*256+2
100     set $I0, $P0[0]
101     $I1 = $I0 == 513
102     $I2 = $I0 == 258
103     $I0 = $I1 | $I2
104     ok($I0, "short val retrieved correctly")
105 .end
107 .sub named_element_access_int16
108     new $P1, ['OrderedHash']
109     set  $P1['x'], .DATATYPE_INT16
110     push $P1, 0
111     push $P1, 0
113     set $P1['y'], .DATATYPE_INT16
114     push $P1, 0
115     push $P1, 0
117     # need a ManagedStruct to allocate data memory
118     new $P2, ['ManagedStruct'], $P1
120     # set struct values by name
121     set $I0, 2
122     set $P2["x"], $I0
124     set $I1, 16
125     set $S0, "y"
126     set $P2[$S0], $I1
128     # get struct values by struct item idx
129     set $I2, $P2[0]
130     set $I3, $P2[1]
132     is($I2, 2, "'x' value by idx is correct")
133     is($I3, 16, "'y' value by idx is correct")
135     # get struct values by name
136     set $I2, $P2["x"]
137     set $I3, $P2["y"]
139     is($I2, 2, "'x' value by name is correct")
140     is($I3, 16, "'y' value by name is correct")
141 .end
143 #pasm_output_is( <<'CODE', <<'OUTPUT', "nested struct offsets" );
144 .sub nested_struct_offsets
146     # the nested structure
147     new $P3, ['ResizablePMCArray']
148     push $P3, .DATATYPE_INT
149     push $P3, 0
150     push $P3, 0
151     push $P3, .DATATYPE_INT
152     push $P3, 0
153     push $P3, 0
154     new $P4, ['UnManagedStruct'], $P3
155     # outer structure
156     new $P2, ['ResizablePMCArray']
157     push $P2, .DATATYPE_INT
158     push $P2, 0
159     push $P2, 0
160     push $P2, .DATATYPE_STRUCT
161     # attach the unmanged struct as property
162     set $P1, $P2[-1]
163     setprop $P1, "_struct", $P4
164     push $P2, 0
165     push $P2, 0
166     push $P2, .DATATYPE_INT
167     push $P2, 0
168     push $P2, 0
169     # attach struct initializer
170     new $P5, ['UnManagedStruct'], $P2
172     # now check offsets
173     set $I0, $P2[2]
174     is($I0, 0, "offset 2 looks good")
175     set $I0, $P2[5]
176     is($I0, 4, "offset 5 looks good")
177     set $I0, $P2[8]
178     is($I0, 12, "offset 8 looks good")
179     # nested
180     set $I0, $P3[2]
181     is($I0, 0, "nested offest 2 looks good")
182     set $I0, $P3[5]
183     is($I0, 4, "nested offset 5 looks good")
185     # check struct size
186     set $I0, $P5
187     is($I0, 16, "struct size looks good")
188     # nested
189     set $I0, $P4
190     is($I0, 8, "nested struct size looks good")
191 .end
193 .sub interface_check
194     .local pmc pmc1
195     pmc1 = new ['ManagedStruct']
196     .local int bool1
197     does bool1, pmc1, "scalar"
198     is(bool1, 1, "ManagedStruct does scalar")
199     does bool1, pmc1, "no_interface"
200     is(bool1, 0, "ManagedStruct doesn't do no_interface")
201 .end
203 # Local Variables:
204 #   mode: pir
205 #   fill-column: 100
206 # End:
207 # vim: expandtab shiftwidth=4 ft=pir: