/*=============================================================================
    Boost.Wave: A Standard compliant C++ preprocessor library
    http://www.boost.org/

    Copyright (c) 2001-2010 Hartmut Kaiser. Distributed under the Boost
    Software License, Version 1.0. (See accompanying file
    LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/

#if !defined(BOOST_WAVE_LIBS_WAVE_TEST_TESTWAVE_APP_HPP)
#define BOOST_WAVE_LIBS_WAVE_TEST_TESTWAVE_APP_HPP

#include <string>
#include <vector>

// include boost
#include <boost/config.hpp>

#include "cmd_line_utils.hpp"

///////////////////////////////////////////////////////////////////////////////
class testwave_app
{
public:
    testwave_app(boost::program_options::variables_map const& vm);
    
    //  Test the given file (i.e. preprocess the file and compare the result 
    //  against the embedded 'R' comments, if an error occurs compare the error
    //  message against the given 'E' comments).
    bool test_a_file(std::string filename);
    
    //  print the current version of this program
    int print_version();
    
    //  print the copyright statement
    int print_copyright();

    // access the common options used for the command line and the config
    // options inside the test files
    boost::program_options::options_description const& common_options() const
    { 
        return desc_options; 
    }
    
    void set_debuglevel(int debuglevel_)
    {
        debuglevel = debuglevel_;
    }
    int get_debuglevel() const
    {
        return debuglevel;
    }
    
protected:
    //  Read the given file into a string
    bool read_file(std::string const& filename, std::string& instr);

    //  Extract special information from comments marked with the given letter
    bool extract_special_information(std::string const& filename, 
        std::string const& instr, char flag, std::string& content);

    //  Extract the expected output and expected hooks information from the 
    //  given input data.
    //  The expected output has to be provided inside of special comments which
    //  start with a capital 'R' ('H' for the hooks information). All such 
    //  comments are concatenated and returned through the parameter 'expected'
    //  ('expectedhooks' for hooks information).
    bool extract_expected_output(std::string const& filename, 
        std::string const& instr, std::string& expected, 
        std::string& expectedhooks);
        
    //  Extracts the required preprocessing options from the given input data 
    //  and initializes the given Wave context object accordingly. 
    //  We allow the same (applicable) options to be used as are valid for the 
    //  wave driver executable.
    template <typename Context>
    bool extract_options(std::string const& filename, 
        std::string const& instr, Context& ctx, bool single_line);

    //  transfers the options collected in the vm parameter into the given 
    //  context
    template <typename Context>
    bool initialise_options(Context& ctx, 
        boost::program_options::variables_map const& vm, bool single_line);

    //  Preprocess the given input data and return the generated output through 
    //  the parameter 'result'.
    bool preprocess_file(std::string filename, std::string const& instr, 
        std::string& result, std::string& error, std::string& hooks, 
        bool single_line = false);

    //  Add special predefined macros to the context object
    template <typename Context>
    bool add_predefined_macros(Context& ctx);

    //  This function compares the real result and the expected one but first 
    //  replaces all occurrences in the expected result of 
    //      $E: to the result of preprocessing the given expression
    //      $F: to the passed full filepath 
    //      $P: to the full path
    //      $R: to the relative path
    //      $V: to the current Boost version number
    bool got_expected_result(std::string const& filename, 
        std::string const& result, std::string& expected);

    //  construct a SIZEOF macro definition string and predefine this macro
    template <typename Context>
    bool add_sizeof_definition(Context& ctx, char const *name, int value);
    
    //  construct a MIN macro definition string and predefine this macro
    template <typename T, typename Context>
    bool add_min_definition(Context& ctx, char const *name);
    
    //  construct a MAX macro definition string and predefine this macro
    template <typename T, typename Context>
    bool add_max_definition(Context& ctx, char const *name);

    //  Predefine __TESTWAVE_HAS_STRICT_LEXER__
    template <typename Context>
    bool add_strict_lexer_definition(Context& ctx);

private:
    int debuglevel;
    boost::program_options::options_description desc_options;
    boost::program_options::variables_map const& global_vm;
};

#endif // !defined(BOOST_WAVE_LIBS_WAVE_TEST_TESTWAVE_APP_HPP)
