// Copyright (c) 2014 Tomoki Imai // // 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 #include struct validation { validation() : line(), column(), current(), is_defined(false) { } validation(size_t line, size_t column, std::string current) : line(line), column(column), current(current), is_defined(true) { } size_t line; size_t column; std::string current; bool is_defined; }; typedef std::vector validations; void test(std::string const& input, validations const& validations) { typedef boost::spirit::line_pos_iterator pos_iterator_t; pos_iterator_t const input_begin(input.begin()); pos_iterator_t const input_end(input.end()); pos_iterator_t position(input_begin); validations::const_iterator expected = validations.begin(); for (; position != input_end && expected != validations.end(); ++position, ++expected) { if (!expected->is_defined) continue; boost::iterator_range const range = get_current_line(input_begin, position, input_end); std::string const current(range.begin(), range.end()); BOOST_TEST_EQ(expected->line, get_line(position)); BOOST_TEST_EQ(expected->column, get_column(input_begin, position)); BOOST_TEST_EQ(expected->current, current); } BOOST_TEST(position == input_end); BOOST_TEST(expected == validations.end()); } // LR and CR void testLRandCR(std::string const& line_break) { std::string const input = line_break + line_break; validations const validations = boost::assign::list_of (1,1,"")() (2,1,"")(); test(input, validations); } void testLRandCR_foo_bar_git(std::string const& line_break) { std::string const input = "foo" + line_break + "bar" + line_break + "git"; validations const validations = boost::assign::list_of (1,1,"foo")(1,2,"foo")(1,3,"foo")(1,4,"foo")() (2,1,"bar")(2,2,"bar")(2,3,"bar")(2,4,"bar")() (3,1,"git")(3,2,"git")(3,3,"git"); test(input, validations); } void testLRandCR_bar_git(std::string const& line_break) { std::string const input = line_break + "bar" + line_break + "git"; validations const validations = boost::assign::list_of (1,1,"")() (2,1,"bar")(2,2,"bar")(2,3,"bar")(2,4,"bar")() (3,1,"git")(3,2,"git")(3,3,"git"); test(input, validations); } void testLRandCR_foo_bar(std::string const& line_break) { std::string const input = "foo" + line_break + "bar" + line_break; validations const validations = boost::assign::list_of (1,1,"foo")(1,2,"foo")(1,3,"foo")(1,4,"foo")() (2,1,"bar")(2,2,"bar")(2,3,"bar")(2,4,"bar")(); test(input, validations); } // LR or CR void testLRorCR(std::string const& line_break) { std::string const input = line_break + line_break; validations const validations = boost::assign::list_of (1,1,"") (2,1,""); test(input, validations); } void testLRorCR_foo_bar_git(std::string const& line_break) { std::string const input = "foo" + line_break + "bar" + line_break + "git"; validations const validations = boost::assign::list_of (1,1,"foo")(1,2,"foo")(1,3,"foo")(1,4,"foo") (2,1,"bar")(2,2,"bar")(2,3,"bar")(2,4,"bar") (3,1,"git")(3,2,"git")(3,3,"git"); test(input, validations); } void testLRorCR_bar_git(std::string const& line_break) { std::string const input = line_break + "bar" + line_break + "git"; validations const validations = boost::assign::list_of (1,1,"") (2,1,"bar")(2,2,"bar")(2,3,"bar")(2,4,"bar") (3,1,"git")(3,2,"git")(3,3,"git"); test(input, validations); } void testLRorCR_foo_bar(std::string const& line_break) { std::string const input = "foo" + line_break + "bar" + line_break; validations const validations = boost::assign::list_of (1,1,"foo")(1,2,"foo")(1,3,"foo")(1,4,"foo") (2,1,"bar")(2,2,"bar")(2,3,"bar")(2,4,"bar"); test(input, validations); } int main() { testLRandCR("\r\n"); testLRandCR_foo_bar_git("\r\n"); testLRandCR_bar_git("\r\n"); testLRandCR_foo_bar("\r\n"); testLRandCR("\n\r"); testLRandCR_foo_bar_git("\n\r"); testLRandCR_bar_git("\n\r"); testLRandCR_foo_bar("\n\r"); testLRorCR("\r"); testLRorCR_foo_bar_git("\r"); testLRorCR_bar_git("\r"); testLRorCR_foo_bar("\r"); testLRorCR("\n"); testLRorCR_foo_bar_git("\n"); testLRorCR_bar_git("\n"); testLRorCR_foo_bar("\n"); return boost::report_errors(); }