1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*=============================================================================
- 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 <iostream>
- #include <iterator>
- #include <algorithm>
- #include <sstream>
- #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<error_handler_tag>(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;
- }
|