/*============================================================================= Copyright (c) 2001-2015 Joel de Guzman 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) =============================================================================*/ #include #include #include #include #include "../rexpr/ast.hpp" #include "../rexpr/rexpr.hpp" #include "../rexpr/error_handler.hpp" #include "../rexpr/config.hpp" #include "../rexpr/printer.hpp" #include "testing.hpp" namespace fs = boost::filesystem; namespace testing = boost::spirit::x3::testing; auto parse = [](std::string const& source, fs::path input_path)-> std::string { std::stringstream out; using rexpr::parser::iterator_type; iterator_type iter(source.begin()); iterator_type const end(source.end()); // Our AST rexpr::ast::rexpr ast; // Our error handler using boost::spirit::x3::with; using rexpr::parser::error_handler_type; using rexpr::parser::error_handler_tag; error_handler_type error_handler(iter, end, out, input_path.string()); // Our error handler // Our parser auto const parser = // we pass our error handler to the parser so we can access // it later on in our on_error and on_sucess handlers with(std::ref(error_handler)) [ rexpr::rexpr() ]; // Go forth and parse! using boost::spirit::x3::ascii::space; bool success = phrase_parse(iter, end, parser, space, ast); if (success) { if (iter != end) error_handler(iter, "Error! Expecting end of input here: "); else rexpr::ast::rexpr_printer{out}(ast); } return out.str(); }; int num_files_tested = 0; auto compare = [](fs::path input_path, fs::path expect_path) { testing::compare(input_path, expect_path, parse); ++num_files_tested; }; int main(int argc, char* argv[]) { if (argc < 2) { std::cout << "usage: " << fs::path(argv[0]).filename() << " path/to/test/files" << std::endl; return -1; } std::cout << "===================================================================================================" << std::endl; std::cout << "Testing: " << fs::absolute(fs::path(argv[1])) << std::endl; int r = testing::for_each_file(fs::path(argv[1]), compare); if (r == 0) std::cout << num_files_tested << " files tested." << std::endl; std::cout << "===================================================================================================" << std::endl; return r; }