#include <boost/test/unit_test.hpp> #include <boost/bind.hpp> #include <libcorpus2/ann/annotatedsentence.h> #include <libwccl/ops/functions/constant.h> #include <libwccl/ops/tagactions/mark.h> using namespace Wccl; BOOST_AUTO_TEST_SUITE(mark) struct MarkFix { MarkFix() : as(boost::make_shared<Corpus2::AnnotatedSentence>()), sc(as), cx(sc, boost::make_shared<Variables>()), pos_zero(0), pos_one(1), pos_minus_one(-1), nowhere(Position::Nowhere), begin(Position::Begin), end(Position::End), pos_zero_constant(new Constant<Position>(pos_zero)), pos_one_constant(new Constant<Position>(pos_one)), pos_minus_one_constant(new Constant<Position>(pos_minus_one)), nowhere_constant(new Constant<Position>(nowhere)), begin_constant(new Constant<Position>(begin)), end_constant(new Constant<Position>(end)) { as->append(new Corpus2::Token(UnicodeString::fromUTF8("t1"), PwrNlp::Whitespace::Newline)); as->append(new Corpus2::Token(UnicodeString::fromUTF8("t2"), PwrNlp::Whitespace::Newline)); as->append(new Corpus2::Token(UnicodeString::fromUTF8("t3"), PwrNlp::Whitespace::Newline)); as->append(new Corpus2::Token(UnicodeString::fromUTF8("t4"), PwrNlp::Whitespace::Newline)); as->append(new Corpus2::Token(UnicodeString::fromUTF8("t5"), PwrNlp::Whitespace::Newline)); as->create_channel("ch1"); as->get_channel("ch1").set_segment_at(2, 1); as->get_channel("ch1").set_segment_at(3, 1); as->get_channel("ch1").set_head_at(3, true); } boost::shared_ptr<Corpus2::AnnotatedSentence> as; SentenceContext sc; Corpus2::Tagset tagset; ActionExecContext cx; Position pos_zero; Position pos_one; Position pos_minus_one; Position nowhere; Position begin; Position end; boost::shared_ptr<Function<Position> > pos_zero_constant; boost::shared_ptr<Function<Position> > pos_one_constant; boost::shared_ptr<Function<Position> > pos_minus_one_constant; boost::shared_ptr<Function<Position> > nowhere_constant; boost::shared_ptr<Function<Position> > begin_constant; boost::shared_ptr<Function<Position> > end_constant; }; BOOST_FIXTURE_TEST_CASE(mark_empty, MarkFix) { boost::shared_ptr<Corpus2::AnnotatedSentence> as_clone = boost::dynamic_pointer_cast<Corpus2::AnnotatedSentence>(as->clone_shared()); Mark mark(pos_minus_one_constant, pos_minus_one_constant, "ch1"); BOOST_CHECK(!mark.execute(cx)); //BOOST_CHECK((*as) == (*as_clone)); BOOST_CHECK_EQUAL(as->get_channel("ch1").dump_alpha(), "__aA_"); } BOOST_FIXTURE_TEST_CASE(mark_already_there, MarkFix) { boost::shared_ptr<Corpus2::AnnotatedSentence> as_clone = boost::dynamic_pointer_cast<Corpus2::AnnotatedSentence>(as->clone_shared()); sc.set_position(1); Mark mark(begin_constant, pos_one_constant, "ch1"); BOOST_CHECK(!mark.execute(cx)); BOOST_CHECK_EQUAL(as->get_channel("ch1").dump_alpha(), "__aA_"); } BOOST_FIXTURE_TEST_CASE(mark_begin, MarkFix) { boost::shared_ptr<Corpus2::AnnotatedSentence> as_clone = boost::dynamic_pointer_cast<Corpus2::AnnotatedSentence>(as->clone_shared()); sc.set_position(1); Mark mark(begin_constant, pos_minus_one_constant, "ch1"); BOOST_CHECK(mark.execute(cx)); BOOST_CHECK_EQUAL(as->get_channel("ch1").dump_alpha(), "B_aA_"); } BOOST_FIXTURE_TEST_CASE(mark_begin_head0, MarkFix) { boost::shared_ptr<Corpus2::AnnotatedSentence> as_clone = boost::dynamic_pointer_cast<Corpus2::AnnotatedSentence>(as->clone_shared()); sc.set_position(0); Mark mark(begin_constant, pos_one_constant, pos_zero_constant, "ch1"); BOOST_CHECK(mark.execute(cx)); BOOST_CHECK_EQUAL(as->get_channel("ch1").dump_alpha(), "BbaA_"); } BOOST_FIXTURE_TEST_CASE(mark_begin_head1, MarkFix) { boost::shared_ptr<Corpus2::AnnotatedSentence> as_clone = boost::dynamic_pointer_cast<Corpus2::AnnotatedSentence>(as->clone_shared()); sc.set_position(0); Mark mark(begin_constant, pos_one_constant, pos_one_constant, "ch1"); BOOST_CHECK(mark.execute(cx)); BOOST_CHECK_EQUAL(as->get_channel("ch1").dump_alpha(), "bBaA_"); } BOOST_FIXTURE_TEST_CASE(mark_other, MarkFix) { sc.set_position(1); Mark mark(begin_constant, pos_one_constant, begin_constant, "ch2"); BOOST_CHECK(mark.execute(cx)); BOOST_CHECK_EQUAL(as->get_channel("ch2").dump_alpha(), "Aaa__"); } //------ to_string test cases ------- BOOST_FIXTURE_TEST_CASE(mark_to_string, MarkFix) { Mark mark(begin_constant, end_constant, "ch"); BOOST_CHECK_EQUAL("mark(begin, end, \"ch\")", mark.to_string(tagset)); Mark mark2(begin_constant, pos_one_constant, "ch2"); BOOST_CHECK_EQUAL("mark(begin, 1, \"ch2\")", mark2.to_string(tagset)); Mark mark3(pos_minus_one_constant, end_constant, "ch3"); BOOST_CHECK_EQUAL("mark(-1, end, \"ch3\")", mark3.to_string(tagset)); } BOOST_FIXTURE_TEST_CASE(mark_to_string_head, MarkFix) { Mark mark(begin_constant, end_constant, pos_one_constant, "ch"); BOOST_CHECK_EQUAL("mark(begin, end, 1, \"ch\")", mark.to_string(tagset)); Mark mark2(begin_constant, pos_one_constant, pos_zero_constant, "ch2"); BOOST_CHECK_EQUAL("mark(begin, 1, 0, \"ch2\")", mark2.to_string(tagset)); Mark mark3(pos_minus_one_constant, end_constant, end_constant, "ch3"); BOOST_CHECK_EQUAL("mark(-1, end, end, \"ch3\")", mark3.to_string(tagset)); } BOOST_AUTO_TEST_SUITE_END()