1
//////////////////////////////////////////////////////////////////////////
3
// pgScript - PostgreSQL Tools
5
// Copyright (C) 2002 - 2009, The pgAdmin Development Team
6
// This software is released under the PostgreSQL Licence
8
//////////////////////////////////////////////////////////////////////////
11
#include "pgsTestSuite.h"
13
#include "pgscript/expressions/pgsAssign.h"
14
#include "pgscript/expressions/pgsGenInt.h"
15
#include "pgscript/expressions/pgsGenRegex.h"
16
#include "pgscript/expressions/pgsGenString.h"
17
#include "pgscript/expressions/pgsGreater.h"
18
#include "pgscript/expressions/pgsIdent.h"
19
#include "pgscript/expressions/pgsLower.h"
20
#include "pgscript/expressions/pgsMinus.h"
21
#include "pgscript/expressions/pgsPlus.h"
22
#include "pgscript/objects/pgsNumber.h"
23
#include "pgscript/objects/pgsString.h"
24
#include "pgscript/statements/pgsBreakStmt.h"
25
#include "pgscript/statements/pgsContinueStmt.h"
26
#include "pgscript/statements/pgsExpressionStmt.h"
27
#include "pgscript/statements/pgsIfStmt.h"
28
#include "pgscript/statements/pgsStmtList.h"
29
#include "pgscript/statements/pgsWhileStmt.h"
31
void pgsTestSuite::test_statement_stmt(void)
36
// Test Assignment Statement
38
pgsStmt * S1 = 0, * S2 = 0, * S3 = 0;
41
S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("x"),
42
pnew pgsNumber(wxT("0"), pgsInt)));
46
S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("y"),
47
pnew pgsNumber(wxT("2"), pgsInt)));
50
// Check that assignments went fine
51
TS_ASSERT(vars[wxT("x")]->value() == wxT("0"));
52
TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
55
S3 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("x"),
56
pnew pgsNumber(wxT("1"), pgsInt)));
59
TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
60
TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
67
// Test If Statement (if 0 then z := 0 else z := 1 fi)
70
pgsStmtList * SL1 = 0, * SL2 = 0;
73
SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
74
SL1->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
75
pnew pgsNumber(wxT("0"), pgsInt))));
78
SL2 = pnew pgsStmtList(pgsTestClass::get_cout());
79
SL2->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
80
pnew pgsNumber(wxT("1"), pgsInt))));
82
// if 0 then z := 0 else z := 1 fi
83
S1 = pnew pgsIfStmt(pnew pgsNumber(wxT("0"), pgsInt), SL1, SL2);
86
TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
87
TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
88
TS_ASSERT(vars[wxT("z")]->value() == wxT("1"));
93
// Test If Statement (if 1 then z := 0 else z := 1 fi)
96
pgsStmtList * SL1 = 0, * SL2 = 0;
99
SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
100
SL1->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
101
pnew pgsNumber(wxT("0"), pgsInt))));
104
SL2 = pnew pgsStmtList(pgsTestClass::get_cout());
105
SL2->insert_front(pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"),
106
pnew pgsNumber(wxT("1"), pgsInt))));
108
// if 1 then z := 0 else z := 1 fi
109
S1 = pnew pgsIfStmt(pnew pgsNumber(wxT("1"), pgsInt), SL1, SL2);
112
TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
113
TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
114
TS_ASSERT(vars[wxT("z")]->value() == wxT("0"));
119
// Test While Statement (while i do s := s + i; i := i-1 done)
121
pgsStmt * S1 = 0, * S2 = 0, * S3 = 0;
122
pgsStmtList * SL1 = 0;
125
pgsExpressionStmt(pnew pgsAssign(wxT("i"), pnew pgsNumber(wxT("3"),
126
pgsInt))).eval(vars);
129
pgsExpressionStmt(pnew pgsAssign(wxT("s"), pnew pgsNumber(wxT("0"),
130
pgsInt))).eval(vars);
132
TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
133
TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
134
TS_ASSERT(vars[wxT("z")]->value() == wxT("0"));
135
TS_ASSERT(vars[wxT("i")]->value() == wxT("3"));
136
TS_ASSERT(vars[wxT("s")]->value() == wxT("0"));
137
TS_ASSERT(vars.size() == 5);
140
TS_ASSERT(pgsIdent(wxT("i")).eval(vars)->value() == wxT("3"));
142
TS_ASSERT(pgsPlus(pnew pgsIdent(wxT("s")),
143
pnew pgsIdent(wxT("i"))).eval(vars)->value() == wxT("3"));
146
S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("s"),
147
pnew pgsPlus(pnew pgsIdent(wxT("s")),
148
pnew pgsIdent(wxT("i")))));
150
S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("i"),
151
pnew pgsMinus(pnew pgsIdent(wxT("i")),
152
pnew pgsNumber(wxT("1"), pgsInt))));
153
SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
154
SL1->insert_front(S2);
155
SL1->insert_front(S1);
157
// while i do s := s + i; i := i-1 done
158
S3 = pnew pgsWhileStmt(pnew pgsIdent(wxT("i")), SL1);
162
TS_ASSERT(vars[wxT("x")]->value() == wxT("1"));
163
TS_ASSERT(vars[wxT("y")]->value() == wxT("2"));
164
TS_ASSERT(vars[wxT("z")]->value() == wxT("0"));
165
TS_ASSERT(vars[wxT("i")]->value() == wxT("0"));
166
TS_ASSERT(vars[wxT("s")]->value() == wxT("6"));
167
TS_ASSERT(vars.size() == 5);
170
// Test While Statement
181
pgsStmt * S1 = 0, * S2 = 0, * S3 = 0, * S4 = 0;
182
pgsStmtList * SL1 = 0, * SL2 = 0;
185
pgsExpressionStmt(pnew pgsAssign(wxT("i"), pnew pgsNumber(wxT("0"),
186
pgsInt))).eval(vars);
189
pgsExpressionStmt(pnew pgsAssign(wxT("s"), pnew pgsNumber(wxT("5"),
190
pgsInt))).eval(vars);
192
TS_ASSERT(vars[wxT("i")]->value() == wxT("0"));
193
TS_ASSERT(vars[wxT("s")]->value() == wxT("5"));
196
S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("i"),
197
pnew pgsPlus(pnew pgsIdent(wxT("i")),
198
pnew pgsNumber(wxT("1"), pgsInt))));
201
S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("s"),
202
pnew pgsPlus(pnew pgsIdent(wxT("s")),
203
pnew pgsNumber(wxT("1"), pgsInt))));
205
// s := s + 1; continue
206
SL2 = pnew pgsStmtList(pgsTestClass::get_cout());
207
SL2->insert_back(pnew pgsContinueStmt());
208
SL2->insert_back(S2);
211
S3 = pnew pgsIfStmt(pnew pgsGreater(pnew pgsIdent(wxT("i")),
212
pnew pgsNumber(wxT("5"))), pnew pgsBreakStmt(), SL2);
215
SL1 = pnew pgsStmtList(pgsTestClass::get_cout());
216
SL1->insert_back(S1);
217
SL1->insert_back(S3);
218
S4 = pnew pgsWhileStmt(pnew pgsLower(pnew pgsIdent(wxT("i")),
219
pnew pgsNumber(wxT("10"))), SL1);
223
TS_ASSERT(vars[wxT("i")]->value() == wxT("6"));
224
TS_ASSERT(vars[wxT("s")]->value() == wxT("5"));
227
// Test Assign Statement with a generator
229
pgsExpression * N0 = 0, * N1 = 0, * N2 = 0;
230
pgsStmt * S1 = 0, * S2 = 0, * S3 = 0;
233
pgsExpressionStmt(pnew pgsAssign(wxT("m"),
234
pnew pgsNumber(wxT("-10")))).eval(vars);
236
// integer(m, 10, true, now)
237
N0 = pnew pgsGenInt(pnew pgsIdent(wxT("m")), pnew pgsNumber(wxT("10")),
238
pnew pgsNumber(wxT("1")), pnew pgsNumber(wxString()
239
<< wxDateTime::GetTimeNow()));
240
// string(1, 10, 2, now)
241
N1 = pnew pgsGenString(pnew pgsNumber(wxT("1")),
242
pnew pgsNumber(wxT("10")), pnew pgsNumber(wxT("2")),
243
pnew pgsNumber(wxString() << wxDateTime::GetTimeNow()));
244
// regex(a{2}[a-zA-Z]{10}c{3}, now)
245
N2 = pnew pgsGenRegex(pnew pgsString(wxT("a{2}[a-zA-Z]{10}c{3}")),
246
pnew pgsNumber(wxString() << wxDateTime::GetTimeNow()));
248
// x := integer(m, 10, true, now)
249
S1 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("x"), N0));
251
// y := string(1, 10, 2, now)
252
S2 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("y"), N1));
254
// z := regex(a{2}[a-zA-Z]{10}c{3}, now)
255
S3 = pnew pgsExpressionStmt(pnew pgsAssign(wxT("z"), N2));
258
wxString result1, result2, result3;
260
for (int i = 0; i < 21; i++)
262
// Check that x result is unique (we wanted to generate a sequence)
263
result1 = pgsIdent(wxT("x")).eval(vars)->value();
264
TS_ASSERT(sav.Index(result1) == wxNOT_FOUND);
267
// Check that y result is at least 3 characters (two words of 1
268
// character with a space in the middle) and less than 21
269
result2 = pgsIdent(wxT("y")).eval(vars)->value();
270
TS_ASSERT(result2.Length() >= 3 && result2.Length() <= 21);
272
// Check the regex-based generators
273
result3 = pgsIdent(wxT("z")).eval(vars)->value();
274
TS_ASSERT(result3.Length() == 15);
275
TS_ASSERT(result3.StartsWith(wxT("aa")) && result3.EndsWith(wxT("ccc")));
278
pdelete(S1); // Deletes N0
279
pdelete(S2); // Deletes N1
280
pdelete(S3); // Deletes N2
284
// Test an unknown identifier
288
E1 = pnew pgsIdent(wxT("unknown"));
289
TS_ASSERT(E1->eval(vars)->value() == wxT(""));