Blame unit-tests/ddsT.cc

Packit a4aae4
#include <cppunit/TestFixture.h>
Packit a4aae4
#include <cppunit/TestAssert.h>
Packit a4aae4
#include <cppunit/extensions/TestFactoryRegistry.h>
Packit a4aae4
#include <cppunit/ui/text/TestRunner.h>
Packit a4aae4
#include <cppunit/extensions/HelperMacros.h>
Packit a4aae4
#include <cppunit/CompilerOutputter.h>
Packit a4aae4
Packit a4aae4
#include <iostream>
Packit a4aae4
#include <fstream>
Packit a4aae4
#include <sstream>
Packit a4aae4
Packit a4aae4
// #define DODS_DEBUG
Packit a4aae4
Packit a4aae4
#include "DDS.h"
Packit a4aae4
//#include "Pix.h"
Packit a4aae4
#include "Byte.h"
Packit a4aae4
#include "Int16.h"
Packit a4aae4
#include "UInt16.h"
Packit a4aae4
#include "Int32.h"
Packit a4aae4
#include "UInt32.h"
Packit a4aae4
#include "Float32.h"
Packit a4aae4
#include "Float64.h"
Packit a4aae4
#include "Str.h"
Packit a4aae4
#include "Url.h"
Packit a4aae4
#include "Array.h"
Packit a4aae4
#include "Structure.h"
Packit a4aae4
#include "Sequence.h"
Packit a4aae4
#include "Grid.h"
Packit a4aae4
Packit a4aae4
#include "TestArray.h"
Packit a4aae4
#include "TestInt16.h"
Packit a4aae4
#include "TestStr.h"
Packit a4aae4
#include "TestTypeFactory.h"
Packit a4aae4
//#include "ce_functions.h"
Packit a4aae4
#include "util.h"
Packit a4aae4
#include "debug.h"
Packit a4aae4
Packit a4aae4
#include "testFile.h"
Packit a4aae4
#include "GetOpt.h"
Packit a4aae4
Packit a4aae4
using namespace CppUnit;
Packit a4aae4
using namespace std;
Packit a4aae4
using namespace libdap;
Packit a4aae4
Packit a4aae4
static bool debug = false;
Packit a4aae4
Packit a4aae4
int test_variable_sleep_interval = 0; // Used in Test* classes for testing
Packit a4aae4
// timeouts.
Packit a4aae4
string cprint =
Packit a4aae4
    "\
Packit a4aae4
Dataset {\n\
Packit a4aae4
    Int16 var1;\n\
Packit a4aae4
    String var6;\n\
Packit a4aae4
    Int16 var7;\n\
Packit a4aae4
    Structure {\n\
Packit a4aae4
        Structure {\n\
Packit a4aae4
            Int16 var10;\n\
Packit a4aae4
        } var9;\n\
Packit a4aae4
    } var8;\n\
Packit a4aae4
} Test%20Data%20Set;\n\
Packit a4aae4
";
Packit a4aae4
Packit a4aae4
string pprint = "\
Packit a4aae4
Dataset {\n\
Packit a4aae4
    Int16 var1;\n\
Packit a4aae4
    String var6;\n\
Packit a4aae4
    Int16 var7;\n\
Packit a4aae4
} Test%20Data%20Set;\n\
Packit a4aae4
";
Packit a4aae4
Packit a4aae4
string nprint = "\
Packit a4aae4
Dataset {\n\
Packit a4aae4
} Test%20Data%20Set;\n\
Packit a4aae4
";
Packit a4aae4
Packit a4aae4
string containerprint =
Packit a4aae4
    "\
Packit a4aae4
Dataset {\n\
Packit a4aae4
    Structure {\n\
Packit a4aae4
        Int16 c1var1;\n\
Packit a4aae4
        Int16 c1var3;\n\
Packit a4aae4
    } c1;\n\
Packit a4aae4
    Structure {\n\
Packit a4aae4
        String c2var2;\n\
Packit a4aae4
        Structure {\n\
Packit a4aae4
            Structure {\n\
Packit a4aae4
                Int16 c2var3var1var1;\n\
Packit a4aae4
                Int16 c2var3var1var2;\n\
Packit a4aae4
            } c2var3var1;\n\
Packit a4aae4
        } c2var3;\n\
Packit a4aae4
    } c2;\n\
Packit a4aae4
    Byte var1;\n\
Packit a4aae4
    Float64 var2;\n\
Packit a4aae4
} TestDDS;\n\
Packit a4aae4
";
Packit a4aae4
Packit a4aae4
class ddsT: public CppUnit::TestFixture {
Packit a4aae4
Packit a4aae4
    CPPUNIT_TEST_SUITE (ddsT);
Packit a4aae4
    CPPUNIT_TEST (ddsT_test);
Packit a4aae4
    CPPUNIT_TEST (ddsT_containers);CPPUNIT_TEST_SUITE_END( );
Packit a4aae4
Packit a4aae4
private:
Packit a4aae4
    /* TEST PRIVATE DATA */
Packit a4aae4
    TestTypeFactory *factory;
Packit a4aae4
Packit a4aae4
public:
Packit a4aae4
    void setUp()
Packit a4aae4
    {
Packit a4aae4
        factory = new TestTypeFactory;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    void tearDown()
Packit a4aae4
    {
Packit a4aae4
        delete factory;
Packit a4aae4
        factory = 0;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    void ddsT_test()
Packit a4aae4
    {
Packit a4aae4
        DDS dds(factory, "TestDDS");
Packit a4aae4
Packit a4aae4
        string dsn = dds.get_dataset_name();
Packit a4aae4
        CPPUNIT_ASSERT(dsn == "TestDDS");
Packit a4aae4
Packit a4aae4
        dds.set_dataset_name("Test Data Set");
Packit a4aae4
        dsn = dds.get_dataset_name();
Packit a4aae4
        CPPUNIT_ASSERT(dsn == "Test Data Set");
Packit a4aae4
Packit a4aae4
        string fn = dds.filename();
Packit a4aae4
        CPPUNIT_ASSERT(fn == "");
Packit a4aae4
Packit a4aae4
        dds.filename("dds_test.data");
Packit a4aae4
        fn = dds.filename();
Packit a4aae4
        CPPUNIT_ASSERT(fn == "dds_test.data");
Packit a4aae4
Packit a4aae4
        try {
Packit a4aae4
            dds.add_var((BaseType *) NULL);
Packit a4aae4
            CPPUNIT_FAIL("succeeded in adding a null var");
Packit a4aae4
        }
Packit a4aae4
        catch (InternalErr &e) {
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        try {
Packit a4aae4
            BaseType *bt = factory->NewInt16("var1");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewInt16("var2");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewInt16("var3");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewInt16("var4");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewInt16("var5");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewStr("var6");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            BaseType *tbt = factory->NewInt16("");
Packit a4aae4
            bt = factory->NewArray("var7", tbt);
Packit a4aae4
            delete tbt;
Packit a4aae4
            tbt = 0;
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewStructure("var8");
Packit a4aae4
            Structure *s = (Structure *) bt;
Packit a4aae4
            BaseType *bts1 = factory->NewStructure("var9");
Packit a4aae4
            Structure *s1 = (Structure *) bts1;
Packit a4aae4
            BaseType *bts2 = factory->NewInt16("var10");
Packit a4aae4
            s1->add_var(bts2);
Packit a4aae4
            delete bts2;
Packit a4aae4
            bts2 = 0;
Packit a4aae4
            s->add_var(bts1);
Packit a4aae4
            delete bts1;
Packit a4aae4
            bts1 = 0;
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = 0;
Packit a4aae4
        }
Packit a4aae4
        catch (InternalErr &e) {
Packit a4aae4
            CPPUNIT_FAIL("failed to add a var");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        int nv = dds.num_var();
Packit a4aae4
        CPPUNIT_ASSERT(nv == 8);
Packit a4aae4
Packit a4aae4
        vector<string> vs;
Packit a4aae4
        typedef std::vector<string>::const_iterator vs_citer;
Packit a4aae4
        typedef std::vector<string>::iterator vs_iter;
Packit a4aae4
        vs.push_back("var1");
Packit a4aae4
        vs.push_back("var2");
Packit a4aae4
        vs.push_back("var3");
Packit a4aae4
        vs.push_back("var4");
Packit a4aae4
        vs.push_back("var5");
Packit a4aae4
        vs.push_back("var6");
Packit a4aae4
        vs.push_back("var7");
Packit a4aae4
        vs.push_back("var8");
Packit a4aae4
Packit a4aae4
        DDS::Vars_iter dvsc = dds.var_begin();
Packit a4aae4
        vs_citer vsc = vs.begin();
Packit a4aae4
        for (; dvsc != dds.var_end() && vsc != vs.end(); dvsc++, vsc++) {
Packit a4aae4
            CPPUNIT_ASSERT((*dvsc)->name() == *vsc);
Packit a4aae4
        }
Packit a4aae4
        CPPUNIT_ASSERT(dvsc == dds.var_end() && vsc == vs.end());
Packit a4aae4
        if (dvsc != dds.var_end() && vsc == vs.end()) {
Packit a4aae4
            CPPUNIT_FAIL("Too many vars");
Packit a4aae4
        }
Packit a4aae4
        else if (dvsc == dds.var_end() && vsc != vs.end()) {
Packit a4aae4
            CPPUNIT_FAIL("Too few vars");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        for (vsc = vs.begin(); vsc != vs.end(); vsc++) {
Packit a4aae4
            if (*vsc == "var2") {
Packit a4aae4
                vs_iter &vsi = (vs_iter &) vsc;
Packit a4aae4
                vs.erase(vsi);
Packit a4aae4
                break;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        dvsc = dds.var_begin();
Packit a4aae4
        vsc = vs.begin();
Packit a4aae4
        for (; dvsc != dds.var_end() && vsc != vs.end(); dvsc++, vsc++) {
Packit a4aae4
            if ((*dvsc)->name() == "var2") {
Packit a4aae4
                DDS::Vars_iter &dvsi = (DDS::Vars_iter &) dvsc;
Packit a4aae4
                dds.del_var(dvsi);
Packit a4aae4
            }
Packit a4aae4
            CPPUNIT_ASSERT((*dvsc)->name() == *vsc);
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        nv = dds.num_var();
Packit a4aae4
        CPPUNIT_ASSERT(nv == 7);
Packit a4aae4
        if (nv != 7) {
Packit a4aae4
            for (dvsc = dds.var_begin(); dvsc != dds.var_end(); dvsc++) {
Packit a4aae4
                DBG2( cerr << "    " << (*dvsc)->name() << endl ) ;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        for (vsc = vs.begin(); vsc != vs.end(); vsc++) {
Packit a4aae4
            if (*vsc == "var3") {
Packit a4aae4
                vs_iter &vsi = (vs_iter &) vsc;
Packit a4aae4
                vs.erase(vsi);
Packit a4aae4
                break;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
        dvsc = dds.var_begin();
Packit a4aae4
        vsc = vs.begin();
Packit a4aae4
        for (; dvsc != dds.var_end() && vsc != vs.end(); dvsc++, vsc++) {
Packit a4aae4
            if ((*dvsc)->name() == "var3") {
Packit a4aae4
                DDS::Vars_iter &dvsi = (DDS::Vars_iter &) dvsc;
Packit a4aae4
                dds.del_var(dvsi);
Packit a4aae4
            }
Packit a4aae4
            CPPUNIT_ASSERT((*dvsc)->name() == *vsc);
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        nv = dds.num_var();
Packit a4aae4
        CPPUNIT_ASSERT(nv == 6);
Packit a4aae4
        if (nv != 6) {
Packit a4aae4
            for (dvsc = dds.var_begin(); dvsc != dds.var_end(); dvsc++) {
Packit a4aae4
                DBG2( cerr << "    " << (*dvsc)->name() << endl ) ;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        for (vsc = vs.begin(); vsc != vs.end(); vsc++) {
Packit a4aae4
            if (*vsc == "var4") {
Packit a4aae4
                vs_citer vsc2 = vsc;
Packit a4aae4
                vsc2++;
Packit a4aae4
                vsc2++;
Packit a4aae4
                vs_iter &vsi = (vs_iter &) vsc;
Packit a4aae4
                vs_iter &vsi2 = (vs_iter &) vsc2;
Packit a4aae4
                vs.erase(vsi, vsi2);
Packit a4aae4
                break;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
        dvsc = dds.var_begin();
Packit a4aae4
        vsc = vs.begin();
Packit a4aae4
        for (; dvsc != dds.var_end() && vsc != vs.end(); dvsc++, vsc++) {
Packit a4aae4
            if ((*dvsc)->name() == "var4") {
Packit a4aae4
                DDS::Vars_iter dvsc2 = dvsc;
Packit a4aae4
                dvsc2++;
Packit a4aae4
                dvsc2++;
Packit a4aae4
                DDS::Vars_iter &dvsi = (DDS::Vars_iter &) dvsc;
Packit a4aae4
                DDS::Vars_iter &dvsi2 = (DDS::Vars_iter &) dvsc2;
Packit a4aae4
                dds.del_var(dvsi, dvsi2);
Packit a4aae4
            }
Packit a4aae4
            CPPUNIT_ASSERT((*dvsc)->name() == *vsc);
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        nv = dds.num_var();
Packit a4aae4
        CPPUNIT_ASSERT(nv == 4);
Packit a4aae4
        if (nv != 4) {
Packit a4aae4
            for (dvsc = dds.var_begin(); dvsc != dds.var_end(); dvsc++) {
Packit a4aae4
                DBG2( cerr << "    " << (*dvsc)->name() << endl ) ;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        BaseType *bt = dds.var("varnot");
Packit a4aae4
        CPPUNIT_ASSERT(!bt);
Packit a4aae4
Packit a4aae4
        bt = dds.var("var6");
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        if (bt) {
Packit a4aae4
            CPPUNIT_ASSERT(bt->name() == "var6");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        string find_var = "var6";
Packit a4aae4
        bt = dds.var(find_var);
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        if (bt) {
Packit a4aae4
            CPPUNIT_ASSERT(bt->name() == "var6");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        find_var = "var10";
Packit a4aae4
        bt = dds.var(find_var);
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        if (bt) {
Packit a4aae4
            CPPUNIT_ASSERT(bt->name() == "var10");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        find_var = "var10";
Packit a4aae4
        BaseType::btp_stack btps;
Packit a4aae4
        bt = dds.var(find_var, &btps);
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        if (bt) {
Packit a4aae4
            CPPUNIT_ASSERT(bt->name() == "var10");
Packit a4aae4
            if (bt->name() == "var10") {
Packit a4aae4
                CPPUNIT_ASSERT(btps.size() == 2);
Packit a4aae4
                if (btps.size() == 2) {
Packit a4aae4
                    CPPUNIT_ASSERT(btps.top()->name() == "var8");
Packit a4aae4
                    btps.pop();
Packit a4aae4
                    CPPUNIT_ASSERT(btps.top()->name() == "var9");
Packit a4aae4
                    btps.pop();
Packit a4aae4
                }
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        find_var = "var8.var9.var10";
Packit a4aae4
        bt = dds.var(find_var, &btps);
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        if (bt) {
Packit a4aae4
            CPPUNIT_ASSERT(bt->name() == "var10");
Packit a4aae4
            if (bt->name() == "var10") {
Packit a4aae4
                CPPUNIT_ASSERT(btps.size() == 2);
Packit a4aae4
                if (btps.size() == 2) {
Packit a4aae4
                    CPPUNIT_ASSERT(btps.top()->name() == "var9");
Packit a4aae4
                    btps.pop();
Packit a4aae4
                    CPPUNIT_ASSERT(btps.top()->name() == "var8");
Packit a4aae4
                    btps.pop();
Packit a4aae4
                }
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        {
Packit a4aae4
            ostringstream sof;
Packit a4aae4
            dds.print(sof);
Packit a4aae4
            CPPUNIT_ASSERT(sof.str().find(cprint) != string::npos);
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        {
Packit a4aae4
            ostringstream sof;
Packit a4aae4
            dds.print_constrained(sof);
Packit a4aae4
            CPPUNIT_ASSERT(sof.str().find(nprint) != string::npos);
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        dds.mark_all(true);
Packit a4aae4
Packit a4aae4
        {
Packit a4aae4
            ostringstream sof;
Packit a4aae4
            dds.print_constrained(sof);
Packit a4aae4
            CPPUNIT_ASSERT(sof.str().find(cprint) != string::npos);
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        bool mark_ret = dds.mark("var8", false);
Packit a4aae4
        CPPUNIT_ASSERT(mark_ret == true);
Packit a4aae4
Packit a4aae4
        {
Packit a4aae4
            ostringstream sof;
Packit a4aae4
            dds.print_constrained(sof);
Packit a4aae4
            CPPUNIT_ASSERT(sof.str().find(pprint) != string::npos);
Packit a4aae4
        }
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    void ddsT_containers()
Packit a4aae4
    {
Packit a4aae4
        DDS dds(factory, "TestDDS");
Packit a4aae4
Packit a4aae4
        // set the container to c1 and make sure the container is created
Packit a4aae4
        dds.container_name("c1");
Packit a4aae4
        CPPUNIT_ASSERT(dds.container_name() == "c1");
Packit a4aae4
Packit a4aae4
        Structure *c1 = dds.container();
Packit a4aae4
        CPPUNIT_ASSERT(c1);
Packit a4aae4
        CPPUNIT_ASSERT(c1->name() == "c1");
Packit a4aae4
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 1);
Packit a4aae4
Packit a4aae4
        // set the container to c2 and make sure the container is created
Packit a4aae4
        dds.container_name("c2");
Packit a4aae4
        CPPUNIT_ASSERT(dds.container_name() == "c2");
Packit a4aae4
Packit a4aae4
        Structure *c2 = dds.container();
Packit a4aae4
        CPPUNIT_ASSERT(c2);
Packit a4aae4
        CPPUNIT_ASSERT(c2->name() == "c2");
Packit a4aae4
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 2);
Packit a4aae4
Packit a4aae4
        // set back to c1, make sure new one not created
Packit a4aae4
        dds.container_name("c1");
Packit a4aae4
        CPPUNIT_ASSERT(dds.container_name() == "c1");
Packit a4aae4
Packit a4aae4
        c1 = dds.container();
Packit a4aae4
        CPPUNIT_ASSERT(c1);
Packit a4aae4
        CPPUNIT_ASSERT(c1->name() == "c1");
Packit a4aae4
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 2);
Packit a4aae4
Packit a4aae4
        // start adding variables and make sure not added directly to dds.
Packit a4aae4
        // Make sure can find those variables without referencing the
Packit a4aae4
        // container.
Packit a4aae4
        try {
Packit a4aae4
            BaseType *bt = factory->NewInt16("c1var1");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewStr("c1var2");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            BaseType *tbt = factory->NewInt16("");
Packit a4aae4
            bt = factory->NewArray("c1var3", tbt);
Packit a4aae4
            delete tbt;
Packit a4aae4
            tbt = 0;
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
        }
Packit a4aae4
        catch (InternalErr &e) {
Packit a4aae4
            CPPUNIT_FAIL("failed to add a var");
Packit a4aae4
        }
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 2);
Packit a4aae4
        CPPUNIT_ASSERT(c1->element_count() == 3);
Packit a4aae4
Packit a4aae4
        BaseType *bt = dds.var("c1var1");
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        CPPUNIT_ASSERT(bt->name() == "c1var1");
Packit a4aae4
        Int16 *ibt = dynamic_cast<Int16 *>(bt);
Packit a4aae4
        CPPUNIT_ASSERT(ibt);
Packit a4aae4
Packit a4aae4
        bt = dds.var("c1var2");
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        CPPUNIT_ASSERT(bt->name() == "c1var2");
Packit a4aae4
        Str *strbt = dynamic_cast<Str *>(bt);
Packit a4aae4
        CPPUNIT_ASSERT(strbt);
Packit a4aae4
Packit a4aae4
        dds.del_var("c1var2");
Packit a4aae4
        bt = dds.var("c1var2");
Packit a4aae4
        CPPUNIT_ASSERT(bt == 0);
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 2);
Packit a4aae4
        CPPUNIT_ASSERT(c1->element_count() == 2);
Packit a4aae4
Packit a4aae4
        // set container to "", add vars, make sure added directly to dds.
Packit a4aae4
        // Make sure can find those variables
Packit a4aae4
        dds.container_name("");
Packit a4aae4
        CPPUNIT_ASSERT(dds.container_name() == "");
Packit a4aae4
        CPPUNIT_ASSERT(dds.container() == 0);
Packit a4aae4
        try {
Packit a4aae4
            BaseType *bt = factory->NewByte("var1");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewFloat64("var2");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewUInt32("var3");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
        }
Packit a4aae4
        catch (InternalErr &e) {
Packit a4aae4
            CPPUNIT_FAIL("failed to add a var");
Packit a4aae4
        }
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 5);
Packit a4aae4
        CPPUNIT_ASSERT(c1->element_count() == 2);
Packit a4aae4
Packit a4aae4
        BaseType::btp_stack btps;
Packit a4aae4
        bt = dds.var("c1var1", btps);
Packit a4aae4
        CPPUNIT_ASSERT(bt && bt->name() == "c1var1");
Packit a4aae4
        CPPUNIT_ASSERT(btps.size() == 1);
Packit a4aae4
        BaseType *btp = btps.top();
Packit a4aae4
        CPPUNIT_ASSERT(btp && btp->name() == "c1");
Packit a4aae4
        btps.pop();
Packit a4aae4
Packit a4aae4
        bt = dds.var("var1");
Packit a4aae4
        CPPUNIT_ASSERT(bt);
Packit a4aae4
        CPPUNIT_ASSERT(bt->name() == "var1");
Packit a4aae4
        Byte *bbt = dynamic_cast<Byte *>(bt);
Packit a4aae4
        CPPUNIT_ASSERT(bbt);
Packit a4aae4
Packit a4aae4
        bt = c1->var("var1");
Packit a4aae4
        CPPUNIT_ASSERT(bt == 0);
Packit a4aae4
Packit a4aae4
        dds.del_var("var3");
Packit a4aae4
        bt = dds.var("var3");
Packit a4aae4
        CPPUNIT_ASSERT(bt == 0);
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 4);
Packit a4aae4
        CPPUNIT_ASSERT(c1->element_count() == 2);
Packit a4aae4
Packit a4aae4
        // set to c2, add variables and make sure not added directly to dds.
Packit a4aae4
        // Make sure can find those variables without referencing the
Packit a4aae4
        // container.
Packit a4aae4
        dds.container_name("c2");
Packit a4aae4
        CPPUNIT_ASSERT(dds.container_name() == "c2");
Packit a4aae4
        c2 = dds.container();
Packit a4aae4
        CPPUNIT_ASSERT(c2 && c2->name() == "c2");
Packit a4aae4
Packit a4aae4
        try {
Packit a4aae4
            BaseType *bt = factory->NewInt32("c2var1");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = factory->NewStr("c2var2");
Packit a4aae4
            dds.add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            Structure *s = factory->NewStructure("c2var3");
Packit a4aae4
            Structure *s1 = factory->NewStructure("c2var3var1");
Packit a4aae4
            bt = factory->NewInt16("c2var3var1var1");
Packit a4aae4
            s1->add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = 0;
Packit a4aae4
            bt = factory->NewInt16("c2var3var1var2");
Packit a4aae4
            s1->add_var(bt);
Packit a4aae4
            delete bt;
Packit a4aae4
            bt = 0;
Packit a4aae4
            s->add_var(s1);
Packit a4aae4
            delete s1;
Packit a4aae4
            s1 = 0;
Packit a4aae4
            dds.add_var(s);
Packit a4aae4
            delete s;
Packit a4aae4
            s = 0;
Packit a4aae4
        }
Packit a4aae4
        catch (InternalErr &e) {
Packit a4aae4
            CPPUNIT_FAIL("failed to add a var");
Packit a4aae4
        }
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 4);
Packit a4aae4
        CPPUNIT_ASSERT(c2->element_count() == 3);
Packit a4aae4
Packit a4aae4
        bt = dds.var("c2var1");
Packit a4aae4
        CPPUNIT_ASSERT(bt && bt->name() == "c2var1");
Packit a4aae4
        Int32 *i32bt = dynamic_cast<Int32 *>(bt);
Packit a4aae4
        CPPUNIT_ASSERT(i32bt);
Packit a4aae4
Packit a4aae4
        bt = dds.var("c2var2");
Packit a4aae4
        CPPUNIT_ASSERT(bt && bt->name() == "c2var2");
Packit a4aae4
        strbt = dynamic_cast<Str *>(bt);
Packit a4aae4
        CPPUNIT_ASSERT(strbt);
Packit a4aae4
Packit a4aae4
        bt = dds.var("c2var3");
Packit a4aae4
        CPPUNIT_ASSERT(bt && bt->name() == "c2var3");
Packit a4aae4
        Structure *sbt = dynamic_cast<Structure *>(bt);
Packit a4aae4
        CPPUNIT_ASSERT(sbt);
Packit a4aae4
Packit a4aae4
        bt = dds.var("var1");
Packit a4aae4
        CPPUNIT_ASSERT(bt == 0);
Packit a4aae4
Packit a4aae4
        bt = dds.var("var2");
Packit a4aae4
        CPPUNIT_ASSERT(bt == 0);
Packit a4aae4
Packit a4aae4
        bt = dds.var("c2var3var1var2", btps);
Packit a4aae4
        CPPUNIT_ASSERT(bt && bt->name() == "c2var3var1var2");
Packit a4aae4
        CPPUNIT_ASSERT(btps.size() == 3);
Packit a4aae4
        btp = btps.top();
Packit a4aae4
        CPPUNIT_ASSERT(btp && btp->name() == "c2");
Packit a4aae4
        btps.pop();
Packit a4aae4
        btp = btps.top();
Packit a4aae4
        CPPUNIT_ASSERT(btp && btp->name() == "c2var3");
Packit a4aae4
        btps.pop();
Packit a4aae4
        btp = btps.top();
Packit a4aae4
        CPPUNIT_ASSERT(btp && btp->name() == "c2var3var1");
Packit a4aae4
        btps.pop();
Packit a4aae4
Packit a4aae4
        dds.del_var("c2var1");
Packit a4aae4
        bt = dds.var("c2var1");
Packit a4aae4
        CPPUNIT_ASSERT(bt == 0);
Packit a4aae4
        CPPUNIT_ASSERT(dds.num_var() == 4);
Packit a4aae4
        CPPUNIT_ASSERT(c2->element_count() == 2);
Packit a4aae4
Packit a4aae4
        // print the dds and make sure it looks good.
Packit a4aae4
        ostringstream sstrm;
Packit a4aae4
        dds.print(sstrm);
Packit a4aae4
        cout << sstrm.str() << endl;
Packit a4aae4
        CPPUNIT_ASSERT(sstrm.str() == containerprint);
Packit a4aae4
    }
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
CPPUNIT_TEST_SUITE_REGISTRATION (ddsT);
Packit a4aae4
Packit a4aae4
/* NOTHING NEEDS TO BE CHANGED BELOW HERE */
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()) != -1)
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: ddsT has the following tests:" << endl;
Packit a4aae4
            const std::vector<Test*> &tests = ddsT::suite()->getTests();
Packit a4aae4
            unsigned int prefix_len = ddsT::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 = ddsT::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