Blame tests/dds-test.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) 2002,2003 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
// (c) COPYRIGHT URI/MIT 1994-1999
Packit a4aae4
// Please read the full copyright statement in the file COPYRIGHT_URI.
Packit a4aae4
//
Packit a4aae4
// Authors:
Packit a4aae4
//      jhrg,jimg       James Gallagher <jgallagher@gso.uri.edu>
Packit a4aae4
Packit a4aae4
// Test the DDS scanner, parser and DDS class.
Packit a4aae4
//
Packit a4aae4
// jhrg 8/29/94
Packit a4aae4
Packit a4aae4
#include "config.h"
Packit a4aae4
Packit a4aae4
#include <fstream>
Packit a4aae4
Packit a4aae4
#include <GetOpt.h>
Packit a4aae4
Packit a4aae4
#include "parser.h"
Packit a4aae4
#include "dds.tab.hh"
Packit a4aae4
#include "BaseType.h"
Packit a4aae4
#include "Int32.h"
Packit a4aae4
#include "DDS.h"
Packit a4aae4
#include "util.h"
Packit a4aae4
#include "Error.h"
Packit a4aae4
Packit a4aae4
#if 0
Packit a4aae4
#ifdef DAP4
Packit a4aae4
#include "D4ParserSax2.h"
Packit a4aae4
#include "D4BaseTypeFactory.h"
Packit a4aae4
#endif
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
using namespace libdap;
Packit a4aae4
Packit a4aae4
void test_scanner();
Packit a4aae4
void test_parser(const string &name);
Packit a4aae4
void test_class();
Packit a4aae4
#if 0
Packit a4aae4
void test_dap4_parser(const string &name);
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
int ddslex();
Packit a4aae4
// int ddsparse(DDS &);
Packit a4aae4
Packit a4aae4
extern YYSTYPE ddslval;
Packit a4aae4
extern int ddsdebug;
Packit a4aae4
static bool print_ddx = false;
Packit a4aae4
Packit a4aae4
const char *prompt = "dds-test: ";
Packit a4aae4
Packit a4aae4
void usage(string name) {
Packit a4aae4
    cerr << "Usage: " << name << "[s] [pd] [c]" << endl
Packit a4aae4
            << "s: Test the scanner." << endl
Packit a4aae4
            << "p: Test the parser; reads from stdin and prints the" << endl
Packit a4aae4
            << "   internal structure to stdout." << endl
Packit a4aae4
            << "d: Turn on parser debugging. (only for the hard core.)" << endl
Packit a4aae4
            << "c: Test the C++ code for manipulating DDS objects." << endl
Packit a4aae4
            << "   Reads from stdin, parses and writes the modified DDS" << endl
Packit a4aae4
            << "   to stdout." << endl;
Packit a4aae4
#if 0
Packit a4aae4
    fprintf(stderr, "usage: %s %s\n %s\n %s\n %s\n %s\n %s\n %s\n %s\n", name.c_str(), "[s] [pd] [c]",
Packit a4aae4
            "s: Test the scanner.", "p: Test the parser; reads from stdin and prints the",
Packit a4aae4
            "   internal structure to stdout.", "d: Turn on parser debugging. (only for the hard core.)",
Packit a4aae4
            "c: Test the C++ code for manipulating DDS objects.",
Packit a4aae4
            "   Reads from stdin, parses and writes the modified DDS", "   to stdout.");
Packit a4aae4
#endif
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
int main(int argc, char *argv[]) {
Packit a4aae4
    GetOpt getopt(argc, argv, "spP:dcx"); // remove fF:
Packit a4aae4
    int option_char;
Packit a4aae4
    int scanner_test = 0, parser_test = 0, class_test = 0;
Packit a4aae4
#if 0
Packit a4aae4
    int dap4_parser_test = 0;
Packit a4aae4
#endif
Packit a4aae4
    string name = "";
Packit a4aae4
    // process options
Packit a4aae4
Packit a4aae4
    while ((option_char = getopt()) != -1)
Packit a4aae4
        switch (option_char) {
Packit a4aae4
        case 'd':
Packit a4aae4
            ddsdebug = 1;
Packit a4aae4
            break;
Packit a4aae4
        case 's':
Packit a4aae4
            scanner_test = 1;
Packit a4aae4
            break;
Packit a4aae4
        case 'p':
Packit a4aae4
            parser_test = 1;
Packit a4aae4
            break;
Packit a4aae4
        case 'P':
Packit a4aae4
            parser_test = 1;
Packit a4aae4
            name = getopt.optarg;
Packit a4aae4
            break;
Packit a4aae4
#if 0
Packit a4aae4
        case 'f':
Packit a4aae4
            dap4_parser_test = 1;
Packit a4aae4
            break;
Packit a4aae4
Packit a4aae4
        case 'F':
Packit a4aae4
            dap4_parser_test = 1;
Packit a4aae4
            name = getopt.optarg;
Packit a4aae4
            break;
Packit a4aae4
#endif
Packit a4aae4
        case 'x':
Packit a4aae4
            print_ddx = true;
Packit a4aae4
            break;
Packit a4aae4
        case 'c':
Packit a4aae4
            class_test = 1;
Packit a4aae4
            break;
Packit a4aae4
        case '?':
Packit a4aae4
        default:
Packit a4aae4
            usage(argv[0]);
Packit a4aae4
            return 1;
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
    if (!scanner_test && !parser_test && !class_test/* && !dap4_parser_test*/) {
Packit a4aae4
        usage(argv[0]);
Packit a4aae4
        return 1;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    try {
Packit a4aae4
        if (scanner_test)
Packit a4aae4
            test_scanner();
Packit a4aae4
Packit a4aae4
        if (parser_test)
Packit a4aae4
            test_parser(name);
Packit a4aae4
#if 0
Packit a4aae4
        if (dap4_parser_test)
Packit a4aae4
            test_dap4_parser(name);
Packit a4aae4
#endif
Packit a4aae4
        if (class_test)
Packit a4aae4
            test_class();
Packit a4aae4
    }
Packit a4aae4
    catch (Error &e) {
Packit a4aae4
        cerr << e.get_error_message() << endl;
Packit a4aae4
    }
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void test_scanner(void) {
Packit a4aae4
    int tok;
Packit a4aae4
Packit a4aae4
    cout << prompt << flush; // first prompt
Packit a4aae4
Packit a4aae4
    while ((tok = ddslex())) {
Packit a4aae4
        switch (tok) {
Packit a4aae4
        case SCAN_DATASET:
Packit a4aae4
            cout << "DATASET" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_LIST:
Packit a4aae4
            cout << "LIST" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_SEQUENCE:
Packit a4aae4
            cout << "SEQUENCE" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_STRUCTURE:
Packit a4aae4
            cout << "STRUCTURE" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_FUNCTION:
Packit a4aae4
            cout << "FUNCTION" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_GRID:
Packit a4aae4
            cout << "GRID" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_BYTE:
Packit a4aae4
            cout << "BYTE" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_INT16:
Packit a4aae4
            cout << "INT16" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_UINT16:
Packit a4aae4
            cout << "UINT16" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_INT32:
Packit a4aae4
            cout << "INT32" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_UINT32:
Packit a4aae4
            cout << "UINT32" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_FLOAT32:
Packit a4aae4
            cout << "FLOAT32" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_FLOAT64:
Packit a4aae4
            cout << "FLOAT64" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_STRING:
Packit a4aae4
            cout << "STRING" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_URL:
Packit a4aae4
            cout << "Url" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case SCAN_WORD:
Packit a4aae4
            cout << "WORD: " << ddslval.word << endl;
Packit a4aae4
            break;
Packit a4aae4
        case '{':
Packit a4aae4
            cout << "Left Brace" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case '}':
Packit a4aae4
            cout << "Right Brace" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case '[':
Packit a4aae4
            cout << "Left Bracket" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case ']':
Packit a4aae4
            cout << "Right Bracket" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case ';':
Packit a4aae4
            cout << "Semicolon" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case ':':
Packit a4aae4
            cout << "Colon" << endl;
Packit a4aae4
            break;
Packit a4aae4
        case '=':
Packit a4aae4
            cout << "Assignment" << endl;
Packit a4aae4
            break;
Packit a4aae4
        default:
Packit a4aae4
            cout << "Error: Unrecognized input" << endl;
Packit a4aae4
            break;
Packit a4aae4
        }
Packit a4aae4
        cout << prompt << flush; // print prompt after output
Packit a4aae4
    }
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void test_parser(const string &name) {
Packit a4aae4
    BaseTypeFactory *factory = new BaseTypeFactory;
Packit a4aae4
    DDS table(factory);
Packit a4aae4
    if (name.empty())
Packit a4aae4
        table.parse();
Packit a4aae4
    else
Packit a4aae4
        table.parse(name);
Packit a4aae4
Packit a4aae4
    if (table.check_semantics())
Packit a4aae4
        cout << "DDS past semantic check" << endl;
Packit a4aae4
    else
Packit a4aae4
        cout << "DDS failed semantic check" << endl;
Packit a4aae4
Packit a4aae4
    if (table.check_semantics(true))
Packit a4aae4
        cout << "DDS past full semantic check" << endl;
Packit a4aae4
    else
Packit a4aae4
        cout << "DDS failed full semantic check" << endl;
Packit a4aae4
Packit a4aae4
    if (print_ddx)
Packit a4aae4
        table.print_xml_writer(cout, false, "");
Packit a4aae4
    else
Packit a4aae4
        table.print(cout);
Packit a4aae4
Packit a4aae4
    delete factory;
Packit a4aae4
    factory = 0;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
#if 0
Packit a4aae4
void test_dap4_parser(const string &name) {
Packit a4aae4
#ifdef DAP4
Packit a4aae4
    D4BaseTypeFactory factory;
Packit a4aae4
Packit a4aae4
    DDS table(&factory);
Packit a4aae4
    D4ParserSax2 parser;
Packit a4aae4
    if (name.empty()) {
Packit a4aae4
        parser.intern(cin, &table);
Packit a4aae4
    }
Packit a4aae4
    else {
Packit a4aae4
        fstream in(name.c_str(), ios_base::in);
Packit a4aae4
        parser.intern(in, &table);
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    if (table.check_semantics())
Packit a4aae4
        cout << "DAP4 DDS past semantic check" << endl;
Packit a4aae4
    else
Packit a4aae4
        cout << "DAP4 DDS failed semantic check" << endl;
Packit a4aae4
Packit a4aae4
    if (table.check_semantics(true))
Packit a4aae4
        cout << "DAP4 DDS past full semantic check" << endl;
Packit a4aae4
    else
Packit a4aae4
        cout << "DAP4 DDS failed full semantic check" << endl;
Packit a4aae4
Packit a4aae4
    if (print_ddx)
Packit a4aae4
        table.print_xml_writer(cout, false, "");
Packit a4aae4
    else
Packit a4aae4
        table.print(cout);
Packit a4aae4
#else
Packit a4aae4
    cerr << "DAP4 parsing not supported by this version of libdap" << endl;
Packit a4aae4
#endif
Packit a4aae4
}
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
void test_class(void) {
Packit a4aae4
    BaseTypeFactory *factory = new BaseTypeFactory;
Packit a4aae4
    DDS table(factory);
Packit a4aae4
    table.parse();
Packit a4aae4
Packit a4aae4
    if (table.check_semantics())
Packit a4aae4
        cout << "DDS past semantic check" << endl;
Packit a4aae4
    else
Packit a4aae4
        cout << "DDS filed semantic check" << endl;
Packit a4aae4
Packit a4aae4
    if (table.check_semantics(true))
Packit a4aae4
        cout << "DDS past full semantic check" << endl;
Packit a4aae4
    else
Packit a4aae4
        cout << "DDS filed full semantic check" << endl;
Packit a4aae4
Packit a4aae4
    table.print(cout);
Packit a4aae4
Packit a4aae4
    DDS table2 = table; // test copy ctor;
Packit a4aae4
    table2.print(cout);
Packit a4aae4
Packit a4aae4
    BaseTypeFactory *factory2 = new BaseTypeFactory;
Packit a4aae4
    DDS table3(factory2);
Packit a4aae4
    table3 = table; // test operator=
Packit a4aae4
Packit a4aae4
    cout << "Dataset name: " << table.get_dataset_name() << endl;
Packit a4aae4
Packit a4aae4
    string name = "goofy";
Packit a4aae4
    table.add_var(table.get_factory()->NewInt32(name)); // table dtor should delete this object
Packit a4aae4
Packit a4aae4
    table.print(cout);
Packit a4aae4
Packit a4aae4
    BaseType *btp = table.var(name);
Packit a4aae4
Packit a4aae4
    btp->print_decl(cout, "", true); // print out goofy w/semicolon
Packit a4aae4
Packit a4aae4
    table.del_var(name);
Packit a4aae4
Packit a4aae4
    table.print(cout);
Packit a4aae4
Packit a4aae4
    table.add_var(table.get_factory()->NewInt32("goofy"));
Packit a4aae4
Packit a4aae4
    table.print(cout);
Packit a4aae4
Packit a4aae4
    btp = table.var("goofy");
Packit a4aae4
Packit a4aae4
    btp->print_decl(cout, "", true); // print out goofy w/semicolon
Packit a4aae4
Packit a4aae4
    table.del_var("goofy");
Packit a4aae4
Packit a4aae4
    table.print(cout);
Packit a4aae4
Packit a4aae4
    for (DDS::Vars_iter p = table.var_begin(); p != table.var_end(); p++)
Packit a4aae4
        (*p)->print_decl(cout, "", true); // print them all w/semicolons
Packit a4aae4
Packit a4aae4
    delete factory;
Packit a4aae4
    factory = 0;
Packit a4aae4
    delete factory2;
Packit a4aae4
    factory2 = 0;
Packit a4aae4
}
Packit a4aae4