396 lines
16 KiB
C++
396 lines
16 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2012 Daniel James
|
|
|
|
Use, modification and distribution is subject to 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 "fwd.hpp"
|
|
#include "files.hpp"
|
|
#include <boost/utility/string_ref.hpp>
|
|
#include <boost/detail/lightweight_test.hpp>
|
|
#include <boost/range/algorithm/find.hpp>
|
|
|
|
void simple_map_tests()
|
|
{
|
|
boost::string_ref source("First Line\nSecond Line");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
|
|
quickbook::string_iterator line1 = fake_file->source().begin();
|
|
quickbook::string_iterator line1_end = boost::find(fake_file->source(), '\n');
|
|
quickbook::string_iterator line2 = line1_end + 1;
|
|
quickbook::string_iterator line2_end = fake_file->source().end();
|
|
|
|
quickbook::mapped_file_builder builder;
|
|
|
|
{ // Empty test
|
|
builder.start(fake_file);
|
|
BOOST_TEST(builder.empty());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST(f1->source().empty());
|
|
}
|
|
|
|
{ // Add full text
|
|
builder.start(fake_file);
|
|
builder.add(boost::string_ref(line1, line2_end - line1));
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(), source);
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 2),
|
|
quickbook::file_position(1,3));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line1_end - line1)),
|
|
quickbook::file_position(1,line1_end - line1 + 1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2 - line1)),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
fake_file->position_of(fake_file->source().end()));
|
|
}
|
|
|
|
{ // Add first line
|
|
builder.start(fake_file);
|
|
builder.add(boost::string_ref(line1, line1_end - line1));
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref(source.begin(), line1_end - line1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 2),
|
|
quickbook::file_position(1,3));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(1,line1_end - line1 + 1));
|
|
}
|
|
|
|
{ // Add second line
|
|
builder.start(fake_file);
|
|
builder.add(boost::string_ref(line2, line2_end - line2));
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(), boost::string_ref("Second Line"));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 2),
|
|
quickbook::file_position(2,3));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(2,line2_end - line2 + 1));
|
|
}
|
|
|
|
{ // Out of order
|
|
builder.start(fake_file);
|
|
builder.add(boost::string_ref(line2, line2_end - line2));
|
|
builder.add(boost::string_ref(line1_end, 1));
|
|
builder.add(boost::string_ref(line1, line1_end - line1));
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Second Line\nFirst Line"));
|
|
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 2),
|
|
quickbook::file_position(2,3));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2_end - line2 - 1)),
|
|
quickbook::file_position(2,line2_end - line2));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2_end - line2)),
|
|
quickbook::file_position(1,(line1_end - line1 + 1)));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2_end - line2 + 1)),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(1,line1_end - line1 + 1));
|
|
}
|
|
|
|
{ // Repeated text
|
|
builder.start(fake_file);
|
|
builder.add(boost::string_ref(line2, line2_end - line2));
|
|
builder.add(boost::string_ref(line1_end, 1));
|
|
builder.add(boost::string_ref(line2, line2_end - line2));
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Second Line\nSecond Line"));
|
|
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 2),
|
|
quickbook::file_position(2,3));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2_end - line2 - 1)),
|
|
quickbook::file_position(2,line2_end - line2));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2_end - line2)),
|
|
quickbook::file_position(1,(line1_end - line1 + 1)));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + (line2_end - line2 + 1)),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(2,line2_end - line2 + 1));
|
|
}
|
|
|
|
|
|
{ // Generated text
|
|
builder.start(fake_file);
|
|
builder.add_at_pos("------\n", line1);
|
|
builder.add(boost::string_ref(line1, line1_end - line1));
|
|
builder.add_at_pos("\n------\n", line1_end);
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("------\nFirst Line\n------\n"));
|
|
|
|
quickbook::string_iterator newline = boost::find(f1->source(), '\n');
|
|
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 2),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(newline),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(newline + 1),
|
|
quickbook::file_position(1,1));
|
|
BOOST_TEST_EQ(f1->position_of(newline + 2),
|
|
quickbook::file_position(1,2));
|
|
BOOST_TEST_EQ(f1->position_of(newline + (line1_end - line1)),
|
|
quickbook::file_position(1,line1_end - line1));
|
|
BOOST_TEST_EQ(f1->position_of(newline + (line1_end - line1 + 1)),
|
|
quickbook::file_position(1,line1_end - line1 + 1));
|
|
BOOST_TEST_EQ(f1->position_of(newline + (line1_end - line1 + 2)),
|
|
quickbook::file_position(1,line1_end - line1 + 1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(1,line1_end - line1 + 1));
|
|
}
|
|
}
|
|
|
|
void indented_map_tests()
|
|
{
|
|
boost::string_ref source(
|
|
" Code line1\n"
|
|
" Code line2\n");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
|
|
quickbook::mapped_file_builder builder;
|
|
|
|
{
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\nCode line2\n"));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,4));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 1),
|
|
quickbook::file_position(1,5));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 5),
|
|
quickbook::file_position(1,9));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 10),
|
|
quickbook::file_position(1,14));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 11),
|
|
quickbook::file_position(2,4));
|
|
// TODO: Shouldn't this be (3,1)? Does it matter?
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(3,1));
|
|
}
|
|
|
|
{
|
|
builder.start(fake_file);
|
|
{
|
|
quickbook::mapped_file_builder builder2;
|
|
builder2.start(fake_file);
|
|
builder2.unindent_and_add(fake_file->source());
|
|
builder.add(builder2);
|
|
}
|
|
quickbook::file_ptr f1 = builder.release();
|
|
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\nCode line2\n"));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,4));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 1),
|
|
quickbook::file_position(1,5));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 5),
|
|
quickbook::file_position(1,9));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 10),
|
|
quickbook::file_position(1,14));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 11),
|
|
quickbook::file_position(2,4));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(3,1));
|
|
}
|
|
|
|
{
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(boost::string_ref(
|
|
fake_file->source().begin() + 3,
|
|
fake_file->source().end() - (fake_file->source().begin() + 3)));
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n Code line2\n"));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,4));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 1),
|
|
quickbook::file_position(1,5));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 5),
|
|
quickbook::file_position(1,9));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 10),
|
|
quickbook::file_position(1,14));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 11),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().end()),
|
|
quickbook::file_position(3,1));
|
|
}
|
|
}
|
|
|
|
void indented_map_tests2()
|
|
{
|
|
boost::string_ref source(
|
|
" Code line1\n"
|
|
"\n"
|
|
" Code line2\n");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
|
|
quickbook::mapped_file_builder builder;
|
|
|
|
{
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n\nCode line2\n"));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin()),
|
|
quickbook::file_position(1,4));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 1),
|
|
quickbook::file_position(1,5));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 5),
|
|
quickbook::file_position(1,9));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 10),
|
|
quickbook::file_position(1,14));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 11),
|
|
quickbook::file_position(2,1));
|
|
BOOST_TEST_EQ(f1->position_of(f1->source().begin() + 12),
|
|
quickbook::file_position(3,4));
|
|
}
|
|
}
|
|
|
|
void indented_map_leading_blanks_test()
|
|
{
|
|
quickbook::mapped_file_builder builder;
|
|
|
|
{
|
|
boost::string_ref source("\n\n Code line1\n");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n"));
|
|
}
|
|
|
|
{
|
|
boost::string_ref source(" \n \n Code line1\n");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n"));
|
|
}
|
|
|
|
{
|
|
boost::string_ref source(" Code line1\n \n Code line2");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n\nCode line2"));
|
|
}
|
|
}
|
|
|
|
void indented_map_trailing_blanks_test()
|
|
{
|
|
quickbook::mapped_file_builder builder;
|
|
|
|
{
|
|
boost::string_ref source("\n\n Code line1\n ");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n"));
|
|
}
|
|
|
|
{
|
|
boost::string_ref source(" \n \n Code line1\n ");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n "));
|
|
}
|
|
|
|
{
|
|
boost::string_ref source(" Code line1\n \n Code line2\n ");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line1\n\nCode line2\n"));
|
|
}
|
|
|
|
}
|
|
|
|
void indented_map_mixed_test()
|
|
{
|
|
quickbook::mapped_file_builder builder;
|
|
|
|
{
|
|
boost::string_ref source("\tCode line 1\n Code line 2\n\t Code line 3\n \tCode line 4");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line 1\nCode line 2\n Code line 3\n Code line 4"));
|
|
}
|
|
|
|
{
|
|
boost::string_ref source(" Code line 1\n\tCode line 2");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line 1\n Code line 2"));
|
|
}
|
|
|
|
{
|
|
boost::string_ref source(" Code line 1\n \tCode line 2");
|
|
quickbook::file_ptr fake_file = new quickbook::file(
|
|
"(fake file)", source, 105u);
|
|
builder.start(fake_file);
|
|
builder.unindent_and_add(fake_file->source());
|
|
quickbook::file_ptr f1 = builder.release();
|
|
BOOST_TEST_EQ(f1->source(),
|
|
boost::string_ref("Code line 1\n\tCode line 2"));
|
|
}
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
simple_map_tests();
|
|
indented_map_tests();
|
|
indented_map_tests2();
|
|
indented_map_leading_blanks_test();
|
|
indented_map_trailing_blanks_test();
|
|
indented_map_mixed_test();
|
|
return boost::report_errors();
|
|
}
|