fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / oplib.t
blob2120613c750203800388b0cdad01fbff9d4e742e
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/oplib.t - OpLib PMC
9 =head1 SYNOPSIS
11     % prove t/pmc/oplib.t
13 =cut
15 # Hardcoded assumptions for tests:
16 # * We have an op called end
17 # * It has no arguments
18 # * Is the only member of its familiy
19 .const string TESTED_OP = 'end'
20 .const int TESTED_OP_ELEMS = 0
21 .const int TESTED_OP_FAMILIY_ELEMS = 1
22 # Never have an op with this name:
23 .const string TESTED_NOSUCHOP = 'hopeweneverhaveopcodesnamedlikethis'
25 .include 'except_types.pasm'
27 .sub main :main
28     .include 'test_more.pir'
29     plan(13)
30     new_oplib()
31     check_elements()
32     getint_end()
33     getint_no_opcode()
34     getop_end()
35     family_end()
36     family_no_opcode()
37 .end
39 .sub new_oplib
40     $P0 = box "core_ops"
41     $P1 = new ['OpLib'], $P0
42     $I0 = isnull $P1
43     nok($I0, "new OpLib")
44 .end
46 .sub check_elements
47     .local pmc oplib, op, eh
48     .local int n, i
49     $P0 = box "core_ops"
50     oplib = new ['OpLib'], $P0
51     n = elements oplib
52     i = n - 1
53     op = oplib[i]
54     i = isnull op
55     is(i, 0, 'last opcode exists')
56     eh = new ['ExceptionHandler']
57     eh.'handle_types'(.EXCEPTION_OUT_OF_BOUNDS)
58     set_addr eh, catch
59     push_eh eh
60     op = oplib[n]
61     nok(1, 'out of bounds opcode number should throw')
62     goto end
63   catch:
64     finalize eh
65     pop_eh
66     ok(1, 'out of bounds opcode number throws')
67   end:
68 .end
70 .sub getint_end
71     $P0 = box 'core_ops'
72     $P0 = new ['OpLib'], $P0
73     $I1 = $P0[TESTED_OP]
74     $I0 = isne $I1, -1
75     ok($I0, "got end opcode")
76 .end
78 .sub getint_no_opcode
79     $P0 = box 'core_ops'
80     $P0 = new ['OpLib'], $P0
81     $I1 = $P0[TESTED_NOSUCHOP]
82     $I0 = iseq $I1, -1
83     ok($I0, "get non existent opcode fails")
84 .end
86 .sub getop_end
87     .local pmc oplib, op, op2, name
88     $P0 = box 'core_ops'
89     oplib = new ['OpLib'], $P0
91     # Using a string constant
92     op = oplib[TESTED_OP]
93     $I0 = isnull op
94     is($I0, 0, "got end opcode data")
96     $I0 = elements op
97     is($I0, TESTED_OP_ELEMS, "the opcode tested has the expected lenght")
99     # Using a String PMC
100     name = new ['String']
101     name = TESTED_OP
102     op2 = oplib[name]
103     $I0 = isnull op2
104     is($I0, 0, "got end opcode data keyed pmc")
106     $I0 = issame op, op2
107     $S0 = "Implement cacheing, Opcode.is_same, or change comparison"
108     todo($I0, "got same result from both ways", $S0)
110     $I1 = op
111     $I0 = oplib[TESTED_OP]
112     is($I0, $I1, 'opcode number from Opcode and from OpLib is the same')
114     $S0 = op
115     is($S0, TESTED_OP, 'name from Opcode matches name searched for')
116 .end
118 .sub family_end
119     $P0 = box 'core_ops'
120     $P0 = new ['OpLib'], $P0
121     $P1 = $P0.'op_family'(TESTED_OP)
122     $I0 = isnull $P1
123     dec $I0
124     unless $I0 goto done
125     $I0 = elements $P1
126 done:
127     is($I0, TESTED_OP_FAMILIY_ELEMS, "'end' family is not null and has 1 element")
128 .end
130 .sub family_no_opcode
131     $P0 = box 'core_ops'
132     $P0 = new ['OpLib'], $P0
133     $P1 = $P0.'op_family'(TESTED_NOSUCHOP)
134     $I0 = isnull $P1
135     ok($I0, "non existent opcode family is null")
136 .end
138 # Local Variables:
139 #   mode: pir
140 #   fill-column: 100
141 # End:
142 # vim: expandtab shiftwidth=4 ft=pir: