1
//////////////////////////////////////////////////////////////////////////
3
// pgScript - PostgreSQL Tools
4
// RCS-ID: $Id: pgsTestExpressionCast.cpp 7758 2009-03-26 20:49:59Z dpage $
5
// Copyright (C) 2002 - 2009, The pgAdmin Development Team
6
// This software is released under the BSD Licence
8
//////////////////////////////////////////////////////////////////////////
11
#include "pgsTestSuite.h"
13
#include "pgscript/exceptions/pgsCastException.h"
14
#include "pgscript/objects/pgsVariable.h"
16
#include "pgscript/parser.tab.hh"
17
typedef pgscript::pgsParser::token token;
19
void pgsTestSuite::test_expression_cast(void)
22
pgsVariable * expr = 0;
28
// [1] Create source variable
29
expr = pnew pgsNumber(wxT("123"), pgsInt);
30
TS_ASSERT(expr->is_number() && expr->is_integer() && !expr->is_real());
31
TS_ASSERT(!expr->is_string() && !expr->is_record());
33
// [2] Convert it to the first format
34
cast = pnew pgsCast(token::PGS_REAL, expr->clone());
35
res = cast->eval(vars);
36
TS_ASSERT(res->is_number() && !res->is_integer() && res->is_real());
37
TS_ASSERT(!res->is_string() && !res->is_record());
38
TS_ASSERT(res->value() == expr->value());
41
// [3] Convert it to the second format
42
cast = pnew pgsCast(token::PGS_STRING, expr->clone());
43
res = cast->eval(vars);
44
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
45
TS_ASSERT(res->is_string() && !res->is_record());
46
TS_ASSERT(res->value() == expr->value());
49
// [4] Convert it to the third format
50
cast = pnew pgsCast(token::PGS_RECORD, expr->clone());
51
res = cast->eval(vars);
52
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
53
TS_ASSERT(!res->is_string() && res->is_record());
56
// [5] Test copy constructor
57
cast = pnew pgsCast(token::PGS_STRING, expr->clone());
59
res = copy.eval(vars);
60
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
61
TS_ASSERT(res->is_string() && !res->is_record());
62
TS_ASSERT(res->value() == expr->value());
65
// [6] Test assignment
66
cast = pnew pgsCast(token::PGS_RECORD, expr->clone());
68
res = copy.eval(vars);
69
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
70
TS_ASSERT(!res->is_string() && res->is_record());
73
// [7] Delete source variable
79
// [1] Create source variable
80
expr = pnew pgsNumber(wxT("123.5"), pgsReal);
81
TS_ASSERT(expr->is_number() && !expr->is_integer() && expr->is_real());
82
TS_ASSERT(!expr->is_string() && !expr->is_record());
84
// [2] Convert it to the first format
85
cast = pnew pgsCast(token::PGS_INTEGER, expr->clone());
86
res = cast->eval(vars);
87
TS_ASSERT(res->is_number() && res->is_integer() && !res->is_real());
88
TS_ASSERT(!res->is_string() && !res->is_record());
89
TS_ASSERT(res->value() == wxT("123"));
92
// [3] Convert it to the second format
93
cast = pnew pgsCast(token::PGS_STRING, expr->clone());
94
res = cast->eval(vars);
95
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
96
TS_ASSERT(res->is_string() && !res->is_record());
97
TS_ASSERT(res->value() == expr->value());
100
// [4] Convert it to the third format
101
cast = pnew pgsCast(token::PGS_RECORD, expr->clone());
102
res = cast->eval(vars);
103
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
104
TS_ASSERT(!res->is_string() && res->is_record());
107
// [5] Test copy constructor
108
cast = pnew pgsCast(token::PGS_RECORD, expr->clone());
110
res = copy.eval(vars);
111
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
112
TS_ASSERT(!res->is_string() && res->is_record());
115
// [6] Test assignment
116
cast = pnew pgsCast(token::PGS_STRING, expr->clone());
118
res = copy.eval(vars);
119
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
120
TS_ASSERT(res->is_string() && !res->is_record());
121
TS_ASSERT(res->value() == expr->value());
124
// [7] Delete source variable
130
// [1] Create source variable
131
expr = pnew pgsString(wxT("azerty"));
132
TS_ASSERT(!expr->is_number() && !expr->is_integer() && !expr->is_real());
133
TS_ASSERT(expr->is_string() && !expr->is_record());
135
// [2] Convert it to the first format
136
cast = pnew pgsCast(token::PGS_INTEGER, expr->clone());
139
res = cast->eval(vars);
142
catch (const pgsCastException &)
147
// [3] Convert it to the second format
148
cast = pnew pgsCast(token::PGS_REAL, expr->clone());
151
res = cast->eval(vars);
154
catch (const pgsCastException &)
159
// [4] Convert it to the third format
160
cast = pnew pgsCast(token::PGS_RECORD, expr->clone());
161
res = cast->eval(vars);
162
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
163
TS_ASSERT(!res->is_string() && res->is_record());
166
// [5] Delete source variable
172
// [1] Create source variable
174
rec = pnew pgsRecord(2);
175
rec->insert(0, 0, pnew pgsString(wxT("abc")));
176
rec->insert(0, 1, pnew pgsString(wxT("def")));
177
expr = dynamic_cast<pgsVariable *>(rec);
178
TS_ASSERT(!expr->is_number() && !expr->is_integer() && !expr->is_real());
179
TS_ASSERT(!expr->is_string() && expr->is_record());
181
// [2] Convert it to the first format
182
cast = pnew pgsCast(token::PGS_INTEGER, expr->clone());
185
res = cast->eval(vars);
188
catch (const pgsCastException &)
193
// [3] Convert it to the second format
194
cast = pnew pgsCast(token::PGS_REAL, expr->clone());
197
res = cast->eval(vars);
200
catch (const pgsCastException &)
205
// [4] Convert it to the third format
206
cast = pnew pgsCast(token::PGS_STRING, expr->clone());
207
res = cast->eval(vars);
208
TS_ASSERT(!res->is_number() && !res->is_integer() && !res->is_real());
209
TS_ASSERT(res->is_string() && !res->is_record());
210
TS_ASSERT(res->value() == rec->value());
213
// [5] Delete source variable