Exheredludis/paludis/elike_dep_parser_TEST.cc
2012-05-12 11:33:35 +01:00

157 lines
7.8 KiB
C++

/* vim: set sw=4 sts=4 et foldmethod=syntax : */
/*
* Copyright (c) 2008, 2010, 2011 Ciaran McCreesh
*
* This file is part of the Paludis package manager. Paludis is free software;
* you can redistribute it and/or modify it under the terms of the GNU General
* Public License version 2, as published by the Free Software Foundation.
*
* Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <paludis/elike_dep_parser.hh>
#include <paludis/util/map.hh>
#include <paludis/util/wrapped_forward_iterator.hh>
#include <paludis/util/make_named_values.hh>
#include <paludis/util/options.hh>
#include <gtest/gtest.h>
using namespace paludis;
namespace
{
void handler(std::string & s, const std::string & a1, const std::string & a2, const std::string & a3,
const std::string & a4, const std::string & a5)
{
s.append(a1);
s.append(a2);
s.append(a3);
s.append(a4);
s.append(a5);
}
void do_nothing()
{
}
void handle_annotations(std::string & s, const std::shared_ptr<const Map<std::string, std::string> > & m)
{
s.append("[");
for (Map<std::string, std::string>::ConstIterator i(m->begin()), i_end(m->end()) ;
i != i_end ; ++i)
s.append(i->first + ":" + i->second + ";");
s.append("]");
}
}
TEST(ELikeDepParser, Basic)
{
using namespace std::placeholders;
std::string in("|| ( a b ( c d e ) )"), out;
ELikeDepParserCallbacks callbacks(make_named_values<ELikeDepParserCallbacks>(
n::on_all() = std::bind(&handler, std::ref(out), "all<", "", "", "", ""),
n::on_annotations() = std::bind(&handle_annotations, std::ref(out), _1),
n::on_any() = std::bind(&handler, std::ref(out), "any<", "", "", "", ""),
n::on_arrow() = std::bind(&handler, std::ref(out), "a<", _1, ", ", _2, ">"),
n::on_at_most_one() = std::bind(&handler, std::ref(out), "m<", "", "", "", ""),
n::on_error() = std::bind(&handler, std::ref(out), "error<", _1, ">", "", ""),
n::on_exactly_one() = std::bind(&handler, std::ref(out), "x<", "", "", "", ""),
n::on_label() = std::bind(&handler, std::ref(out), "label<", _1, "", "", ""),
n::on_no_annotations() = &do_nothing,
n::on_pop() = std::bind(&handler, std::ref(out), ">", "", "", "", ""),
n::on_should_be_empty() = std::bind(&handler, std::ref(out), "EMPTY", "", "", "", ""),
n::on_string() = std::bind(&handler, std::ref(out), "s<", _1, ">", "", ""),
n::on_use() = std::bind(&handler, std::ref(out), "use<", _1, ", ", "", ""),
n::on_use_under_any() = &do_nothing
));
parse_elike_dependencies(in, callbacks, { });
EXPECT_EQ("any<s<a>s<b>all<s<c>s<d>s<e>>>EMPTY", out);
}
TEST(ELikeDepParser, Empty)
{
using namespace std::placeholders;
std::string in("( ( ) )"), out;
ELikeDepParserCallbacks callbacks(make_named_values<ELikeDepParserCallbacks>(
n::on_all() = std::bind(&handler, std::ref(out), "all<", "", "", "", ""),
n::on_annotations() = std::bind(&handle_annotations, std::ref(out), _1),
n::on_any() = std::bind(&handler, std::ref(out), "any<", "", "", "", ""),
n::on_arrow() = std::bind(&handler, std::ref(out), "a<", _1, ", ", _2, ">"),
n::on_at_most_one() = std::bind(&handler, std::ref(out), "m<", "", "", "", ""),
n::on_error() = std::bind(&handler, std::ref(out), "error<", _1, ">", "", ""),
n::on_exactly_one() = std::bind(&handler, std::ref(out), "x<", "", "", "", ""),
n::on_label() = std::bind(&handler, std::ref(out), "label<", _1, "", "", ""),
n::on_no_annotations() = &do_nothing,
n::on_pop() = std::bind(&handler, std::ref(out), ">", "", "", "", ""),
n::on_should_be_empty() = std::bind(&handler, std::ref(out), "EMPTY", "", "", "", ""),
n::on_string() = std::bind(&handler, std::ref(out), "s<", _1, ">", "", ""),
n::on_use() = std::bind(&handler, std::ref(out), "use<", _1, ", ", "", ""),
n::on_use_under_any() = &do_nothing
));
parse_elike_dependencies(in, callbacks, { });
EXPECT_EQ("all<all<>>EMPTY", out);
}
TEST(ELikeDepParser, Annotations)
{
using namespace std::placeholders;
std::string in("a [[ first = foo second = [ bar baz ] ]]"), out;
ELikeDepParserCallbacks callbacks(make_named_values<ELikeDepParserCallbacks>(
n::on_all() = std::bind(&handler, std::ref(out), "all<", "", "", "", ""),
n::on_annotations() = std::bind(&handle_annotations, std::ref(out), _1),
n::on_any() = std::bind(&handler, std::ref(out), "any<", "", "", "", ""),
n::on_arrow() = std::bind(&handler, std::ref(out), "a<", _1, ", ", _2, ">"),
n::on_at_most_one() = std::bind(&handler, std::ref(out), "m<", "", "", "", ""),
n::on_error() = std::bind(&handler, std::ref(out), "error<", _1, ">", "", ""),
n::on_exactly_one() = std::bind(&handler, std::ref(out), "x<", "", "", "", ""),
n::on_label() = std::bind(&handler, std::ref(out), "label<", _1, "", "", ""),
n::on_no_annotations() = &do_nothing,
n::on_pop() = std::bind(&handler, std::ref(out), ">", "", "", "", ""),
n::on_should_be_empty() = std::bind(&handler, std::ref(out), "EMPTY", "", "", "", ""),
n::on_string() = std::bind(&handler, std::ref(out), "s<", _1, ">", "", ""),
n::on_use() = std::bind(&handler, std::ref(out), "use<", _1, ", ", "", ""),
n::on_use_under_any() = &do_nothing
));
parse_elike_dependencies(in, callbacks, { });
EXPECT_EQ("s<a>[first:foo;second:bar baz;]EMPTY", out);
}
TEST(ELikeDepParser, Comments)
{
using namespace std::placeholders;
std::string in("# comment\na [[ first = foo second = [ bar baz ] ]] # comment"), out;
ELikeDepParserCallbacks callbacks(make_named_values<ELikeDepParserCallbacks>(
n::on_all() = std::bind(&handler, std::ref(out), "all<", "", "", "", ""),
n::on_annotations() = std::bind(&handle_annotations, std::ref(out), _1),
n::on_any() = std::bind(&handler, std::ref(out), "any<", "", "", "", ""),
n::on_arrow() = std::bind(&handler, std::ref(out), "a<", _1, ", ", _2, ">"),
n::on_at_most_one() = std::bind(&handler, std::ref(out), "m<", "", "", "", ""),
n::on_error() = std::bind(&handler, std::ref(out), "error<", _1, ">", "", ""),
n::on_exactly_one() = std::bind(&handler, std::ref(out), "x<", "", "", "", ""),
n::on_label() = std::bind(&handler, std::ref(out), "label<", _1, "", "", ""),
n::on_no_annotations() = &do_nothing,
n::on_pop() = std::bind(&handler, std::ref(out), ">", "", "", "", ""),
n::on_should_be_empty() = std::bind(&handler, std::ref(out), "EMPTY", "", "", "", ""),
n::on_string() = std::bind(&handler, std::ref(out), "s<", _1, ">", "", ""),
n::on_use() = std::bind(&handler, std::ref(out), "use<", _1, ", ", "", ""),
n::on_use_under_any() = &do_nothing
));
parse_elike_dependencies(in, callbacks, { edpo_allow_embedded_comments });
EXPECT_EQ("s<a>[first:foo;second:bar baz;]EMPTY", out);
}