|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2014 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <cppunit/TextTestRunner.h>
|
|
Packit |
a4aae4 |
#include <cppunit/extensions/TestFactoryRegistry.h>
|
|
Packit |
a4aae4 |
#include <cppunit/extensions/HelperMacros.h>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <sstream>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "Byte.h"
|
|
Packit |
a4aae4 |
#include "Int8.h"
|
|
Packit |
a4aae4 |
#include "Int16.h"
|
|
Packit |
a4aae4 |
#include "UInt16.h"
|
|
Packit |
a4aae4 |
#include "Int32.h"
|
|
Packit |
a4aae4 |
#include "UInt32.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "Float32.h"
|
|
Packit |
a4aae4 |
#include "Float64.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "Str.h"
|
|
Packit |
a4aae4 |
#include "Url.h"
|
|
Packit |
a4aae4 |
//#include "Array.h"
|
|
Packit |
a4aae4 |
#include "Structure.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "D4RValue.h"
|
|
Packit |
a4aae4 |
#include "D4FilterClause.h"
|
|
Packit |
a4aae4 |
#include "DMR.h" // We need this because D4FilterClause::value needs it (sort of).
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "GetOpt.h"
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
//#include "testFile.h"
|
|
Packit |
a4aae4 |
//#include "test_config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static bool debug = false;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#undef DBG
|
|
Packit |
a4aae4 |
#define DBG(x) do { if (debug) {x;} } while(false)
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace CppUnit;
|
|
Packit |
a4aae4 |
using namespace std;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
class D4FilterClauseTest: public TestFixture {
|
|
Packit |
a4aae4 |
// Build a DMR and build several D4RValue objects that reference its variables.
|
|
Packit |
a4aae4 |
// Then build several D4RValue objects that hold constants
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
private:
|
|
Packit |
a4aae4 |
Byte *byte;
|
|
Packit |
a4aae4 |
Float32 *f32;
|
|
Packit |
a4aae4 |
Str *str;
|
|
Packit |
a4aae4 |
Url *url;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR dmr;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
public:
|
|
Packit |
a4aae4 |
D4FilterClauseTest() :
|
|
Packit |
a4aae4 |
byte(0), f32(0), str(0), url(0)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
~D4FilterClauseTest()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void setUp()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
byte = new Byte("byte");
|
|
Packit |
a4aae4 |
byte->set_value(17);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
f32 = new Float32("f32");
|
|
Packit |
a4aae4 |
f32->set_value(3.1415);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
str = new Str("str");
|
|
Packit |
a4aae4 |
str->set_value("Einstein");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
url = new Url("url");
|
|
Packit |
a4aae4 |
url->set_value("https://github.com/opendap");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void tearDown()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
delete byte;
|
|
Packit |
a4aae4 |
delete str;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// FilterClauseList tests further down...
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Byte_and_long_long_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> greater(new D4FilterClause(D4FilterClause::greater, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!greater->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> equal(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!equal->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> not_equal(new D4FilterClause(D4FilterClause::not_equal, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(not_equal->value(dmr));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This version uses the D4FilterClause::value() and not value(DMR&) method
|
|
Packit |
a4aae4 |
void Byte_and_long_long_test_2()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> greater(new D4FilterClause(D4FilterClause::greater, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!greater->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> equal(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!equal->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> not_equal(new D4FilterClause(D4FilterClause::not_equal, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(not_equal->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Byte_and_double_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue((double) 21.0);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue((double) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> greater(new D4FilterClause(D4FilterClause::greater, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!greater->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue((double) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> equal(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!equal->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue((double) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> not_equal(new D4FilterClause(D4FilterClause::not_equal, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(not_equal->value(dmr));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** @defgroup type_conv Tests for type promotion
|
|
Packit |
a4aae4 |
* @{
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void Byte_and_int_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue((unsigned long long) (21));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Byte_and_float_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue((float) 21.0);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
/** @} */
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// this uses a mix of value() and value(dmr), just for cover both cases
|
|
Packit |
a4aae4 |
void Str_and_str_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue(string("Tesla"));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue("Tesla");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> greater(new D4FilterClause(D4FilterClause::greater, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!greater->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue("Tesla");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> equal(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(!equal->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue("Tesla");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> not_equal(new D4FilterClause(D4FilterClause::not_equal, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(not_equal->value(dmr));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Str_and_match_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue(string("E.*n"));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> match(new D4FilterClause(D4FilterClause::match, arg1, arg2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(match->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Str_and_number_error_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue((long long) 21);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
// The Filter Clause instance is built OK, but the value() method
|
|
Packit |
a4aae4 |
// will balk at this comparison. jhrg 4/21/16
|
|
Packit |
a4aae4 |
DBG(cerr << "built filter clause instance" << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
less->value();
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Expected error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT("Caught error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Byte_and_string_error_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte);
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue("Tesla");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Expected error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT("Caught error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void Structure_and_string_error_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<Structure> s(new Structure("s"));
|
|
Packit |
a4aae4 |
s->add_var(byte); // copy the object
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(s.get()); // BaseType*s are not free'd by D4RValue
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue("Tesla");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Expected error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT("Caught error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// There's no way this will get past the parser, but ...
|
|
Packit |
a4aae4 |
void Byte_and_Structure_error_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<Structure> s(new Structure("s"));
|
|
Packit |
a4aae4 |
s->add_var(str); // copy the object
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(byte);
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue(s.get());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Expected error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT("Caught error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// There's no way this will get past the parser, but ...
|
|
Packit |
a4aae4 |
void Str_and_Structure_error_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<Structure> s(new Structure("s"));
|
|
Packit |
a4aae4 |
s->add_var(str); // copy the object
|
|
Packit |
a4aae4 |
D4RValue *arg1 = new D4RValue(str);
|
|
Packit |
a4aae4 |
D4RValue *arg2 = new D4RValue(s.get());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg1, arg2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Expected error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT("Caught error");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// test Url and Float32
|
|
Packit |
a4aae4 |
void grab_bag_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32);
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(17.0);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> less(new D4FilterClause(D4FilterClause::less, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(less->value());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue("https://github.com/opendap");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> equal(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(equal->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue("https://.*dap$");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> not_equal(new D4FilterClause(D4FilterClause::not_equal, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(not_equal->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg5_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg5_2 = new D4RValue("https://.*dap$");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> match(new D4FilterClause(D4FilterClause::match, arg5_1, arg5_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(match->value(dmr));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void float_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32);
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(3.1415);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> clause(new D4FilterClause(D4FilterClause::equal, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clause->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void float_test_2()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32);
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(3.1415);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> clause(new D4FilterClause(D4FilterClause::greater_equal, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clause->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void float_test_3()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32);
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(3.1415);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> clause(new D4FilterClause(D4FilterClause::less_equal, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clause->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void int_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<Int8> i8(new Int8(""));
|
|
Packit |
a4aae4 |
i8->set_value(17);
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(i8.get());
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue((long long) 17);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClause> clause(new D4FilterClause(D4FilterClause::equal, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clause->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void true_clauses_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
// Testing this as a pointer since that's how it will be stored in D4Sequence
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClauseList> clauses(new D4FilterClauseList());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg1_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg1_2 = new D4RValue((double) 21.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::less, arg1_1, arg1_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32); // holds pi
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(17.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::less, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue("https://github.com/opendap");
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue("https://.*dap$");
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::match, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->size() == 4);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value(dmr));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This should return true
|
|
Packit |
a4aae4 |
void no_clauses_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClauseList> clauses(new D4FilterClauseList());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->size() == 0);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value(dmr));
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void false_clauses_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClauseList> clauses(new D4FilterClauseList());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg1_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg1_2 = new D4RValue((double) 21.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::less, arg1_1, arg1_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This clause will fail
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32); // holds pi
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(17.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::greater, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue("https://github.com/opendap");
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue("https://.*dap$");
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::match, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->size() == 4);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value(dmr) == false);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value() == false);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void evaluation_order_test()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClauseList> clauses(new D4FilterClauseList());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg1_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg1_2 = new D4RValue((double) 21.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::less, arg1_1, arg1_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This clause will fail and we should not get to the next clause, which will
|
|
Packit |
a4aae4 |
// throw and exception.
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32); // holds pi
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(17.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::greater, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue(17.0); // Error - mismatched types
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue("https://.*dap$");
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::match, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->size() == 4);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value(dmr) == false);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value() == false);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Exception, but the thrid clause should not have been evaluated");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void evaluation_order_test_2()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
auto_ptr<D4FilterClauseList> clauses(new D4FilterClauseList());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg1_1 = new D4RValue(byte); // holds 17
|
|
Packit |
a4aae4 |
D4RValue *arg1_2 = new D4RValue((double) 21.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::less, arg1_1, arg1_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This clause will *pass* and we *should* get to the next clause, which will
|
|
Packit |
a4aae4 |
// throw and exception.
|
|
Packit |
a4aae4 |
D4RValue *arg2_1 = new D4RValue(f32); // holds pi
|
|
Packit |
a4aae4 |
D4RValue *arg2_2 = new D4RValue(17.0);
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::less, arg2_1, arg2_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg3_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg3_2 = new D4RValue(17.0); // Error - mismatched types
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::equal, arg3_1, arg3_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4RValue *arg4_1 = new D4RValue(url);
|
|
Packit |
a4aae4 |
D4RValue *arg4_2 = new D4RValue("https://.*dap$");
|
|
Packit |
a4aae4 |
clauses->add_clause(new D4FilterClause(D4FilterClause::match, arg4_1, arg4_2));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->size() == 4);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT(clauses->value(dmr));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_FAIL("Expected the third clause to throw an exception.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
DBG(cerr << "Caught error: " + e.get_error_message() << endl);
|
|
Packit |
a4aae4 |
CPPUNIT_ASSERT("Expected exception found.");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_TEST_SUITE (D4FilterClauseTest);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_long_long_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_long_long_test_2);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_double_test);
|
|
Packit |
a4aae4 |
// These float --> double, etc.
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_int_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_float_test);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Str_and_str_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Str_and_match_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Str_and_number_error_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_string_error_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Structure_and_string_error_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Byte_and_Structure_error_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (Str_and_Structure_error_test);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (grab_bag_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (float_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (float_test_2);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (float_test_3);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (int_test);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// FilterClauseList tests
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (true_clauses_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (no_clauses_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (false_clauses_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (evaluation_order_test);
|
|
Packit |
a4aae4 |
CPPUNIT_TEST (evaluation_order_test_2);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_TEST_SUITE_END();
|
|
Packit |
a4aae4 |
};
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CPPUNIT_TEST_SUITE_REGISTRATION (D4FilterClauseTest);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namepsace libdap
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int main(int argc, char*argv[])
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
GetOpt getopt(argc, argv, "dh");
|
|
Packit |
a4aae4 |
int option_char;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while ((option_char = getopt()) != EOF)
|
|
Packit |
a4aae4 |
switch (option_char) {
|
|
Packit |
a4aae4 |
case 'd':
|
|
Packit |
a4aae4 |
debug = 1; // debug is a static global
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
case 'h': { // help - show test names
|
|
Packit |
a4aae4 |
cerr << "Usage: D4FilterClauseTest has the following tests:" << endl;
|
|
Packit |
a4aae4 |
const std::vector<Test*> &tests = libdap::D4FilterClauseTest::suite()->getTests();
|
|
Packit |
a4aae4 |
unsigned int prefix_len = libdap::D4FilterClauseTest::suite()->getName().append("::").length();
|
|
Packit |
a4aae4 |
for (std::vector<Test*>::const_iterator i = tests.begin(), e = tests.end(); i != e; ++i) {
|
|
Packit |
a4aae4 |
cerr << (*i)->getName().replace(0, prefix_len, "") << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
CppUnit::TextTestRunner runner;
|
|
Packit |
a4aae4 |
runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
bool wasSuccessful = true;
|
|
Packit |
a4aae4 |
string test = "";
|
|
Packit |
a4aae4 |
int i = getopt.optind;
|
|
Packit |
a4aae4 |
if (i == argc) {
|
|
Packit |
a4aae4 |
// run them all
|
|
Packit |
a4aae4 |
wasSuccessful = runner.run("");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
for (; i < argc; ++i) {
|
|
Packit |
a4aae4 |
if (debug) cerr << "Running " << argv[i] << endl;
|
|
Packit |
a4aae4 |
test = libdap::D4FilterClauseTest::suite()->getName().append("::").append(argv[i]);
|
|
Packit |
a4aae4 |
wasSuccessful = wasSuccessful && runner.run(test);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return wasSuccessful ? 0 : 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|