fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / library / pg.t
blobaa0c8d457e8605541da4abb3a6a9dd829218962a
1 #!./parrot
2 # Copyright (C) 2006-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/library/pg.t  -- Postgres Tests
9 =head1 SYNOPSIS
11   ./parrot t/library/pg.t
13 =head1 DESCRIPTION
15 Test Parrot's libpg interface. The test is using the user's default
16 table, which should be created by your sysadmin.
18 =cut
20 .const int N_TESTS = 43
22 ## XXX
23 ## .include 'postgres.pasm'
24 .const int CONNECTION_OK = 0
26 .const int PGRES_COMMAND_OK = 1
27 .const int PGRES_TUPLES_OK = 2
29 .sub main :main
30     load_bytecode 'Test/Builder.pir'
31     .local pmc test
32     test = new [ 'Test'; 'Builder' ]
33     test.'plan'(N_TESTS)
34     push_eh no_pg
36     # TODO: fix when exception handling works again
37     loadlib $P0, 'libpq'
38     if $P0 goto have_lib
39     loadlib $P0, 'pq'
40     unless $P0 goto no_pg
41  have_lib:
42     load_bytecode 'postgres.pir'
43     pop_eh
44     test.'ok'(1, 'load_bytecode')
45     load_bytecode 'Pg.pir'
46     test.'ok'(1, 'load_bytecode Pg')
48     .local pmc cl, con, res
49     cl = new 'Pg'
50     test.'ok'(1, 'Pg class exists')
51     con = cl.'connectdb'('')           # assume table = user is present
52     $I0 = isa con, ['Pg'; 'Conn']
53     test.'ok'($I0, 'con isa Pg;Conn')
54     $I0 = istrue con
56     if $I0 goto have_connected
57         test.'skip'( 39, 'no Pg connection; skipping remaining tests' )
58         .return()
60   have_connected:
61     test.'ok'($I0, 'con is true after connect')
62     $I0 = con.'status'()
63     $I1 = iseq $I0, CONNECTION_OK
64     test.'ok'($I1, 'con.status() == CONNECTION_OK ')
65     # PGconn
66     $P0 = con.'PGconn'()
67     $P1 = get_root_global ['parrot';'Pg'], 'PQstatus'
68     $I0 = $P1($P0)
70     $I1 = iseq $I0, CONNECTION_OK
71     test.'ok'($I1, 'status(PGconn) == CONNECTION_OK ')
72     # exec
73     res = con.'exec'('BEGIN')
74     test.'ok'(1, 'exec BEGIN called')
75     $I0 = isa res, ['Pg'; 'Result']
76     test.'ok'($I0, 'res isa Pg;Result')
77     $I0 = res.'resultStatus'()
78     $I1 = iseq $I0, PGRES_COMMAND_OK
79     test.'ok'($I1, 'res.resultStatus() == PGRES_COMMAND_OK ')
80     res.'clear'()
81     # install a notice receiver to silent the CREATE
82     .const 'Sub' cb = 'notice'
83     $P0 = con.'setNoticeReceiver'(cb, test)
84     # create a temp table
85     res = con.'exec'(<<'EOT')
86 CREATE TEMP TABLE parrot_tbl (
87     id     serial,
88     foo    text,
89     bar    text
91 EOT
92     $I0 = res.'resultStatus'()
93     $I1 = iseq $I0, PGRES_COMMAND_OK
94     test.'ok'($I1, 'table created PGRES_COMMAND_OK ')
95     # add a row
96     res = con.'exec'(<<'EOT')
97 INSERT INTO parrot_tbl (foo, bar) VALUES('a', 'b')
98 EOT
99     $I0 = res.'resultStatus'()
100     $I1 = iseq $I0, PGRES_COMMAND_OK
101     test.'ok'($I1, 'insert row PGRES_COMMAND_OK ')
102     # get all
103     res = con.'exec'(<<'EOT')
104 SELECT * FROM parrot_tbl
106     $I0 = res.'resultStatus'()
107     $I1 = iseq $I0, PGRES_TUPLES_OK
108     test.'ok'($I1, 'select * PGRES_TUPLES_OK ')
109     # check tuples
110     $I0 = res.'ntuples'()
111     $I1 = iseq $I0, 1
112     test.'ok'($I1, 'res.ntuples == 1')
113     $I0 = res.'nfields'()
114     $I1 = iseq $I0, 3
115     test.'ok'($I1, 'res.nfields == 3')
116     # check field name
117     $S0 = res.'fname'(1)
118     $I1 = iseq $S0, "foo"
119     test.'ok'($I1, 'res.fname(1) == "foo"')
120     $S0 = res.'fname'(2)
121     $I1 = iseq $S0, "bar"
122     test.'ok'($I1, 'res.fname(1) == "bar"')
123     $I0 = res.'fnumber'('id')
124     $I1 = iseq $I0, 0
125     test.'ok'($I1, 'res.fnumber("id") == 0')
126     $I0 = res.'fnumber'('bar')
127     $I1 = iseq $I0, 2
128     test.'ok'($I1, 'res.fnumber("bar") == 2')
129     $I0 = res.'fnumber'('no_such_col_name')
130     $I1 = iseq $I0, -1
131     test.'ok'($I1, 'res.fnumber("no_such_col_name") == -1')
132     # check vals
133     $S0 = res.'getvalue'(0, 1)
134     $I1 = iseq $S0, 'a'
135     test.'ok'($I1, 'getvalue(0, 1) == "a"')
136     $S0 = res.'getvalue'(0, 2)
137     $I1 = iseq $S0, 'b'
138     test.'ok'($I1, 'getvalue(0, 2) == "b"')
139 # TODO
140     # execParams
141     res = con.'execParams'(<<'EOT', 'c', 'd')
142 INSERT INTO parrot_tbl (foo, bar) VALUES($1, $2)
144     $I0 = res.'resultStatus'()
145     $I1 = iseq $I0, PGRES_COMMAND_OK
146     test.'ok'($I1, 'insert w execParams PGRES_COMMAND_OK ')
147     res = con.'exec'(<<'EOT')
148 SELECT * FROM parrot_tbl
150     $I0 = res.'ntuples'()
151     $I1 = iseq $I0, 2
152     test.'ok'($I1, 'res.ntuples == 2')
153     # check vals
154     $S0 = res.'getvalue'(1, 1)
155     $I1 = iseq $S0, 'c'
156     test.'ok'($I1, 'getvalue(1, 1) == "c"')
157     $S0 = res.'getvalue'(1, 2)
158     $I1 = iseq $S0, 'd'
159     test.'ok'($I1, 'getvalue(1, 2) == "d"')
160     # prepare
161     res = con.'prepare'('ins2', <<'EOT', 2)
162 INSERT INTO parrot_tbl (foo, bar) VALUES($1, $2)
164     $I0 = res.'resultStatus'()
165     $I1 = iseq $I0, PGRES_COMMAND_OK
166     test.'ok'($I1, 'prepare PGRES_COMMAND_OK ')
168     res = con.'execPrepared'('ins2', 'e', 'f')
169     $I0 = res.'resultStatus'()
170     $I1 = iseq $I0, PGRES_COMMAND_OK
171     test.'ok'($I1, 'execPrepared PGRES_COMMAND_OK ')
172     res = con.'exec'(<<'EOT')
173 SELECT * FROM parrot_tbl
175     $I0 = res.'ntuples'()
176     $I1 = iseq $I0, 3
177     test.'ok'($I1, 'res.ntuples == 3')
179     res = con.'execPrepared'('ins2', 'g', 'h')
180     $I0 = res.'resultStatus'()
181     $I1 = iseq $I0, PGRES_COMMAND_OK
182     test.'ok'($I1, 'execPrepared PGRES_COMMAND_OK ')
183     res = con.'exec'(<<'EOT')
184 SELECT * FROM parrot_tbl
186     $I0 = res.'ntuples'()
187     $I1 = iseq $I0, 4
188     test.'ok'($I1, 'res.ntuples == 4')
189     res = con.'exec'(<<'EOT')
190 INSERT INTO parrot_tbl (foo) VALUES('i')
192     $I0 = res.'resultStatus'()
193     $I1 = iseq $I0, PGRES_COMMAND_OK
194     test.'ok'($I1, 'insert row PGRES_COMMAND_OK ')
195     res = con.'exec'(<<'EOT')
196 SELECT * FROM parrot_tbl
198     $I0 = res.'ntuples'()
199     $I1 = iseq $I0, 5
200     test.'ok'($I1, 'res.ntuples == 5')
201     $S0 = res.'getvalue'(4, 1)
202     $I1 = iseq $S0, 'i'
203     test.'ok'($I1, 'getvalue(4, 1) == "i"')
204     $S0 = res.'getvalue'(4, 2)
205     $I1 = iseq $S0, ''
206     test.'ok'($I1, 'getvalue(4, 2) == ""')
207     $I0 = res.'getisnull'(4, 1)
208     $I1 = iseq $I0, 0
209     test.'ok'($I1, 'getisnull(4, 1) == 0')
210     $I0 = res.'getisnull'(4, 2)
211     $I1 = iseq $I0, 1
212     test.'ok'($I1, 'getisnull(4, 2) == 1')
213     # done
214     res = con.'exec'('ABORT')
215     $I0 = res.'resultStatus'()
216     $I1 = iseq $I0, PGRES_COMMAND_OK
217     test.'ok'($I1, 'ABORT succeeded')
218     null res
219     # this calls __finalize, but there isn't a good way to test this
220     # because any references to the object would prevent destruction
221     #'
222     sweep 1
223     con.'finish'()
224     test.'ok'(1, 'con.finish()')
225     $I0 = isfalse con
226     test.'ok'($I0, 'con is false after finish')
227     test.'finish'()
228     end
229 no_pg:
230     .local pmc ex
231     .local string msg
232     .get_results(ex)
233     msg = ex
234     test.'skip'(N_TESTS)
235     test.'finish'()
236 .end
238 # notice receiver callback function
239 .sub 'notice'
240     .param pmc test
241     .param pmc res
242     test.'ok'(1, 'notice receiver called')
243     # res ought to be a PGresult struct
244     $S0 = typeof res
245     $I0 = $S0 == 'UnManagedStruct'
246     test.'ok'($I0, 'notice callback got a struct')
248     .local pmc st
249     st = get_root_global ['parrot';'Pg'], 'PQresultStatus'
250     $I0 = st(res)
251     $I1 = iseq $I0, PGRES_COMMAND_OK
252     test.'ok'($I1, 'notice result is still ok')
253 .end
255 # Local Variables:
256 #   mode: pir
257 #   fill-column: 100
258 # End:
259 # vim: expandtab shiftwidth=4 ft=pir: