Blame unit-tests/D4FilterClauseTest.cc

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