From 171bb5b298df4af6cea9abdaafb59ff2b1703566 Mon Sep 17 00:00:00 2001 From: Adam Wardynski <award@.(B-4.4.46a)> Date: Fri, 19 Nov 2010 18:23:25 +0100 Subject: [PATCH] IsInside, checks if position is within sentence in given context. --- libwccl/ops/isinside.h | 54 +++++++++++++++++ tests/CMakeLists.txt | 1 + tests/positionpredicates.cpp | 114 +++++++++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 libwccl/ops/isinside.h create mode 100644 tests/positionpredicates.cpp diff --git a/libwccl/ops/isinside.h b/libwccl/ops/isinside.h new file mode 100644 index 0000000..1a3339d --- /dev/null +++ b/libwccl/ops/isinside.h @@ -0,0 +1,54 @@ +#ifndef LIBWCCL_OPS_ISINSIDE_H +#define LIBWCCL_OPS_ISINSIDE_H + +#include <libwccl/ops/predicate.h> +#include <libwccl/ops/formatters.h> +#include <libwccl/values/position.h> + +namespace Wccl { + +/** + * Predicate that checks if a position is within sentence boundaries + */ +class IsInside : public Predicate { +public: + typedef boost::shared_ptr<Function<Position> > PosFunctionPtr; + + IsInside(const PosFunctionPtr& pos_expr) + : pos_expr_(pos_expr) + { + BOOST_ASSERT(pos_expr_); + } + + virtual std::string to_string(const Corpus2::Tagset& tagset) const { + return UnaryFunctionFormatter::to_string(tagset, *this, *pos_expr_); + } + + virtual std::string to_raw_string() const { + return UnaryFunctionFormatter::to_raw_string(*this, *pos_expr_); + } + + virtual const std::string raw_operator_name() const { + return "inside"; + } + +protected: + const PosFunctionPtr pos_expr_; + + /** + * Takes values of position from argument, and checks if it is inside sentence + * boundaries. + * @returns True value if position is within sentence boundaries, False otherwise. + */ + virtual BaseRetValPtr apply_internal(const FunExecContext& context) const { + const boost::shared_ptr<const Position>& pos = pos_expr_->apply(context); + if(pos->is_inside(context.sentence_context())) { + return Predicate::True(context); + } + return Predicate::False(context); + } +}; + +} /* end ns Wccl */ + +#endif // LIBWCCL_OPS_ISINSIDE_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 28ed5a8..6b6035e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(tests logicalpredicates.cpp main.cpp position.cpp + positionpredicates.cpp regex.cpp strsetfunctions.cpp values.cpp diff --git a/tests/positionpredicates.cpp b/tests/positionpredicates.cpp new file mode 100644 index 0000000..6b479d3 --- /dev/null +++ b/tests/positionpredicates.cpp @@ -0,0 +1,114 @@ +#include <boost/test/unit_test.hpp> +#include <boost/bind.hpp> +#include <boost/shared_ptr.hpp> +#include <libcorpus2/sentence.h> + +#include <libwccl/ops/constant.h> +#include <libwccl/ops/isinside.h> + +using namespace Wccl; + +BOOST_AUTO_TEST_SUITE(position_predicates) + +struct PosPredFix +{ + PosPredFix() + : s(boost::make_shared<Corpus2::Sentence>()), + sc(s), + tagset(), + cx(sc, boost::make_shared<Variables>()), + pos_one(1), + pos_minus_one(-1), + nowhere(Position::Nowhere), + begin(Position::Begin), + end(Position::End), + 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)) + { + Corpus2::Token* the_token = new Corpus2::Token("ZZ", PwrNlp::Whitespace::ManySpaces); + Corpus2::Tag t1(Corpus2::mask_t(0)); + Corpus2::Lexeme l1("aaa", t1); + Corpus2::Lexeme l2("bbb", t1); + the_token->add_lexeme(l1); + the_token->add_lexeme(l2); + s->append(the_token); + s->append(the_token->clone()); + } + + boost::shared_ptr<Corpus2::Sentence> s; + SentenceContext sc; + Corpus2::Tagset tagset; + + FunExecContext cx; + Position pos_one; + Position pos_minus_one; + Position nowhere; + Position begin; + Position end; + 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(is_inside_1, PosPredFix) +{ + IsInside is_inside(pos_one_constant); + BOOST_CHECK(is_inside.apply(cx)->get_value()); + sc.advance(); + BOOST_CHECK(!is_inside.apply(cx)->get_value()); +} + +BOOST_FIXTURE_TEST_CASE(is_inside_minus1, PosPredFix) +{ + IsInside is_inside(pos_minus_one_constant); + BOOST_CHECK(!is_inside.apply(cx)->get_value()); + sc.advance(); + BOOST_CHECK(is_inside.apply(cx)->get_value()); +} + +BOOST_FIXTURE_TEST_CASE(is_inside_nowhere, PosPredFix) +{ + IsInside is_inside(nowhere_constant); + BOOST_CHECK(!is_inside.apply(cx)->get_value()); + sc.advance(); + BOOST_CHECK(!is_inside.apply(cx)->get_value()); +} + +BOOST_FIXTURE_TEST_CASE(is_inside_begin, PosPredFix) +{ + IsInside is_inside(begin_constant); + BOOST_CHECK(is_inside.apply(cx)->get_value()); + sc.advance(); + BOOST_CHECK(is_inside.apply(cx)->get_value()); +} + +BOOST_FIXTURE_TEST_CASE(is_inside_end, PosPredFix) +{ + IsInside is_inside(end_constant); + BOOST_CHECK(is_inside.apply(cx)->get_value()); + sc.advance(); + BOOST_CHECK(is_inside.apply(cx)->get_value()); +} + +//------ to_string test cases ------- + +BOOST_FIXTURE_TEST_CASE(is_inside_to_string, PosPredFix) +{ + IsInside is_inside(end_constant); + BOOST_CHECK_EQUAL("inside(end)", is_inside.to_string(tagset)); +} + +BOOST_FIXTURE_TEST_CASE(is_inside_to_raw_string, PosPredFix) +{ + IsInside is_inside(end_constant); + BOOST_CHECK_EQUAL("inside(end)", is_inside.to_raw_string()); +} + + +BOOST_AUTO_TEST_SUITE_END() -- GitLab