pgsOperand pgsGenReference::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand table(m_table->eval(vars)); pgsOperand column(m_column->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (table->is_string() && !table->value().IsEmpty() && column->is_string() && !column->value().IsEmpty() && sequence->is_integer() && seed->is_integer()) { // Check wheter the table and the column do exist pgsOperand result = pgsExecute(wxString() << wxT("SELECT 1 FROM ") << table->value() << wxT(" WHERE ") << column->value() << wxT(" = ") << column->value(), 0, m_app).eval(vars); if (result->pgs_is_true()) { long aux_sequence, aux_seed; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsReferenceGen(m_app, table->value(), column->value(), aux_sequence != 0, aux_seed)); } else { throw pgsParameterException(wxString() << value() << wxT(":\ntable/column does not exist")); } } else { // Deal with errors if (!table->is_string() || table->value().IsEmpty()) { throw pgsParameterException(wxString() << value() << wxT(":\ntable should be a non-empty string")); } else if (!column->is_string() || column->value().IsEmpty()) { throw pgsParameterException(wxString() << value() << wxT(":\ncolumn should be a non-empty string")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenDictionary::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand file_path(m_file_path->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); pgsOperand wx_conv(m_wx_conv->eval(vars)); // Check parameters and create the generator if (file_path->is_string() && sequence->is_integer() && seed->is_integer() && wx_conv->is_string()) { wxFileName file(file_path->value()); if (file.FileExists() && file.IsFileReadable()) { long aux_sequence, aux_seed; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsDictionaryGen(file_path->value(), aux_sequence != 0, aux_seed, wxCSConv(wx_conv->value()))); } else { throw pgsParameterException(wxString() << value() << wxT(":\nFile <") << file_path->value() << wxT("> does not exist")); } } else { // Deal with errors if (!file_path->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nfile should be a string")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else if (!seed->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nencoding should be a string")); } } }
pgsOperand pgsGenDate::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand min(m_min->eval(vars)); pgsOperand max(m_max->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (min->is_string() && max->is_string() && sequence->is_integer() && seed->is_integer()) { wxDateTime aux_min, aux_max; if (aux_min.ParseDate(min->value()) != 0 && aux_max.ParseDate(max->value()) != 0 && aux_min.IsValid() && aux_max.IsValid()) { long aux_sequence, aux_seed; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsDateGen(aux_min, aux_max, aux_sequence != 0, aux_seed)); } else { throw pgsParameterException(wxString() << value() << wxT(":\nmin and/or max dates are not valid")); } } else { // Deal with errors if (!min->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nmin should be a string")); } else if (!max->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nmax should be a string")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenReal::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand min(m_min->eval(vars)); pgsOperand max(m_max->eval(vars)); pgsOperand precision(m_precision->eval(vars)); pgsOperand sequence(m_sequence->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (min->is_number() && max->is_number() && sequence->is_integer() && seed->is_integer() && precision->is_integer()) { long aux_sequence, aux_seed, aux_precision; sequence->value().ToLong(&aux_sequence); seed->value().ToLong(&aux_seed); precision->value().ToLong(&aux_precision); return pnew pgsGenerator(pgsVariable::pgsTReal, pnew pgsRealGen(pgsVariable::num(min), pgsVariable::num(max), aux_precision, aux_sequence != 0, aux_seed)); } else { // Deal with errors if (!min->is_number()) { throw pgsParameterException(wxString() << value() << wxT(":\nmin should be a number")); } else if (!max->is_number()) { throw pgsParameterException(wxString() << value() << wxT(":\nmax should be a number")); } else if (!precision->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nprecision should be an integer")); } else if (!sequence->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nsequence should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenString::eval(pgsVarMap &vars) const { // Evaluate parameters pgsOperand min(m_min->eval(vars)); pgsOperand max(m_max->eval(vars)); pgsOperand nb_words(m_nb_words->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (min->is_integer() && max->is_integer() && nb_words->is_integer() && seed->is_integer()) { long aux_min, aux_max, aux_nb_words, aux_seed; min->value().ToLong(&aux_min); max->value().ToLong(&aux_max); nb_words->value().ToLong(&aux_nb_words); seed->value().ToLong(&aux_seed); return pnew pgsGenerator(pgsVariable::pgsTString, pnew pgsStringGen(aux_min, aux_max, aux_nb_words, aux_seed)); } else { // Deal with errors if (!min->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nmin should be an integer")); } else if (!max->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nmax should be an integer")); } else if (!nb_words->is_integer()) { throw pgsParameterException(wxString() << value() << wxT(":\nnb_words should be an integer")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
pgsOperand pgsGenRegex::eval(pgsVarMap & vars) const { // Evaluate parameters pgsOperand regex(m_regex->eval(vars)); pgsOperand seed(m_seed->eval(vars)); // Check parameters and create the generator if (regex->is_string() && seed->is_integer()) { long aux_seed; seed->value().ToLong(&aux_seed); pgsRegexGen * gen = pnew pgsRegexGen(regex->value(), aux_seed); if (!gen->is_valid()) { pdelete(gen); throw pgsParameterException(wxString() << value() << wxT(":\nregex is not a valid regular expression")); } else { return pnew pgsGenerator(pgsVariable::pgsTString, gen); } } else { // Deal with errors if (!regex->is_string()) { throw pgsParameterException(wxString() << value() << wxT(":\nregex should be a string")); } else { throw pgsParameterException(wxString() << value() << wxT(":\nseed should be an integer")); } } }
void pgsTestSuite::test_operator_number(void) { // From a number with a string { // [1] Create variables pgsVariable * var0 = 0; var0 = pnew pgsNumber(wxT("100")); pgsVariable * var1 = 0; var1 = pnew pgsString(wxT("5")); // [2] Addition try { (*var0 + *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [3] Subtraction try { (*var0 - *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [4] Multiplication try { (*var0 * *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [5] Division try { (*var0 / *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [6] Modulo try { (*var0 % *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [9] Equal try { (*var0 == *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [10] Different try { (*var0 != *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [11] Lower try { (*var0 < *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [12] Greater try { (*var0 > *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [13] Lower or equal try { (*var0 <= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [14] Greater or equal try { (*var0 >= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [15] Not TS_ASSERT((!(*var0))->value() == wxT("0")); pgsOperand op(pnew pgsNumber(wxT("0"))); TS_ASSERT((!(*op))->value() == wxT("1")); // [16] Almost equal try { (*var0 &= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [17] Is true? TS_ASSERT(var0->pgs_is_true() == true); TS_ASSERT((!(*var0))->pgs_is_true() == false); // [18] Delete variables pdelete(var0); pdelete(var1); } // From a number (integer) with a real number { // [1] Create variables pgsVariable * var0 = 0; var0 = pnew pgsNumber(wxT("100"), pgsInt); pgsVariable * var1 = 0; var1 = pnew pgsNumber(wxT("5"), pgsReal); // [2] Addition TS_ASSERT((*var0 + *var1)->value() == wxT("105")); // [3] Subtraction TS_ASSERT((*var0 - *var1)->value() == wxT("95")); // [4] Multiplication TS_ASSERT((*var0 * *var1)->value() == wxT("500")); // [5] Division TS_ASSERT((*var0 / *var1)->value() == wxT("20")); // [6] Modulo TS_ASSERT((*var0 % *var1)->value() == wxT("0")); // [9] Equal TS_ASSERT((*var0 == *var1)->value() == wxT("0")); // [10] Different TS_ASSERT((*var0 != *var1)->value() == wxT("1")); // [11] Lower TS_ASSERT((*var0 < *var1)->value() == wxT("0")); // [12] Greater TS_ASSERT((*var0 > *var1)->value() == wxT("1")); // [13] Lower or equal TS_ASSERT((*var0 <= *var1)->value() == wxT("0")); // [14] Greater or equal TS_ASSERT((*var0 >= *var1)->value() == wxT("1")); // [15] Not TS_ASSERT((!(*var0))->value() == wxT("0")); // [16] Almost equal TS_ASSERT((*var0 &= *var1)->value() == wxT("0")); // [17] Is true? TS_ASSERT(var0->pgs_is_true() == true); TS_ASSERT((!(*var0))->pgs_is_true() == false); // [18] Delete variables pdelete(var0); pdelete(var1); } // From a number with a record { // [1] Create variables pgsVariable * var0 = 0; var0 = pnew pgsNumber(wxT("100")); pgsRecord * rec = 0; rec = pnew pgsRecord(1); rec->insert(0, 0, pnew pgsString(wxT("5"))); pgsVariable * var1 = 0; var1 = rec; // [2] Addition try { (*var0 + *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [3] Subtraction try { (*var0 - *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [4] Multiplication try { (*var0 * *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [5] Division try { (*var0 / *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [6] Modulo try { (*var0 % *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [9] Equal try { (*var0 == *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [10] Different try { (*var0 != *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [11] Lower try { (*var0 < *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [12] Greater try { (*var0 > *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [13] Lower or equal try { (*var0 <= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [14] Greater or equal try { (*var0 >= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [15] Not TS_ASSERT((!(*var0))->value() == wxT("0")); // [16] Almost equal try { (*var0 &= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [17] Is true? TS_ASSERT(var0->pgs_is_true() == true); TS_ASSERT((!(*var0))->pgs_is_true() == false); // [18] Delete variables pdelete(var0); pdelete(var1); } // From a number with a record { // [1] Create variables pgsVariable * var0 = 0; var0 = pnew pgsNumber(wxT("100")); pgsRecord * rec = 0; rec = pnew pgsRecord(1); rec->insert(0, 0, pnew pgsNumber(wxT("5"))); rec->insert(1, 0, pnew pgsNumber(wxT("1"))); pgsVariable * var1 = 0; var1 = rec; // [2] Addition try { (*var0 + *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [3] Subtraction try { (*var0 - *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [4] Multiplication try { (*var0 * *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [5] Division try { (*var0 / *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [6] Modulo try { (*var0 % *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [9] Equal try { (*var0 == *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [10] Different try { (*var0 != *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [11] Lower try { (*var0 < *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [12] Greater try { (*var0 > *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [13] Lower or equal try { (*var0 <= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [14] Greater or equal try { (*var0 >= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [18] Delete variables pdelete(var0); pdelete(var1); } // From a number with a string generator { // [1] Create variables pgsVariable * var0 = 0; var0 = pnew pgsNumber(wxT("100")); pgsStringGen * gen = 0; gen = pnew pgsStringGen(10, 20); pgsVariable * var1 = 0; var1 = pnew pgsGenerator(pgsVariable::pgsTString, gen); // [2] Addition try { (*var0 + *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [3] Subtraction try { (*var0 - *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [4] Multiplication try { (*var0 * *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [5] Division try { (*var0 / *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [6] Modulo try { (*var0 % *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [9] Equal try { (*var0 == *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [10] Different try { (*var0 != *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [11] Lower try { (*var0 < *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [12] Greater try { (*var0 > *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [13] Lower or equal try { (*var0 <= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [14] Greater or equal try { (*var0 >= *var1); TS_ASSERT(false); } catch (const pgsException &) { } // [18] Delete variables pdelete(var0); pdelete(var1); } // From a number with an integer generator { // [1] Create variables pgsVariable * var0 = 0; var0 = pnew pgsNumber(wxT("100")); pgsIntegerGen * gen = 0; gen = pnew pgsIntegerGen(5, 5); pgsVariable * var1 = 0; var1 = pnew pgsGenerator(pgsVariable::pgsTInt, gen); // [2] Addition TS_ASSERT((*var0 + *var1)->value() == wxT("105")); // [3] Subtraction TS_ASSERT((*var0 - *var1)->value() == wxT("95")); // [4] Multiplication TS_ASSERT((*var0 * *var1)->value() == wxT("500")); // [5] Division TS_ASSERT((*var0 / *var1)->value() == wxT("20")); // [6] Modulo TS_ASSERT((*var0 % *var1)->value() == wxT("0")); // [9] Equal TS_ASSERT((*var0 == *var1)->value() == wxT("0")); // [10] Different TS_ASSERT((*var0 != *var1)->value() == wxT("1")); // [11] Lower TS_ASSERT((*var0 < *var1)->value() == wxT("0")); // [12] Greater TS_ASSERT((*var0 > *var1)->value() == wxT("1")); // [13] Lower or equal TS_ASSERT((*var0 <= *var1)->value() == wxT("0")); // [14] Greater or equal TS_ASSERT((*var0 >= *var1)->value() == wxT("1")); // [15] Not TS_ASSERT((!(*var0))->value() == wxT("0")); // [16] Almost equal TS_ASSERT((*var0 &= *var1)->value() == wxT("0")); // [17] Is true? TS_ASSERT(var0->pgs_is_true() == true); TS_ASSERT((!(*var0))->pgs_is_true() == false); // [18] Delete variables pdelete(var0); pdelete(var1); } }