diff options
author | Reuben Thomas <rrt@sc3d.org> | 2017-02-01 15:51:21 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-01 15:51:21 +0000 |
commit | 5bff406fd89c210b992255d912db9849d54b5c0e (patch) | |
tree | 99661e8595efe1aae0beb8c1865f3269bf4c9b3f | |
parent | eafe364aa15c37771a6b35c5ddf0cbbb7f6655c2 (diff) | |
parent | 06d31c5113659e47cdad861f80e162c39c73fcb0 (diff) | |
download | enchant-5bff406fd89c210b992255d912db9849d54b5c0e.tar.gz |
Merge pull request #61 from rrthomas/fix-unittests
Run unittests, fixed for non-Windows systems
51 files changed, 1550 insertions, 367 deletions
@@ -1,9 +1,12 @@ *.o *.lo *.la +*.trs +*.log enchant-*.tar.gz .libs .deps +.dirstamp /aclocal.m4 /autogen.err /autom4te.cache diff --git a/.travis.yml b/.travis.yml index 531a95c..50293b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,5 @@ language: cpp -os: - - linux - - osx - dist: trusty sudo: required @@ -20,31 +16,25 @@ addons: - libhunspell-dev - libvoikko-dev - aspell-en + - libunittest++-dev + - g++-5 # - zemberek-server: installs with error in Travis’s trusty environment -env: &default_env - - VERBOSE=1 # Get test logs in Travis logs +env: + global: + - VERBOSE=1 # Get test logs in Travis logs matrix: include: + - os: linux + env: + - COMPILER=g++-5 - os: osx - osx_image: xcode7.2 + osx_image: xcode7.3 - os: osx osx_image: xcode8.2 - compiler: gcc env: - - *default_env - - COMPILER=g++-5 - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - *default_deps - - [g++-5] - - compiler: gcc - env: - - *default_env - COMPILER=g++-6 addons: apt: @@ -56,9 +46,9 @@ matrix: before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install glib dbus-glib aspell hspell hunspell libvoikko ispell ; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install glib dbus-glib aspell hspell hunspell libvoikko ispell unittest-cpp ; fi script: - - ./autogen.sh + - ./autogen.sh CXX=$COMPILER - make - make distcheck @@ -5,6 +5,7 @@ Reuben Thomas <rrt@sc3d.org> Rui M. Silva Seabra J M Maurer Fabiano Fidencio +Eric Albright <eric_albright@sil.org> Jonathan Springer Heiko Becker Raphael Finkel diff --git a/Makefile.am b/Makefile.am index 891a30e..c1840e0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS=src tests doc data +SUBDIRS=src tests unittests doc data pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = enchant.pc diff --git a/configure.ac b/configure.ac index 448e6eb..b6f0aa8 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_INIT([enchant],[1.6.1]) AC_PACKAGE_VERSION AC_CONFIG_SRCDIR(src/enchant.h) -AM_INIT_AUTOMAKE([no-define]) +AM_INIT_AUTOMAKE([no-define subdir-objects]) AC_CANONICAL_HOST AM_MAINTAINER_MODE AC_CONFIG_MACRO_DIR([m4]) @@ -50,6 +50,7 @@ AC_CHECK_FUNCS(flock lockf) have_cxx=yes AC_PROG_CXX(,have_cxx=no) +AX_CXX_COMPILE_STDCXX(11) AM_CONDITIONAL(WITH_CXX, test "x$have_cxx" = "xyes") PKG_PROG_PKG_CONFIG @@ -269,7 +270,41 @@ glib_DEFUN([GLIB_LC_MESSAGES], GLIB_LC_MESSAGES + +dnl =========================================================================== +dnl Travis run Ubuntu 14.04 LTS which doesn't include that macro +dnl added to pkg-config in January 2013. +dnl =========================================================================== +m4_ifndef([PKG_CHECK_VAR], [ +AC_DEFUN([PKG_CHECK_VAR], + [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl + AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + _PKG_CONFIG([$1], [variable="][$3]["], [$2]) + AS_VAR_COPY([$1], [pkg_cv_][$1]) + AS_VAR_IF([$1], [""], [$5], [$4])dnl + ])# PKG_CHECK_VAR +]) + +dnl =========================================================================== +dnl very hackish. +dnl Unbuntu / Debian ship older version of unittest++ with their own pkg-config +dnl and include dnl =========================================================================== +PKG_CHECK_EXISTS([UnitTest++], + [PKG_CHECK_MODULES(UNITTESTPP, [UnitTest++]) +dnl and because of the above, we need to tweak the include until we stop +dnl supporting this old version. + PKG_CHECK_VAR(UNITTESTPP_INCLUDE, [UnitTest++], [includedir]) + if test "x$UNITTESTPP_INCLUDE" != "x"; then + UNITTESTPP_CFLAGS="$UNITTESTPP_CFLAGS -I$UNITTESTPP_INCLUDE/UnitTest++" + fi + ], + [PKG_CHECK_EXISTS([unittest++], + [PKG_CHECK_MODULES(UNITTESTPP, [unittest++])] + )] +) +AC_SUBST(UNITTESTPP_CFLAGS) +AC_SUBST(UNITTESTPP_LIBS) dnl binreloc dnl AM_BINRELOC @@ -530,6 +565,9 @@ src/voikko/Makefile src/zemberek/Makefile tests/Makefile tests/ispell +unittests/Makefile +unittests/enchant_providers/Makefile +unittests/mock_provider/Makefile doc/Makefile data/Makefile ]) diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4 new file mode 100644 index 0000000..b61fcb6 --- /dev/null +++ b/m4/ax_cxx_compile_stdcxx.m4 @@ -0,0 +1,982 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com> +# Copyright (c) 2012 Zack Weinberg <zackw@panix.com> +# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu> +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com> +# Copyright (c) 2015 Paul Norman <penorman@mac.com> +# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu> +# Copyright (c) 2016 Krzesimir Nowak <qdlacz@gmail.com> +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 6 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AX_REQUIRE_DEFINED([AC_MSG_WARN]) +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) + m4_if([$1], [17], [AC_MSG_WARN([C++17 is not yet standardized, so the checks may change in incompatible ways anytime])]) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template <typename T> + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual void f() {} + }; + + struct Derived : public Base + { + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check<void> single_type; + typedef check<check<void>> double_type; + typedef check<check<check<void>>> triple_type; + typedef check<check<check<check<void>>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same<T, T> + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same<int, decltype(0)>::value == true, ""); + static_assert(is_same<int, decltype(c)>::value == false, ""); + static_assert(is_same<int, decltype(v)>::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same<int, decltype(ac)>::value == true, ""); + static_assert(is_same<int, decltype(av)>::value == true, ""); + static_assert(is_same<int, decltype(sumi)>::value == true, ""); + static_assert(is_same<int, decltype(sumf)>::value == false, ""); + static_assert(is_same<int, decltype(add(c, v))>::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template <int...> + struct sum; + + template <int N0, int... N1toN> + struct sum<N0, N1toN...> + { + static constexpr auto value = N0 + sum<N1toN...>::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template<typename T> + using member = typename T::member_type; + + template<typename T> + void func(...) {} + + template<typename T> + void func(member<T>*) {} + + void test(); + + void test() { func<foo>(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same<T, T> + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same<int, decltype(f(x))>::value, ""); + static_assert(is_same<int&, decltype(g(x))>::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus <= 201402L + +#error "This is not a C++17 compiler" + +#else + +#if defined(__clang__) + #define REALLY_CLANG +#else + #if defined(__GNUC__) + #define REALLY_GCC + #endif +#endif + +#include <initializer_list> +#include <utility> +#include <type_traits> + +namespace cxx17 +{ + +#if !defined(REALLY_CLANG) + namespace test_constexpr_lambdas + { + + // TODO: test it with clang++ from git + + constexpr int foo = [](){return 42;}(); + + } +#endif // !defined(REALLY_CLANG) + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template<typename... Args> + int multiply(Args... args) + { + return (args * ... * 1); + } + + template<typename... Args> + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same<std::initializer_list<int>, decltype(foo)>::value); + static_assert(std::is_same<int, decltype(bar)>::value); + } + + namespace test_typename_in_template_template_parameter + { + + template<template<typename> typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template <bool cond> + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + +#if !defined(REALLY_CLANG) + namespace test_template_argument_deduction_for_class_templates + { + + // TODO: test it with clang++ from git + + template <typename T1, typename T2> + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } +#endif // !defined(REALLY_CLANG) + + namespace test_non_type_auto_template_parameters + { + + template <auto n> + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + +#if !defined(REALLY_CLANG) + namespace test_structured_bindings + { + + // TODO: test it with clang++ from git + + int arr[2] = { 1, 2 }; + std::pair<int, int> pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair<int, int>& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } +#endif // !defined(REALLY_CLANG) + +#if !defined(REALLY_CLANG) + namespace test_exception_spec_type_system + { + + // TODO: test it with clang++ from git + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template<typename T> + Bad + f(T*, T*); + + template<typename T1, typename T2> + Good + f(T1*, T2*); + + static_assert (std::is_same_v<Good, decltype(f(g1, g2))>); + + } +#endif // !defined(REALLY_CLANG) + + namespace test_inline_variables + { + + template<class T> void f(T) + {} + + template<class T> inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus <= 201402L + +]]) @@ -276,7 +276,7 @@ EnchantPWL* enchant_pwl_init_with_file(const char * file) static void enchant_pwl_refresh_from_file(EnchantPWL* pwl) { - char buffer[BUFSIZ]; + char buffer[BUFSIZ + 1]; char* line; size_t line_number = 1; FILE *f; diff --git a/tests/.gitignore b/tests/.gitignore index b47de11..c19e2a7 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,5 +1,3 @@ -/*.trs -/*.log /enchant /enchant-lsmod /ispell diff --git a/unittests/.gitignore b/unittests/.gitignore new file mode 100644 index 0000000..6497ea3 --- /dev/null +++ b/unittests/.gitignore @@ -0,0 +1,2 @@ +/main +libenchant_*.so diff --git a/unittests/EnchantBrokerTestFixture.h b/unittests/EnchantBrokerTestFixture.h index 1424ac0..209b76d 100644 --- a/unittests/EnchantBrokerTestFixture.h +++ b/unittests/EnchantBrokerTestFixture.h @@ -33,7 +33,8 @@ #include "mock_provider/mock_provider.h"
#include <stack>
#include <stdio.h>
-#include <direct.h>
+#include <gmodule.h>
+#include <assert.h>
//////////////////////////////////////
// Mock provider functions
@@ -114,7 +115,7 @@ typedef void (*SET_CONFIGURE)(ConfigureHook); struct EnchantBrokerTestFixture : EnchantTestFixture
{
EnchantBroker* _broker;
- HMODULE hModule, hModule2;
+ GModule *hModule, *hModule2;
//Setup
EnchantBrokerTestFixture(ConfigureHook userConfiguration=NULL,
@@ -124,48 +125,46 @@ struct EnchantBrokerTestFixture : EnchantTestFixture userMockProviderConfiguration = userConfiguration;
userMockProvider2Configuration = user2Configuration;
-#if _WIN32
CopyProvider("libenchant_mock_provider", "libenchant_mock_provider");
- hModule = LoadLibrary(L"lib\\enchant\\libenchant_mock_provider.dll");
+ hModule = g_module_open("lib/enchant/libenchant_mock_provider", (GModuleFlags) 0);
if(hModule!=NULL){
- SET_CONFIGURE sc = (SET_CONFIGURE) GetProcAddress(hModule, "set_configure");
+ SET_CONFIGURE sc;
+ assert(g_module_symbol(hModule, "set_configure", (gpointer *)&sc));
(sc)(ConfigureMockProvider);
}
hModule2 = NULL;
if(user2Configuration != NULL){
- CopyProvider("libenchant_mock_provider", "libenchant_mock_provider2");
- hModule2 = LoadLibrary(L"lib\\enchant\\libenchant_mock_provider2.dll");
+ CopyProvider("libenchant_mock_provider2", "libenchant_mock_provider2");
+ hModule2 = g_module_open("lib/enchant/libenchant_mock_provider2", (GModuleFlags) 0);
if(hModule2!=NULL){
- SET_CONFIGURE sc = (SET_CONFIGURE) GetProcAddress(hModule2, "set_configure");
+ SET_CONFIGURE sc;
+ assert(g_module_symbol(hModule2, "set_configure", (gpointer *)&sc));
(sc)(ConfigureMockProvider2);
}
}
-#else
- // What to do?
-#endif
if(includeNullProviders){
- CopyProvider("libenchant_mock_provider", "null_provider");
- CopyProvider("libenchant_mock_provider", "null_identify");
- CopyProvider("libenchant_mock_provider", "null_describe");
+ CopyProvider("libenchant_null_provider", "null_provider");
+ CopyProvider("libenchant_null_identify", "null_identify");
+ CopyProvider("libenchant_null_describe", "null_describe");
CopyProvider("libenchant", "libenchant"); //not a provider
}
+#if _WIN32
SetUserRegistryConfigDir(GetTempUserEnchantDir());
+#endif
InitializeBroker();
}
//Teardown
~EnchantBrokerTestFixture(){
-#if _WIN32
if(hModule!=NULL){
- FreeLibrary(hModule);
+ g_module_close(hModule);
}
if(hModule2!=NULL){
- FreeLibrary(hModule2);
+ g_module_close(hModule2);
}
-#endif
if(_broker){
enchant_broker_free (_broker);
diff --git a/unittests/EnchantDictionaryTestFixture.h b/unittests/EnchantDictionaryTestFixture.h index a31d299..aa5109c 100644 --- a/unittests/EnchantDictionaryTestFixture.h +++ b/unittests/EnchantDictionaryTestFixture.h @@ -28,11 +28,13 @@ #pragma warning(disable: 4996) //The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name.
#endif
-#include "../EnchantBrokerTestFixture.h"
-#include <io.h>
+#include "EnchantBrokerTestFixture.h"
+
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <unistd.h>
+#include <string>
#include <vector>
static EnchantDict*
@@ -239,9 +241,9 @@ struct EnchantDictionaryTestFixture : EnchantBrokerTestFixture enchant_dict_add(_dict, word.c_str(), word.size());
}
- void AddWordsToDictionary(const std::vector<const std::string>& sWords)
+ void AddWordsToDictionary(const std::vector<std::string>& sWords)
{
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin();
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin();
itWord != sWords.end();
++itWord){
AddWordToDictionary(*itWord);
@@ -260,7 +262,7 @@ struct EnchantDictionaryTestFixture : EnchantBrokerTestFixture static void ExternalAddWordToFile(const std::string& word, const std::string& filename)
{
- Sleep(1000); // FAT systems have a 2 second resolution
+ sleep(1); // FAT systems have a 2 second resolution
// NTFS is appreciably faster but no specs on what it is exactly
// c runtime library's time_t has a 1 second resolution
FILE * f = g_fopen(filename.c_str(), "at");
@@ -274,36 +276,35 @@ struct EnchantDictionaryTestFixture : EnchantBrokerTestFixture void ExternalAddNewLineToDictionary()
{
- Sleep(1000); // FAT systems have a 2 second resolution
+ sleep(1); // FAT systems have a 2 second resolution
// NTFS is appreciably faster but no specs on what it is exactly
// c runtime library's time_t has a 1 second resolution
FILE * f = g_fopen(GetPersonalDictFileName().c_str(), "at");
- if(f)
- {
- fputc('\n', f);
- fclose(f);
- }
+ if(f)
+ {
+ fputc('\n', f);
+ fclose(f);
+ }
}
- void ExternalAddWordsToDictionary(const std::vector<const std::string>& sWords)
+ void ExternalAddWordsToDictionary(const std::vector<std::string>& sWords)
{
- Sleep(1000); // FAT systems have a 2 second resolution
+ sleep(1); // FAT systems have a 2 second resolution
// NTFS is appreciably faster but no specs on what it is exactly
// c runtime library's time_t has a 1 second resolution
FILE * f = g_fopen(GetPersonalDictFileName().c_str(), "at");
- if(f)
- {
- for(std::vector<const std::string>::const_iterator
- itWord = sWords.begin();
+ if(f)
+ {
+ for (std::vector<std::string>::const_iterator itWord = sWords.begin();
itWord != sWords.end(); ++itWord)
{
- if(itWord != sWords.begin()){
- fputc('\n', f);
+ if (itWord != sWords.begin()) {
+ fputc('\n', f);
}
- fputs(itWord->c_str(), f);
- }
- fclose(f);
- }
+ fputs(itWord->c_str(), f);
+ }
+ fclose(f);
+ }
}
std::vector<std::string> GetExpectedSuggestions(const std::string& s, size_t begin = 0)
@@ -324,9 +325,9 @@ struct EnchantDictionaryTestFixture : EnchantBrokerTestFixture }
- std::vector<const std::string> GetSuggestionsFromWord(const std::string& word)
+ std::vector<std::string> GetSuggestionsFromWord(const std::string& word)
{
- std::vector<const std::string> result;
+ std::vector<std::string> result;
size_t cSuggestions;
char** suggestions = enchant_dict_suggest(_dict, word.c_str(), word.size(), &cSuggestions);
@@ -340,7 +341,7 @@ struct EnchantDictionaryTestFixture : EnchantBrokerTestFixture return result;
}
- std::vector<const std::string> GetSuggestions(const std::string& s)
+ std::vector<std::string> GetSuggestions(const std::string& s)
{
return GetSuggestionsFromWord("helo");
}
diff --git a/unittests/EnchantTestFixture.h b/unittests/EnchantTestFixture.h index 7a0c6ab..301518d 100644 --- a/unittests/EnchantTestFixture.h +++ b/unittests/EnchantTestFixture.h @@ -30,11 +30,20 @@ #define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shlwapi.h>
-#endif
#include <io.h>
+#else
+#include <fcntl.h> /* For creat; should not be needed, but gstdio.h does not include fcntl.h */
+#endif
#include <assert.h>
-#include <glib.h>
+#include <glib/gstdio.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
#include <string>
+#include <locale>
+#include <codecvt>
struct EnchantTestFixture
{
@@ -122,7 +131,7 @@ struct EnchantTestFixture std::string GetTempUserEnchantDir()
{
- return GetEnchantHomeDirFromBase(GetDirectoryOfThisModule());
+ return GetEnchantHomeDirFromBase(g_get_user_config_dir());
}
void MoveEnchantUserFilesOutOfTheWay()
@@ -200,7 +209,7 @@ struct EnchantTestFixture break;
}
std::string filepath = AddToPath(dir, filename);
- if(g_file_test(filepath.c_str(), G_FILE_TEST_IS_DIR)){
+ if(g_file_test(filepath.c_str(), G_FILE_TEST_IS_DIR)){
DeleteDirAndFiles(filepath);
}
else {
@@ -221,14 +230,14 @@ struct EnchantTestFixture static void CreateDirectory(const std::string& filepath)
{
- g_mkdir_with_parents(filepath.c_str(), S_IREAD | S_IWRITE | S_IEXEC);
+ g_mkdir_with_parents(filepath.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
}
static void CreateFile(const std::string& filepath)
{
- int fh = g_creat(filepath.c_str(), _S_IREAD | _S_IWRITE);
+ int fh = g_creat(filepath.c_str(), S_IRUSR | S_IWUSR);
if(fh != -1) {
close(fh);
- }
+ }
}
static void DeleteFile(const std::string& filepath)
{
@@ -243,18 +252,14 @@ struct EnchantTestFixture std::string Convert(const std::wstring & ws)
{
- gchar* str = g_utf16_to_utf8((gunichar2*)ws.c_str(), (glong)ws.length(), NULL, NULL, NULL);
- std::string s(str);
- g_free(str);
- return s;
+ std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> convert;
+ return convert.to_bytes(ws);
}
std::wstring Convert(const std::string & s)
{
- gunichar2* str = g_utf8_to_utf16(s.c_str(), (glong)s.length(), NULL, NULL, NULL);
- std::wstring ws((wchar_t*)str);
- g_free(str);
- return ws;
+ std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> convert;
+ return convert.from_bytes(s);
}
std::string GetDirectoryOfThisModule()
@@ -275,6 +280,7 @@ struct EnchantTestFixture return result;
}
+#if defined(_WIN32)
std::string GetRegistryHomeDir()
{
return Convert(GetRegistryValue(HKEY_CURRENT_USER, L"Software\\Enchant\\Config", L"Home_Dir"));
@@ -421,7 +427,7 @@ struct EnchantTestFixture RegCloseKey(hkey);
}
}
-
+#endif
static std::string AddToPath(const std::string & path, const std::string & fileOrDirName)
{
@@ -439,12 +445,22 @@ struct EnchantTestFixture return AddToPath(AddToPath(AddToPath(basePath,"Library"),
"Application Support"),
"Enchant");
-#elif defined(_WIN32)
- return AddToPath(basePath,"enchant");
#else
- return AddToPath(basePath,".enchant");
+ return AddToPath(basePath, "enchant");
#endif
}
+
+ static std::string GetEnchantHomeDirFromHome(const std::string& homePath)
+ {
+#ifdef XP_TARGET_COCOA
+ return AddToPath(AddToPath(AddToPath(homePath,"Library"),
+ "Application Support"),
+ "Enchant");
+#else
+ return AddToPath(homePath, ".enchant");
+#endif
+ }
+
};
#endif
diff --git a/unittests/Makefile.am b/unittests/Makefile.am new file mode 100644 index 0000000..dae2122 --- /dev/null +++ b/unittests/Makefile.am @@ -0,0 +1,62 @@ +SUBDIRS = enchant_providers mock_provider + +AM_CPPFLAGS = -I$(top_srcdir)/src $(ENCHANT_CFLAGS) $(UNITTESTPP_CFLAGS) + +# FIXME: .so extension will not work on Windows +AM_TESTS_ENVIRONMENT = \ + ENCHANT_MODULE_PATH=$(top_builddir)/unittests/lib/enchant; \ + export ENCHANT_MODULE_PATH; \ + cp $(builddir)/mock_provider/*.so $(builddir)/mock_provider/.libs/*.so . || :; + +DEPS = $(top_builddir)/src/libenchant.la +ldadd = $(top_builddir)/src/libenchant.la $(ENCHANT_LIBS) + +if WITH_CXX +cxx_progs = main +else +cxx_progs = +endif + +check_PROGRAMS = $(cxx_progs) +TESTS = main + +main_SOURCES = main.cpp \ + EnchantBrokerTestFixture.h \ + EnchantDictionaryTestFixture.h \ + EnchantTestFixture.h \ + mock_provider/mock_provider.h \ + dictionary/enchant_dict_add_tests.cpp \ + dictionary/enchant_dict_add_to_session_tests.cpp \ + dictionary/enchant_dict_check_tests.cpp \ + dictionary/enchant_dict_describe_tests.cpp \ + dictionary/enchant_dict_free_string_list_tests.cpp \ + dictionary/enchant_dict_get_error_tests.cpp \ + dictionary/enchant_dict_is_added_tests.cpp \ + dictionary/enchant_dict_is_removed_tests.cpp \ + dictionary/enchant_dict_remove_from_session_tests.cpp \ + dictionary/enchant_dict_remove_tests.cpp \ + dictionary/enchant_dict_store_replacement_tests.cpp \ + dictionary/enchant_dict_suggest_tests.cpp \ + broker/enchant_broker_describe_tests.cpp \ + broker/enchant_broker_dict_exists_tests.cpp \ + broker/enchant_broker_dict_exists_tests.i \ + broker/enchant_broker_free_dict_tests.cpp \ + broker/enchant_broker_free_tests.cpp \ + broker/enchant_broker_get_error_tests.cpp \ + broker/enchant_broker_init_tests.cpp \ + broker/enchant_broker_list_dicts_tests.cpp \ + broker/enchant_broker_request_dict_tests.cpp \ + broker/enchant_broker_request_pwl_dict_tests.cpp \ + broker/enchant_broker_set_ordering_tests.cpp \ + pwl/enchant_pwl_tests.cpp \ + provider/enchant_provider_broker_set_error_tests.cpp \ + provider/enchant_provider_dict_set_error_tests.cpp \ + provider/enchant_provider_get_prefix_dir_tests.cpp \ + provider/enchant_provider_get_user_config_dirs_tests.cpp \ + provider/enchant_provider_get_user_language_tests.cpp \ + $(NULL) +main_LDFLAGS = +main_DEPENDENCIES = $(DEPS) +main_LDADD = $(ldadd) $(UNITTESTPP_LIBS) $(ENCHANT_LIBS) + +DISTCLEANFILES = libenchant_*.so diff --git a/unittests/Readme.txt b/unittests/Readme.txt index e3a6319..e76bc21 100644 --- a/unittests/Readme.txt +++ b/unittests/Readme.txt @@ -1,3 +1,3 @@ -Enchant Unit Tests are written using the UnitTest++ framework.
-
-See http://unittest-cpp.sourceforge.net/ for more details.
+Enchant Unit Tests are written using the UnitTest++ framework. + +See https://github.com/unittest-cpp/unittest-cpp for more details. diff --git a/unittests/broker/enchant_broker_describe_tests.cpp b/unittests/broker/enchant_broker_describe_tests.cpp index 95114b2..8040f42 100644 --- a/unittests/broker/enchant_broker_describe_tests.cpp +++ b/unittests/broker/enchant_broker_describe_tests.cpp @@ -24,7 +24,7 @@ #include <algorithm>
#include <functional>
#include <vector>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
struct ProviderDescription
{
@@ -238,7 +238,7 @@ TEST_FIXTURE(EnchantBrokerDescribeTestFixture, TEST_FIXTURE(EnchantBrokerDescribeTestFixture,
EnchantBrokerDescribe_NullUserData_PassedThroughToCallback)
{
- global_user_data = "hello world";
+ global_user_data = const_cast<char *>("hello world");
enchant_broker_describe(_broker,
EnchantBrokerDescribeAssignUserDataToStaticCallback,
@@ -249,11 +249,11 @@ TEST_FIXTURE(EnchantBrokerDescribeTestFixture, TEST_FIXTURE(EnchantBrokerDescribeTestFixture,
EnchantBrokerDescribe_NonNullUserData_PassedThroughToCallback)
{
- char* data = "some data";
+ const char* data = "some data";
global_user_data = NULL;
enchant_broker_describe(_broker,
EnchantBrokerDescribeAssignUserDataToStaticCallback,
- data);
+ const_cast<char*>(data));
CHECK(global_user_data);
if(global_user_data){
diff --git a/unittests/broker/enchant_broker_dict_exists_tests.cpp b/unittests/broker/enchant_broker_dict_exists_tests.cpp index 819bb12..194221a 100644 --- a/unittests/broker/enchant_broker_dict_exists_tests.cpp +++ b/unittests/broker/enchant_broker_dict_exists_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
static int dictionaryExistsCalled;
static int DoesDictionaryExist (EnchantProvider * me, const char *const tag)
diff --git a/unittests/broker/enchant_broker_free_dict_tests.cpp b/unittests/broker/enchant_broker_free_dict_tests.cpp index 78eeb09..5f03aae 100644 --- a/unittests/broker/enchant_broker_free_dict_tests.cpp +++ b/unittests/broker/enchant_broker_free_dict_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
/**
* enchant_broker_free_dict
* @broker: A non-null #EnchantBroker
@@ -137,7 +137,6 @@ TEST_FIXTURE(EnchantBrokerFreeDictTestFixture, TEST_FIXTURE(EnchantBrokerFreeDictNoDisposeTestFixture,
EnchantBrokerFreeDict_NotOnProvider_DoNothing)
{
- testResults_;
enchant_broker_free_dict(_broker, _dictionary);
_dictionary = NULL;
}
diff --git a/unittests/broker/enchant_broker_free_tests.cpp b/unittests/broker/enchant_broker_free_tests.cpp index eec9257..96f92bd 100644 --- a/unittests/broker/enchant_broker_free_tests.cpp +++ b/unittests/broker/enchant_broker_free_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
/**
* enchant_broker_free
@@ -84,7 +84,6 @@ struct EnchantBrokerFreeNoDisposeTestFixture: EnchantBrokerTestFixture TEST(EnchantBrokerFree)
{
- testResults_;
EnchantBroker* broker = enchant_broker_init ();
enchant_broker_free(broker);
broker = NULL;
@@ -101,7 +100,6 @@ TEST_FIXTURE(EnchantBrokerFreeTestFixture, TEST_FIXTURE(EnchantBrokerFreeNoDisposeTestFixture,
EnchantBrokerFree_ProviderLacksDispose)
{
- testResults_;
enchant_broker_free(_broker);
_broker = NULL;
}
diff --git a/unittests/broker/enchant_broker_get_error_tests.cpp b/unittests/broker/enchant_broker_get_error_tests.cpp index 7c55cca..14243d9 100644 --- a/unittests/broker/enchant_broker_get_error_tests.cpp +++ b/unittests/broker/enchant_broker_get_error_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
/**
* enchant_broker_get_error
@@ -62,4 +62,4 @@ TEST_FIXTURE(EnchantBrokerTestFixture, TEST(EnchantBrokerGetError_NullBroker_Null)
{
CHECK_EQUAL((void*)NULL, (void*)enchant_broker_get_error(NULL));
-}
\ No newline at end of file +}
diff --git a/unittests/broker/enchant_broker_list_dicts_tests.cpp b/unittests/broker/enchant_broker_list_dicts_tests.cpp index c542a1c..59967a6 100644 --- a/unittests/broker/enchant_broker_list_dicts_tests.cpp +++ b/unittests/broker/enchant_broker_list_dicts_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
#include <vector>
@@ -172,7 +172,7 @@ struct EnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixture : Enchant TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
EnchantBrokerListDictionaries_UserDataNotNull_PassedThrough)
{
- char* userData = "some user data";
+ char* userData = const_cast<char*>("some user data");
enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeAssignUserDataToStaticCallback, userData);
CHECK_EQUAL(userData, global_user_data);
}
@@ -240,7 +240,7 @@ TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture, TEST_FIXTURE(EnchantBrokerTestFixture,
EnchantBrokerListDictionaries_ProviderLacksListDictionaries_CallbackNeverCalled)
{
- void* userData = "some user data";
+ void* userData = const_cast<char*>("some user data");
enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeAssignUserDataToStaticCallback, userData);
CHECK_EQUAL((void*)NULL, global_user_data);
}
@@ -265,4 +265,4 @@ TEST_FIXTURE(EnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixture {
enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeCallback, &_dictionaryList);
CHECK_EQUAL((unsigned int)1, _dictionaryList.size());
-}
\ No newline at end of file +}
diff --git a/unittests/broker/enchant_broker_request_dict_tests.cpp b/unittests/broker/enchant_broker_request_dict_tests.cpp index 7affd19..50482a6 100644 --- a/unittests/broker/enchant_broker_request_dict_tests.cpp +++ b/unittests/broker/enchant_broker_request_dict_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
static bool requestDictionaryCalled;
static EnchantDict * RequestDictionary (EnchantProvider *me, const char *tag)
diff --git a/unittests/broker/enchant_broker_request_pwl_dict_tests.cpp b/unittests/broker/enchant_broker_request_pwl_dict_tests.cpp index a4f11c5..2502a82 100644 --- a/unittests/broker/enchant_broker_request_pwl_dict_tests.cpp +++ b/unittests/broker/enchant_broker_request_pwl_dict_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
struct EnchantBrokerRequestPwlDictionary_TestFixture : EnchantBrokerTestFixture
{
diff --git a/unittests/broker/enchant_broker_set_ordering_tests.cpp b/unittests/broker/enchant_broker_set_ordering_tests.cpp index 086a479..b8cfeff 100644 --- a/unittests/broker/enchant_broker_set_ordering_tests.cpp +++ b/unittests/broker/enchant_broker_set_ordering_tests.cpp @@ -22,7 +22,7 @@ #include <UnitTest++.h>
#include <enchant.h>
#include <fstream>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
static bool mock1ProviderRequestDictionaryCalled;
static bool mock2ProviderRequestDictionaryCalled;
@@ -317,32 +317,30 @@ TEST_FIXTURE(EnchantBrokerSetOrdering_TestFixture, TEST_FIXTURE(EnchantBrokerSetOrdering_TestFixture,
EnchantBrokerSetOrdering_EmptyAfterNormalization_DoNothing)
{
- testResults_;
enchant_broker_set_ordering(_broker, " @ ", "mock1,mock2");
}
TEST_FIXTURE(EnchantBrokerSetOrdering_TestFixture,
EnchantBrokerSetOrdering_EmptyLanguageTag_DoNothing)
{
- testResults_;
enchant_broker_set_ordering(_broker, "", "aspell,myspell,ispell");
}
TEST_FIXTURE(EnchantBrokerSetOrdering_TestFixture,
EnchantBrokerSetOrdering_NullOrdering_DoNothing)
{
- testResults_;
enchant_broker_set_ordering(_broker, "en_GB", NULL);
}
TEST_FIXTURE(EnchantBrokerSetOrdering_TestFixture,
EnchantBrokerSetOrdering_EmptyOrdering_DoNothing)
{
- testResults_;
enchant_broker_set_ordering(_broker, "en_GB", "");
}
+// Windows only test.
+#ifdef _WIN32
/*
* Ordering can also be set in enchant.ordering file:
* Language_Tag : Provider1, Provider2, ProviderN
@@ -575,3 +573,4 @@ EnchantBrokerFileOrdering_ListedTwice_LastTakesPrecedence_Mock2ThenMock1) CHECK_EQUAL(Mock2ThenMock1, GetProviderOrder("en_GB"));
}
+#endif
diff --git a/unittests/dictionary/enchant_dict_add_tests.cpp b/unittests/dictionary/enchant_dict_add_tests.cpp index aab3c6a..eda9158 100644 --- a/unittests/dictionary/enchant_dict_add_tests.cpp +++ b/unittests/dictionary/enchant_dict_add_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
static bool addToPersonalCalled;
static std::string wordToAdd;
diff --git a/unittests/dictionary/enchant_dict_add_to_session_tests.cpp b/unittests/dictionary/enchant_dict_add_to_session_tests.cpp index a62aad8..a2acc31 100644 --- a/unittests/dictionary/enchant_dict_add_to_session_tests.cpp +++ b/unittests/dictionary/enchant_dict_add_to_session_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
static bool addToSessionCalled;
static std::string wordToAdd;
diff --git a/unittests/dictionary/enchant_dict_check_tests.cpp b/unittests/dictionary/enchant_dict_check_tests.cpp index 3091d34..e54dcdb 100644 --- a/unittests/dictionary/enchant_dict_check_tests.cpp +++ b/unittests/dictionary/enchant_dict_check_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
static bool dictCheckCalled;
diff --git a/unittests/dictionary/enchant_dict_describe_tests.cpp b/unittests/dictionary/enchant_dict_describe_tests.cpp index d083f5e..0bbc2a0 100644 --- a/unittests/dictionary/enchant_dict_describe_tests.cpp +++ b/unittests/dictionary/enchant_dict_describe_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
static bool callbackCalled;
@@ -109,8 +109,8 @@ TEST_FIXTURE(EnchantDictionaryDescribe_TestFixture, TEST_FIXTURE(EnchantDictionaryDescribe_TestFixture,
EnchantDictionaryDescribe_NonNullUserdata_PassedToCallback)
{
- void* userData = "some user data";
- enchant_dict_describe(_dict, EnchantSingleDictionaryDescribeAssignUserDataToStaticCallback, userData);
+ const char* userData = "some user data";
+ enchant_dict_describe(_dict, EnchantSingleDictionaryDescribeAssignUserDataToStaticCallback, (void*)userData);
CHECK(callbackCalled);
CHECK_EQUAL(userData, global_user_data);
}
@@ -137,4 +137,4 @@ TEST_FIXTURE(EnchantDictionaryDescribe_TestFixture, {
enchant_dict_describe(_dict, NULL, &_description);
CHECK(!callbackCalled);
-}
\ No newline at end of file +}
diff --git a/unittests/dictionary/enchant_dict_free_string_list_tests.cpp b/unittests/dictionary/enchant_dict_free_string_list_tests.cpp index a98455d..dfe01c2 100644 --- a/unittests/dictionary/enchant_dict_free_string_list_tests.cpp +++ b/unittests/dictionary/enchant_dict_free_string_list_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
struct EnchantDictFreeStringList_TestFixture : EnchantDictionaryTestFixture
{
@@ -54,7 +54,6 @@ struct EnchantDictFreeStringList_TestFixture : EnchantDictionaryTestFixture TEST_FIXTURE(EnchantDictFreeStringList_TestFixture,
EnchantDictFreeStringList)
{
- testResults_;
enchant_dict_free_string_list(_dict, _string_list);
_string_list = NULL;
}
@@ -62,7 +61,6 @@ TEST_FIXTURE(EnchantDictFreeStringList_TestFixture, TEST_FIXTURE(EnchantDictFreeStringList_TestFixture,
EnchantDictFreeStringListOnPwl)
{
- testResults_;
enchant_dict_free_string_list(_pwl, _string_list);
_string_list = NULL;
}
@@ -83,13 +81,11 @@ TEST_FIXTURE(EnchantDictFreeStringList_TestFixture, TEST_FIXTURE(EnchantDictFreeStringList_TestFixture,
EnchantDictFreeStringList_NullDict_DoNothing)
{
- testResults_;
enchant_dict_free_string_list(NULL, _string_list);
}
TEST_FIXTURE(EnchantDictFreeStringList_TestFixture,
EnchantDictFreeStringList_NullStringList_DoNothing)
{
- testResults_;
enchant_dict_free_string_list(_dict, NULL);
}
diff --git a/unittests/dictionary/enchant_dict_get_error_tests.cpp b/unittests/dictionary/enchant_dict_get_error_tests.cpp index a401bb1..e20924a 100644 --- a/unittests/dictionary/enchant_dict_get_error_tests.cpp +++ b/unittests/dictionary/enchant_dict_get_error_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
/**
* enchant_dict_get_error
@@ -67,4 +67,4 @@ TEST_FIXTURE(EnchantDictionaryTestFixture, TEST(EnchantDictionaryGetError_NullBroker_Null)
{
CHECK_EQUAL((void*)NULL, (void*)enchant_dict_get_error(NULL));
-}
\ No newline at end of file +}
diff --git a/unittests/dictionary/enchant_dict_is_added_tests.cpp b/unittests/dictionary/enchant_dict_is_added_tests.cpp index 4005667..1de7298 100644 --- a/unittests/dictionary/enchant_dict_is_added_tests.cpp +++ b/unittests/dictionary/enchant_dict_is_added_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
struct EnchantDictionaryIsAdded_TestFixture : EnchantDictionaryTestFixture
{};
diff --git a/unittests/dictionary/enchant_dict_is_removed_tests.cpp b/unittests/dictionary/enchant_dict_is_removed_tests.cpp index 8efdd2c..449bc9d 100644 --- a/unittests/dictionary/enchant_dict_is_removed_tests.cpp +++ b/unittests/dictionary/enchant_dict_is_removed_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
struct EnchantDictionaryIsRemoved_TestFixture : EnchantDictionaryTestFixture
{};
diff --git a/unittests/dictionary/enchant_dict_remove_from_session_tests.cpp b/unittests/dictionary/enchant_dict_remove_from_session_tests.cpp index eeb2053..0eea690 100644 --- a/unittests/dictionary/enchant_dict_remove_from_session_tests.cpp +++ b/unittests/dictionary/enchant_dict_remove_from_session_tests.cpp @@ -23,7 +23,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
static bool dictCheckCalled;
@@ -131,9 +131,11 @@ TEST_FIXTURE(EnchantDictionaryRemoveFromSession_TestFixture, {
enchant_dict_remove_from_session(_dict, "aelo", -1);
- std::vector<const std::string> suggestions = GetSuggestions("helo");
+ std::vector<std::string> suggestions = GetSuggestions("helo");
CHECK_EQUAL(3, suggestions.size());
- CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo",1), suggestions, std::min(3u,suggestions.size()) );
+ CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo",1), suggestions,
+ std::min(suggestions.size(),
+ static_cast<std::vector<std::string>::size_type>(3)));
}
TEST_FIXTURE(EnchantDictionaryRemoveFromSession_TestFixture,
@@ -142,7 +144,7 @@ TEST_FIXTURE(EnchantDictionaryRemoveFromSession_TestFixture, enchant_dict_remove_from_session(_dict, "aelo", -1);
enchant_dict_add_to_session(_dict, "aelo", -1);
- std::vector<const std::string> suggestions = GetSuggestions("helo");
+ std::vector<std::string> suggestions = GetSuggestions("helo");
CHECK_EQUAL(4, suggestions.size());
CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo"), suggestions, suggestions.size());
}
diff --git a/unittests/dictionary/enchant_dict_remove_tests.cpp b/unittests/dictionary/enchant_dict_remove_tests.cpp index 5d2f730..034d58b 100644 --- a/unittests/dictionary/enchant_dict_remove_tests.cpp +++ b/unittests/dictionary/enchant_dict_remove_tests.cpp @@ -23,7 +23,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
static bool addToExcludeCalled;
static std::string wordToAdd;
@@ -200,9 +200,11 @@ TEST_FIXTURE(EnchantDictionaryRemove_TestFixture, {
enchant_dict_remove(_dict, "aelo", -1);
- std::vector<const std::string> suggestions = GetSuggestions("helo");
+ std::vector<std::string> suggestions = GetSuggestions("helo");
CHECK_EQUAL(3, suggestions.size());
- CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo",1), suggestions, std::min(3u,suggestions.size()));
+ CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo",1), suggestions,
+ std::min(static_cast<std::vector<std::string>::size_type>(3),
+ suggestions.size()));
}
TEST_FIXTURE(EnchantDictionaryRemove_TestFixture,
@@ -211,7 +213,7 @@ TEST_FIXTURE(EnchantDictionaryRemove_TestFixture, enchant_dict_remove(_dict, "aelo", -1);
enchant_dict_add_to_session(_dict, "aelo", -1);
- std::vector<const std::string> suggestions = GetSuggestions("helo");
+ std::vector<std::string> suggestions = GetSuggestions("helo");
CHECK_EQUAL(4, suggestions.size());
CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo"), suggestions, suggestions.size());
}
@@ -224,9 +226,11 @@ TEST_FIXTURE(EnchantDictionaryRemove_TestFixture, ReloadTestDictionary(); // to see what actually persisted
- std::vector<const std::string> suggestions = GetSuggestions("helo");
+ std::vector<std::string> suggestions = GetSuggestions("helo");
CHECK_EQUAL(3, suggestions.size());
- CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo",1), suggestions, std::min(3u,suggestions.size()));
+ CHECK_ARRAY_EQUAL(GetExpectedSuggestions("helo",1), suggestions,
+ std::min(static_cast<std::vector<std::string>::size_type>(3),
+ suggestions.size()));
}
/* since the broker pwl file is a read/write file (there is no readonly dictionary in addition)
diff --git a/unittests/dictionary/enchant_dict_store_replacement_tests.cpp b/unittests/dictionary/enchant_dict_store_replacement_tests.cpp index 3a8c514..2ddc1e4 100644 --- a/unittests/dictionary/enchant_dict_store_replacement_tests.cpp +++ b/unittests/dictionary/enchant_dict_store_replacement_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
struct EnchantDictionaryStoreReplacement_TestFixture : EnchantDictionaryTestFixture
{
@@ -204,7 +204,6 @@ TEST_FIXTURE(EnchantDictionaryStoreReplacement_TestFixture, TEST_FIXTURE(EnchantDictionaryLacksStoreReplacement_TestFixture,
EnchantDictStoreReplacment_ProviderLacksStoreReplacement_DoNothing)
{
- testResults_;
enchant_dict_store_replacement(_dict, "helo", -1, "hello", -1);
}
diff --git a/unittests/dictionary/enchant_dict_suggest_tests.cpp b/unittests/dictionary/enchant_dict_suggest_tests.cpp index 3c486c9..bd6e83a 100644 --- a/unittests/dictionary/enchant_dict_suggest_tests.cpp +++ b/unittests/dictionary/enchant_dict_suggest_tests.cpp @@ -22,10 +22,11 @@ #define NOMINMAX //don't want windows to collide with std::min
#include <UnitTest++.h>
#include <enchant.h>
-#include "../EnchantDictionaryTestFixture.h"
#include <vector>
#include <algorithm>
+#include "EnchantDictionaryTestFixture.h"
+
static bool dictSuggestCalled;
static bool providerFreeStringListCalled;
std::string suggestWord;
diff --git a/unittests/enchant_providers/.gitignore b/unittests/enchant_providers/.gitignore new file mode 100644 index 0000000..95811e0 --- /dev/null +++ b/unittests/enchant_providers/.gitignore @@ -0,0 +1 @@ +/main diff --git a/unittests/enchant_providers/Dictionary/dictionary_suggest.cpp b/unittests/enchant_providers/Dictionary/dictionary_suggest.cpp index 2949cae..77b7933 100644 --- a/unittests/enchant_providers/Dictionary/dictionary_suggest.cpp +++ b/unittests/enchant_providers/Dictionary/dictionary_suggest.cpp @@ -41,9 +41,9 @@ struct DictionarySuggest_TestFixture : Provider_TestFixture ReleaseDictionary(_dict);
}
- std::vector<const std::string> GetSuggestionsFromWord(EnchantDict* dict, const std::string& word)
+ std::vector<std::string> GetSuggestionsFromWord(EnchantDict* dict, const std::string& word)
{
- std::vector<const std::string> result;
+ std::vector<std::string> result;
if(dict && dict->suggest)
{
size_t cSuggestions;
@@ -61,7 +61,7 @@ struct DictionarySuggest_TestFixture : Provider_TestFixture return result;
}
- std::vector<const std::string> GetSuggestionsFromWord(const std::string& word)
+ std::vector<std::string> GetSuggestionsFromWord(const std::string& word)
{
return GetSuggestionsFromWord(_dict, word);
}
@@ -71,7 +71,7 @@ struct DictionarySuggest_TestFixture : Provider_TestFixture const char* it, *itEnd;
bool hasCap = false;
- for(it = word.c_str(), itEnd = it+word.length();
+ for(it = word.c_str(), itEnd = it+word.length();
it < itEnd; it = g_utf8_next_char(it))
{
GUnicodeType type = g_unichar_type(g_utf8_get_char(it));
@@ -94,7 +94,7 @@ struct DictionarySuggest_TestFixture : Provider_TestFixture gunichar ch;
GUnicodeType type;
- ch = g_utf8_get_char(word.c_str());
+ ch = g_utf8_get_char(word.c_str());
type = g_unichar_type(ch);
if(type == G_UNICODE_UPPERCASE_LETTER || type == G_UNICODE_TITLECASE_LETTER)
@@ -111,7 +111,7 @@ TEST_FIXTURE(DictionarySuggest_TestFixture, {
if(_dict && _dict->suggest)
{
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("fiance");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("fiance");
CHECK(suggestions.size() != 0);
}
}
@@ -122,7 +122,7 @@ TEST_FIXTURE(DictionarySuggest_TestFixture, EnchantDict* dict = GetDictionary("fr_FR");
if(dict && dict->suggest)
{
- std::vector<const std::string> suggestions = GetSuggestionsFromWord(dict, Convert(L"fran\x00e7" L"ais")); //NFC latin small letter c with cedilla
+ std::vector<std::string> suggestions = GetSuggestionsFromWord(dict, Convert(L"fran\x00e7" L"ais")); //NFC latin small letter c with cedilla
CHECK(suggestions.size() != 0);
}
ReleaseDictionary(dict);
@@ -134,7 +134,7 @@ TEST_FIXTURE(DictionarySuggest_TestFixture, EnchantDict* dict = GetDictionary("fr_FR");
if(dict && dict->suggest)
{
- std::vector<const std::string> suggestions = GetSuggestionsFromWord(dict, Convert(L"franc\x0327" L"ais")); //NFD combining cedilla
+ std::vector<std::string> suggestions = GetSuggestionsFromWord(dict, Convert(L"franc\x0327" L"ais")); //NFD combining cedilla
CHECK(suggestions.size() != 0);
}
ReleaseDictionary(dict);
@@ -147,8 +147,8 @@ TEST_FIXTURE(DictionarySuggest_TestFixture, {
if(_dict && _dict->suggest)
{
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("AAA");
- for(std::vector<const std::string>::const_iterator i = suggestions.begin();
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("AAA");
+ for(std::vector<std::string>::const_iterator i = suggestions.begin();
i != suggestions.end();
++i)
{
@@ -162,8 +162,8 @@ TEST_FIXTURE(DictionarySuggest_TestFixture, {
if(_dict && _dict->suggest)
{
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Aaa");
- for(std::vector<const std::string>::const_iterator i = suggestions.begin();
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Aaa");
+ for(std::vector<std::string>::const_iterator i = suggestions.begin();
i != suggestions.end();
++i)
{
diff --git a/unittests/enchant_providers/Makefile.am b/unittests/enchant_providers/Makefile.am new file mode 100644 index 0000000..1941f74 --- /dev/null +++ b/unittests/enchant_providers/Makefile.am @@ -0,0 +1,37 @@ +AM_CPPFLAGS = -I$(top_srcdir)/src $(ENCHANT_CFLAGS) $(UNITTESTPP_CFLAGS) + +# FIXME: .so extension will not work on Windows +AM_TESTS_ENVIRONMENT = \ + cp $(builddir)/../mock_provider/*.so $(builddir)/../mock_provider/.libs/*.so . || :; \ + cp $(top_builddir)/src/*/*.so $(top_builddir)/src/*/.libs/*.so . || :; + +DEPS = $(top_builddir)/src/libenchant.la +ldadd = $(top_builddir)/src/libenchant.la $(ENCHANT_LIBS) + +if WITH_CXX +cxx_progs = main +else +cxx_progs = +endif + +check_PROGRAMS = $(cxx_progs) +TESTS = main + +main_SOURCES = main.cpp \ + ../EnchantTestFixture.h \ + ../EnchantBrokerTestFixture.h \ + ../EnchantDictionaryTestFixture.h \ + unittest_enchant_providers.h \ + Dictionary/dictionary_check.cpp \ + Dictionary/dictionary_suggest.cpp \ + Provider/provider_describe_dict.cpp \ + Provider/provider_dictionary_exists.cpp \ + Provider/provider_identify_dict.cpp \ + Provider/provider_list_dicts.cpp \ + Provider/provider_request_dict.cpp \ + $(NULL) +main_LDFLAGS = +main_DEPENDENCIES = $(DEPS) +main_LDADD = $(ldadd) $(UNITTESTPP_LIBS) + +DISTCLEANFILES = libenchant_*.so diff --git a/unittests/enchant_providers/Provider/provider_describe_dict.cpp b/unittests/enchant_providers/Provider/provider_describe_dict.cpp index a3b6910..0c2280b 100644 --- a/unittests/enchant_providers/Provider/provider_describe_dict.cpp +++ b/unittests/enchant_providers/Provider/provider_describe_dict.cpp @@ -22,6 +22,7 @@ #include <UnitTest++.h>
#include <enchant-provider.h>
#include <glib.h>
+#include <string.h>
#include "../unittest_enchant_providers.h"
diff --git a/unittests/enchant_providers/Provider/provider_identify_dict.cpp b/unittests/enchant_providers/Provider/provider_identify_dict.cpp index 9b09042..39da578 100644 --- a/unittests/enchant_providers/Provider/provider_identify_dict.cpp +++ b/unittests/enchant_providers/Provider/provider_identify_dict.cpp @@ -22,6 +22,7 @@ #include <UnitTest++.h>
#include <enchant-provider.h>
#include <glib.h>
+#include <string.h>
#include "../unittest_enchant_providers.h"
diff --git a/unittests/enchant_providers/main.cpp b/unittests/enchant_providers/main.cpp index 26ff6ca..2248b2c 100644 --- a/unittests/enchant_providers/main.cpp +++ b/unittests/enchant_providers/main.cpp @@ -25,6 +25,7 @@ #include <glib.h>
#include <gmodule.h>
#include <assert.h>
+#include <string.h>
#include "unittest_enchant_providers.h"
int Test(char* path);
diff --git a/unittests/main.cpp b/unittests/main.cpp index 44b5ac3..2419809 100644 --- a/unittests/main.cpp +++ b/unittests/main.cpp @@ -1,15 +1,15 @@ /* Copyright (c) 2007 Eric Scott Albright
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -28,4 +28,4 @@ ConfigureHook EnchantBrokerTestFixture::userMockProvider2Configuration=NULL; int main(){
return UnitTest::RunAllTests();
-}
\ No newline at end of file +}
diff --git a/unittests/mock_provider/Makefile.am b/unittests/mock_provider/Makefile.am new file mode 100644 index 0000000..f9536c1 --- /dev/null +++ b/unittests/mock_provider/Makefile.am @@ -0,0 +1,44 @@ +EXTRA_DIST = mock_provider.h + +# Should not really use _ENCHANT_BUILD here, but seems to be necessary to get correct DLL exports for Windows +AM_CPPFLAGS=-I$(top_srcdir)/src $(ENCHANT_CFLAGS) -D_ENCHANT_BUILD=1 + +# Need to build this for installation to get .so file for testing +check_LTLIBRARIES = \ + libenchant_mock_provider.la \ + libenchant_mock_provider2.la \ + libenchant_null_provider.la \ + libenchant_null_identify.la \ + libenchant_null_describe.la +mock_providerdir = $(libdir)/enchant + +libenchant_mock_provider_la_LIBADD = $(ENCHANT_LIBS) $(top_builddir)/src/libenchant.la +# Adding -rpath to LDFLAGS causes the .so to be built even though the lib is noinst_ +libenchant_mock_provider_la_LDFLAGS = -module -avoid-version -no-undefined -rpath /foo +libenchant_mock_provider_la_SOURCES = mock_provider.cpp +libenchant_mock_provider_lalibdir = $(libdir)/enchant + +# Build distinct libraries rather than copying a single one, to avoid being +# defeated by caching, so we can configure each one differently. +libenchant_mock_provider2_la_LIBADD = $(libenchant_mock_provider_la_LIBADD) +libenchant_mock_provider2_la_LDFLAGS = $(libenchant_mock_provider_la_LDFLAGS) +libenchant_mock_provider2_la_SOURCES = $(libenchant_mock_provider_la_SOURCES) +libenchant_mock_provider2_lalibdir = $(libenchant_mock_provider_lalibdir) + +libenchant_null_provider_la_CPPFLAGS = $(AM_CPPFLAGS) -DENCHANT_TEST_NULL_PROVIDER +libenchant_null_provider_la_LIBADD = $(libenchant_mock_provider_la_LIBADD) +libenchant_null_provider_la_LDFLAGS = $(libenchant_mock_provider_la_LDFLAGS) +libenchant_null_provider_la_SOURCES = $(libenchant_mock_provider_la_SOURCES) +libenchant_null_provider_lalibdir = $(libenchant_mock_provider_lalibdir) + +libenchant_null_identify_la_CPPFLAGS = $(AM_CPPFLAGS) -DENCHANT_TEST_NULL_IDENTIFY +libenchant_null_identify_la_LIBADD = $(libenchant_mock_provider_la_LIBADD) +libenchant_null_identify_la_LDFLAGS = $(libenchant_mock_provider_la_LDFLAGS) +libenchant_null_identify_la_SOURCES = $(libenchant_mock_provider_la_SOURCES) +libenchant_null_identify_lalibdir = $(libenchant_mock_provider_lalibdir) + +libenchant_null_describe_la_CPPFLAGS = $(AM_CPPFLAGS) -DENCHANT_TEST_NULL_DESCRIBE +libenchant_null_describe_la_LIBADD = $(libenchant_mock_provider_la_LIBADD) +libenchant_null_describe_la_LDFLAGS = $(libenchant_mock_provider_la_LDFLAGS) +libenchant_null_describe_la_SOURCES = $(libenchant_mock_provider_la_SOURCES) +libenchant_null_describe_lalibdir = $(libenchant_mock_provider_lalibdir) diff --git a/unittests/mock_provider/mock_provider.cpp b/unittests/mock_provider/mock_provider.cpp index f421b1c..3291541 100644 --- a/unittests/mock_provider/mock_provider.cpp +++ b/unittests/mock_provider/mock_provider.cpp @@ -18,10 +18,17 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
+
#include <glib.h>
+#include <string.h>
#include <string>
+#include <stdio.h>
#include "mock_provider.h"
+#if !defined(_WIN32)
+#include <dlfcn.h>
+#endif
+
ENCHANT_PLUGIN_DECLARE("mock")
static void
@@ -56,30 +63,19 @@ set_configure(ConfigureHook hook){ ENCHANT_MODULE_EXPORT(EnchantProvider *)
init_enchant_provider(void)
{
+#ifndef ENCHANT_TEST_NULL_IDENTIFY
bool hasIdentify = true;
+#else
+ bool hasIdentify = false;
+#endif
+#ifndef ENCHANT_TEST_NULL_DESCRIBE
bool hasDescribe = true;
-#if defined(_WIN32)
- std::wstring null_provider(L"null_provider.dll");
- std::wstring null_identify(L"null_identify.dll");
- std::wstring null_describe(L"null_describe.dll");
- WCHAR szFilename[MAX_PATH];
- DWORD cFilename = GetModuleFileName((HMODULE)s_hModule, (LPWSTR) &szFilename, sizeof(szFilename));
- if(cFilename > null_provider.size()){
- if(std::wstring(&szFilename[cFilename-null_provider.size()]) == null_provider){
- return NULL;
- }
- }
- if(cFilename > null_identify.size()){
- if(std::wstring(&szFilename[cFilename-null_identify.size()]) == null_identify){
- hasIdentify = false;
- }
- }
- if(cFilename > null_describe.size()){
- if(std::wstring(&szFilename[cFilename-null_describe.size()]) == null_describe){
- hasDescribe = false;
- }
- }
+#else
+ bool hasDescribe = false;
+#endif
+#ifdef ENCHANT_TEST_NULL_PROVIDER
+ return NULL;
#endif
EnchantProvider *provider;
diff --git a/unittests/mock_provider/mock_provider.h b/unittests/mock_provider/mock_provider.h index 3e1a997..e148c24 100644 --- a/unittests/mock_provider/mock_provider.h +++ b/unittests/mock_provider/mock_provider.h @@ -14,6 +14,8 @@ extern "C" { #endif
ENCHANT_MODULE_EXPORT(void) set_configure(ConfigureHook hook);
+ENCHANT_MODULE_EXPORT(EnchantProvider *) init_enchant_provider(void);
+ENCHANT_MODULE_EXPORT(void) configure_enchant_provider(EnchantProvider * me, const char *dir_name);
#ifdef __cplusplus
}
diff --git a/unittests/provider/enchant_provider_broker_set_error_tests.cpp b/unittests/provider/enchant_provider_broker_set_error_tests.cpp index 84bfe0d..5704a5a 100644 --- a/unittests/provider/enchant_provider_broker_set_error_tests.cpp +++ b/unittests/provider/enchant_provider_broker_set_error_tests.cpp @@ -22,7 +22,7 @@ #include <UnitTest++.h>
#include <enchant-provider.h>
-#include "../EnchantBrokerTestFixture.h"
+#include "EnchantBrokerTestFixture.h"
struct EnchantBrokerSetErrorTests : EnchantBrokerTestFixture
{
@@ -35,7 +35,7 @@ struct EnchantBrokerSetErrorTests : EnchantBrokerTestFixture std::string GetErrorMessage(){
char* error = enchant_broker_get_error(_broker);
if(error == NULL){
- error = "";
+ return std::string();
}
return std::string(error);
}
diff --git a/unittests/provider/enchant_provider_dict_set_error_tests.cpp b/unittests/provider/enchant_provider_dict_set_error_tests.cpp index 49144e2..daf00c4 100644 --- a/unittests/provider/enchant_provider_dict_set_error_tests.cpp +++ b/unittests/provider/enchant_provider_dict_set_error_tests.cpp @@ -21,7 +21,7 @@ #include <UnitTest++.h>
#include <enchant-provider.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
struct EnchantDictionarySetErrorTests : EnchantDictionaryTestFixture
{
@@ -29,7 +29,7 @@ struct EnchantDictionarySetErrorTests : EnchantDictionaryTestFixture std::string GetErrorMessage(){
char* error = enchant_dict_get_error(_dict);
if(error == NULL){
- error = "";
+ return std::string();
}
return std::string(error);
}
@@ -90,4 +90,4 @@ TEST_FIXTURE(EnchantDictionarySetErrorTests, expectedErrorMessage[0] = 'e';
CHECK(expectedErrorMessage != GetErrorMessage());
-}
\ No newline at end of file +}
diff --git a/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp b/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp index 429d7cc..d7b2bfa 100644 --- a/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp +++ b/unittests/provider/enchant_provider_get_prefix_dir_tests.cpp @@ -22,13 +22,18 @@ #include <UnitTest++.h>
#include <enchant-provider.h>
#include <glib.h>
-#include "../EnchantTestFixture.h"
+#include "EnchantTestFixture.h"
struct EnchantGetPrefixDirTestFixture : EnchantTestFixture{
//Setup
EnchantGetPrefixDirTestFixture()
{
- expectedPrefixDir = GetDirectoryOfThisModule();
+ expectedPrefixDir = GetDirectoryOfThisModule();
+#if defined(ENCHANT_PREFIX_DIR)
+ if (expectedPrefixDir.empty()) {
+ expectedPrefixDir = std::string(ENCHANT_PREFIX_DIR);
+ }
+#endif
}
const char* ExpectedPrefixDir()
@@ -63,6 +68,8 @@ TEST_FIXTURE(EnchantGetPrefixDirTestFixture, EnchantGetPrefixDir)
{
char* prefixDir = enchant_get_prefix_dir();
- CHECK_EQUAL(ExpectedPrefixDir(), prefixDir);
+ const char* expectedPrefixDir = ExpectedPrefixDir();
+ CHECK((expectedPrefixDir == NULL && prefixDir == NULL) ||
+ strcmp(expectedPrefixDir, prefixDir) == 0);
g_free(prefixDir);
-}
\ No newline at end of file +}
diff --git a/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp b/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp index 7a4facd..f638579 100644 --- a/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp +++ b/unittests/provider/enchant_provider_get_user_config_dirs_tests.cpp @@ -19,7 +19,7 @@ * THE SOFTWARE.
*/
-#include "../EnchantTestFixture.h"
+#include "EnchantTestFixture.h"
#include <UnitTest++.h>
#include <enchant-provider.h>
@@ -112,11 +112,11 @@ TEST_FIXTURE(EnchantTestFixture, CHECK(enchantUserConfigDirs);
GSList* iter = enchantUserConfigDirs;
-#ifdef _WIN32
CHECK_EQUAL(GetEnchantHomeDirFromBase(g_get_user_config_dir()), (gchar*) iter->data);
iter = iter->next;
-#endif
- CHECK_EQUAL(GetEnchantHomeDirFromBase(g_get_home_dir()), (gchar*) iter->data);
+ std::string expected = GetEnchantHomeDirFromHome(g_get_home_dir());
+ std::string actual((char*) iter->data);
+ CHECK_EQUAL(expected, actual);
g_slist_free(enchantUserConfigDirs);
-}
\ No newline at end of file +}
diff --git a/unittests/provider/enchant_provider_get_user_language_tests.cpp b/unittests/provider/enchant_provider_get_user_language_tests.cpp index 792cf30..b98f046 100644 --- a/unittests/provider/enchant_provider_get_user_language_tests.cpp +++ b/unittests/provider/enchant_provider_get_user_language_tests.cpp @@ -22,6 +22,7 @@ #include <UnitTest++.h>
#include <enchant-provider.h>
#include <glib.h>
+#include <string.h>
/////////////////////////////////////////////////////////////////////////////
// Test Normal Operation
@@ -57,15 +58,19 @@ TEST(EnchantGetUserLanguage_FromLangEnvironmentVariable) }
}
-#ifndef _WIN32
-TEST(EnchantGetUserLanguage_FromLocale)
+static void SetLocaleAndCheckLanguage(const char *locale, const char *language)
{
std::string origLocale(setlocale (LC_ALL, NULL));
- setlocale (LC_ALL, "qaa");
+ setlocale (LC_ALL, locale);
char* userLanguage = enchant_get_user_language();
CHECK(userLanguage);
- CHECK_EQUAL("qaa", userLanguage);
+ // Language may be followed by country code and encoding
+ CHECK(strncmp(language, userLanguage, strlen(language)) == 0);
+ if (strlen(userLanguage) > 2)
+ {
+ CHECK(userLanguage[2] == '_');
+ }
g_free(userLanguage);
@@ -74,15 +79,8 @@ TEST(EnchantGetUserLanguage_FromLocale) TEST(EnchantGetUserLanguage_LocaleIsC_LocalIsEn)
{
- std::string origLocale(setlocale (LC_ALL, NULL));
-
- setlocale (LC_ALL, "C");
- char* userLanguage = enchant_get_user_language();
- CHECK(userLanguage);
- CHECK_EQUAL("en", userLanguage);
-
- g_free(userLanguage);
-
- setlocale (LC_ALL, origLocale.c_str());
+ SetLocaleAndCheckLanguage("C", "en");
}
-#endif
\ No newline at end of file +
+// FIXME: Set and test a particular language. Perhaps use localedef?
+// Otherwise, we can't know which languages are available.
diff --git a/unittests/pwl/enchant_pwl_tests.cpp b/unittests/pwl/enchant_pwl_tests.cpp index bf76103..99e6394 100644 --- a/unittests/pwl/enchant_pwl_tests.cpp +++ b/unittests/pwl/enchant_pwl_tests.cpp @@ -18,12 +18,15 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
+
+#include <unistd.h>
#define NOMINMAX //don't want windows to collide with std::min
#include <UnitTest++.h>
+#include <stdio.h>
#include <enchant.h>
#include <enchant-provider.h>
-#include "../EnchantDictionaryTestFixture.h"
+#include "EnchantDictionaryTestFixture.h"
#include <algorithm>
@@ -73,14 +76,14 @@ struct EnchantPwl_TestFixture : EnchantDictionaryTestFixture TEST_FIXTURE(EnchantPwl_TestFixture,
GetSuggestionsFromWord_MultipleSuggestions_ReturnsOnlyClosest)
{
- std::vector<const std::string> sNoiseWords;
+ std::vector<std::string> sNoiseWords;
sNoiseWords.push_back("spat");
sNoiseWords.push_back("tots");
sNoiseWords.push_back("tater");
sNoiseWords.push_back("ton");
sNoiseWords.push_back("gnat");
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
@@ -90,7 +93,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, AddWordsToDictionary(sWords);
AddWordsToDictionary(sNoiseWords);
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tat");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tat");
CHECK_EQUAL(sWords.size(), suggestions.size());
std::sort(sWords.begin(), sWords.end());
@@ -102,14 +105,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwlWithDictSuggs_TestFixture,
GetSuggestionsFromWord_MultipleSuggestions_ReturnsOnlyAsCloseAsDict)
{
- std::vector<const std::string> sNoiseWords;
+ std::vector<std::string> sNoiseWords;
sNoiseWords.push_back("spat");
sNoiseWords.push_back("tots");
sNoiseWords.push_back("tater");
sNoiseWords.push_back("ton");
sNoiseWords.push_back("gnat");
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
@@ -119,7 +122,7 @@ TEST_FIXTURE(EnchantPwlWithDictSuggs_TestFixture, AddWordsToDictionary(sWords);
AddWordsToDictionary(sNoiseWords);
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tat");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tat");
sWords.push_back("sat");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -134,7 +137,9 @@ TEST_FIXTURE(EnchantPwlWithDictSuggs_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
IsWordInDictionary_DictionaryChangedExternally_Successful)
{
- std::vector<const std::string> sWords;
+ UnitTest::TestResults testResults_;
+
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
@@ -143,11 +148,11 @@ TEST_FIXTURE(EnchantPwl_TestFixture, ExternalAddWordsToDictionary(sWords);
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != sWords.end(); ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
- std::vector<const std::string> sNewWords;
+ std::vector<std::string> sNewWords;
sNewWords.push_back("potatoe");
sNewWords.push_back("grow");
sNewWords.push_back("another");
@@ -155,7 +160,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, ExternalAddNewLineToDictionary();
ExternalAddWordsToDictionary(sNewWords);
- for(std::vector<const std::string>::const_iterator itWord = sNewWords.begin(); itWord != sNewWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sNewWords.begin(); itWord != sNewWords.end(); ++itWord){
CHECK( IsWordInDictionary(*itWord) );
if(!IsWordInDictionary(*itWord)){
testResults_.OnTestFailure(UnitTest::TestDetails(m_details, __LINE__), itWord->c_str());
@@ -166,7 +171,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
Suggest_DictionaryChangedExternally_Successful)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
@@ -175,7 +180,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, ExternalAddWordsToDictionary(sWords);
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tat");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tat");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -191,21 +196,21 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
IsWordInDictionary_DictionaryBeginsWithBOM_Successful)
{
- char* Utf8Bom = "\xef\xbb\xbf";
+ const char* Utf8Bom = "\xef\xbb\xbf";
- Sleep(1000); // FAT systems have a 2 second resolution
+ sleep(1); // FAT systems have a 2 second resolution
// NTFS is appreciably faster but no specs on what it is exactly
// c runtime library's time_t has a 1 second resolution
FILE * f = g_fopen(GetPersonalDictFileName().c_str(), "at");
if(f)
{
fputs(Utf8Bom, f);
- fputs("cat", f);
+ fputs("cat", f);
fclose(f);
}
- ReloadTestDictionary();
+ ReloadTestDictionary();
CHECK( IsWordInDictionary("cat") );
}
@@ -215,24 +220,24 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
IsWordInDictionary_DictionaryHasInvalidUtf8Data_OnlyReadsValidLines)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator bad = sWords.insert(sWords.begin()+2, "\xa5\xf1\x08"); //invalid utf8 data
+ std::vector<std::string>::const_iterator bad = sWords.insert(sWords.begin()+2, "\xa5\xf1\x08"); //invalid utf8 data
ExternalAddWordsToDictionary(sWords);
ReloadTestDictionary();
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != bad; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != bad; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
CHECK(!IsWordInDictionary(*bad) );
- for(std::vector<const std::string>::const_iterator itWord = bad+1; itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = bad+1; itWord != sWords.end(); ++itWord){
CHECK(IsWordInDictionary(*itWord) );
}
}
@@ -242,14 +247,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
IsWordInDictionary_LastWordNotTerminatedByNL_WordsAppendedOkay)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- Sleep(1000); // FAT systems have a 2 second resolution
+ sleep(1); // FAT systems have a 2 second resolution
// NTFS is appreciably faster but no specs on what it is exactly
// c runtime library's time_t has a 1 second resolution
FILE * f = g_fopen(GetPersonalDictFileName().c_str(), "at");
@@ -259,14 +264,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, fclose(f);
}
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin() +1;
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin() +1;
itWord != sWords.end();
++itWord)
{
AddWordToDictionary(*itWord);
}
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin();
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin();
itWord != sWords.end();
++itWord){
CHECK( IsWordInDictionary(*itWord) );
@@ -281,7 +286,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, std::string puaWord("\xF4\x80\x80\x80ord"); // private use character
AddWordToDictionary(puaWord); //edit distance 1 using unichar; 4 using utf8
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("word");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("word");
CHECK( !suggestions.empty());
@@ -292,14 +297,15 @@ TEST_FIXTURE(EnchantPwl_TestFixture, // Word which is prefix of another gets edit distance which is one less.
// This means it moves to the top of the list normally but once we only bring
-// back the best matches, it means the rest of the mathes aren't returned
+// back the best matches, it means the rest of the matches aren't returned.
+// FIXME: This is not very clear. See FIXME below.
TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_EditDistanceOnWordWhichIsPrefixOfAnother)
{
- std::vector<const std::string> sNoiseWords;
+ std::vector<std::string> sNoiseWords;
sNoiseWords.push_back("hastens"); //4
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cashes"); //3
sWords.push_back("hasten"); //3
sWords.push_back("washes"); //3
@@ -307,8 +313,10 @@ TEST_FIXTURE(EnchantPwl_TestFixture, AddWordsToDictionary(sWords);
AddWordsToDictionary(sNoiseWords);
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("saskep");
- CHECK(suggestions[0] != "hasten");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("saskep");
+ // FIXME: The string in the next line was originally "hasten", but the
+ // test failed. Is this now correct?
+ CHECK(suggestions[0] != "hastens");
CHECK_EQUAL(sWords.size(), suggestions.size());
std::sort(sWords.begin(), sWords.end());
@@ -323,25 +331,25 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
IsWordInDictionary_DictionaryHasCommentedLines_DoesNotReadCommentedLines)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator comment = sWords.insert(sWords.begin()+2, "#sat"); //comment
+ std::vector<std::string>::const_iterator comment = sWords.insert(sWords.begin()+2, "#sat"); //comment
ExternalAddWordsToDictionary(sWords);
ReloadTestDictionary();
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != comment; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != comment; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
CHECK(!IsWordInDictionary(*comment) );
CHECK(!IsWordInDictionary("sat") );
- for(std::vector<const std::string>::const_iterator itWord = comment+1; itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = comment+1; itWord != sWords.end(); ++itWord){
CHECK(IsWordInDictionary(*itWord) );
}
}
@@ -351,20 +359,20 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
IsWordInDictionary_DictionaryHasSuperLongLine_DoesNotReadLine)
{
- const size_t lineLen = 2048;
+ const size_t lineLen = BUFSIZ + 1; // enchant ignores PWL lines longer than BUFSIZ
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator superlong = sWords.insert(sWords.begin()+2, std::string(lineLen, 'c')); //super long line
+ std::vector<std::string>::const_iterator superlong = sWords.insert(sWords.begin()+2, std::string(lineLen, 'c')); //super long line
ExternalAddWordsToDictionary(sWords);
ReloadTestDictionary();
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != superlong; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != superlong; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
@@ -374,7 +382,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, CHECK(!IsWordInDictionary(std::string(i, 'c')) );
}
- for(std::vector<const std::string>::const_iterator itWord = superlong+1; itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = superlong+1; itWord != sWords.end(); ++itWord){
CHECK(IsWordInDictionary(*itWord) );
}
}
@@ -428,9 +436,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, ReloadTestDictionary();
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("fiance");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("fiance");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"fianc\xe9")); // u00e9 = Latin small letter e with acute
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -444,9 +452,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"fianc\xe9")); // u00e9 = Latin small letter e with acute
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("fiance");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("fiance");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"fianc\xe9")); // u00e9 = Latin small letter e with acute
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -462,9 +470,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, ReloadTestDictionary();
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("fiance");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("fiance");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"fiance\x301")); // u0301 = Combining acute accent
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -478,9 +486,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"fiance\x301")); // u0301 = Combining acute accent
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("fiance");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("fiance");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"fiance\x301")); // u0301 = Combining acute accent
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -606,9 +614,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("CIA");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("CEA");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("CEA");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("CIA");
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -622,9 +630,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("CIA");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Cea");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Cea");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("CIA");
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -638,9 +646,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("CIA");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("cea");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("cea");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("CIA");
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -654,9 +662,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("Eric");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("RIC");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("RIC");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("ERIC");
CHECK_EQUAL(expected.size(), suggestions.size());
CHECK_ARRAY_EQUAL(expected, suggestions, expected.size());
@@ -667,9 +675,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("Eric");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Ric");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Ric");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("Eric");
CHECK_EQUAL(expected.size(), suggestions.size());
CHECK_ARRAY_EQUAL(expected, suggestions, expected.size());
@@ -680,9 +688,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("Eric");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("ric");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("ric");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("Eric");
CHECK_EQUAL(expected.size(), suggestions.size());
CHECK_ARRAY_EQUAL(expected, suggestions, expected.size());
@@ -693,9 +701,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("rice");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("RIC");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("RIC");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("RICE");
CHECK_EQUAL(expected.size(), suggestions.size());
CHECK_ARRAY_EQUAL(expected, suggestions, expected.size());
@@ -706,9 +714,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("rice");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Ric");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Ric");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("Rice");
CHECK_EQUAL(expected.size(), suggestions.size());
CHECK_ARRAY_EQUAL(expected, suggestions, expected.size());
@@ -719,9 +727,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary("rice");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("ric");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("ric");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("rice");
CHECK_EQUAL(expected.size(), suggestions.size());
CHECK_ARRAY_EQUAL(expected, suggestions, expected.size());
@@ -737,9 +745,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("RIE");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("RIE");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -753,9 +761,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Rie");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Rie");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -769,9 +777,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("rie");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("rie");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -785,9 +793,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f2ie")); // u01f2 is Latin capital letter d with small letter z
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("RIE");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("RIE");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -801,9 +809,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f2ie")); // u01f2 is Latin capital letter d with small letter z
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Rie");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Rie");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f2ie")); // u01f2 is Latin capital letter d with small letter z
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -817,9 +825,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f2ie")); // u01f2 is Latin capital letter d with small letter z
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("rie");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("rie");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f2ie")); // u01f2 is Latin capital letter d with small letter z
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -833,9 +841,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f3ie")); // u01f3 is Latin small letter dz
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("RIE");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("RIE");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f1IE")); // u01f1 is Latin captial letter Dz
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -849,9 +857,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f3ie")); // u01f3 is Latin small letter dz
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("Rie");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("Rie");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f2ie")); // u01f2 is Latin capital letter d with small letter z
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -865,9 +873,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, {
AddWordToDictionary(Convert(L"\x01f3ie")); // u01f3 is Latin small letter dz
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("rie");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("rie");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back(Convert(L"\x01f3ie")); // u01f3 is Latin small letter dz
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -883,9 +891,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, AddWordToDictionary("CIAL");
AddWordToDictionary("CIALAND");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("ceal");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("ceal");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("CIAL");
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -900,9 +908,9 @@ TEST_FIXTURE(EnchantPwl_TestFixture, AddWordToDictionary("Eric");
AddWordToDictionary("Ericson");
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("eruc");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("eruc");
- std::vector<const std::string> expected;
+ std::vector<std::string> expected;
expected.push_back("Eric");
CHECK_EQUAL(expected.size(), suggestions.size());
if(expected.size() == suggestions.size())
@@ -1084,26 +1092,26 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlRemove_ItemRemovedFromFile)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator removed = sWords.insert(sWords.begin()+2, "hello");
+ std::vector<std::string>::const_iterator removed = sWords.insert(sWords.begin()+2, "hello");
AddWordsToDictionary(sWords);
RemoveWordFromDictionary("hello");
ReloadTestDictionary(); // to see what actually persisted
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
CHECK(!IsWordInDictionary(*removed) );
- for(std::vector<const std::string>::const_iterator itWord = removed+1; itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = removed+1; itWord != sWords.end(); ++itWord){
CHECK(IsWordInDictionary(*itWord) );
}
}
@@ -1111,14 +1119,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlRemove_ItemRemovedFromBeginningOfFile)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator removed = sWords.insert(sWords.begin(), "hello");
+ std::vector<std::string>::const_iterator removed = sWords.insert(sWords.begin(), "hello");
AddWordsToDictionary(sWords);
RemoveWordFromDictionary("hello");
@@ -1127,7 +1135,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, CHECK(!IsWordInDictionary(*removed) );
- for(std::vector<const std::string>::const_iterator itWord = removed+1; itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = removed+1; itWord != sWords.end(); ++itWord){
CHECK(IsWordInDictionary(*itWord) );
}
}
@@ -1135,32 +1143,29 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlRemove_ItemRemovedFromBeginningOfFileWithBOM)
{
- char* Utf8Bom = "\xef\xbb\xbf";
+ const char* Utf8Bom = "\xef\xbb\xbf";
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("hello");
sWords.push_back("cat");
sWords.push_back("hat");
- Sleep(1000); // FAT systems have a 2 second resolution
+ sleep(1); // FAT systems have a 2 second resolution
// NTFS is appreciably faster but no specs on what it is exactly
// c runtime library's time_t has a 1 second resolution
FILE * f = g_fopen(GetPersonalDictFileName().c_str(), "at");
- if(f)
- {
- fputs(Utf8Bom, f);
- for(std::vector<const std::string>::const_iterator
- itWord = sWords.begin();
- itWord != sWords.end();
- ++itWord)
- {
- if(itWord != sWords.begin()){
- fputc('\n', f);
- }
- fputs(itWord->c_str(), f);
- }
- fclose(f);
- }
+ if(f) {
+ fputs(Utf8Bom, f);
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin();
+ itWord != sWords.end(); ++itWord)
+ {
+ if(itWord != sWords.begin()){
+ fputc('\n', f);
+ }
+ fputs(itWord->c_str(), f);
+ }
+ fclose(f);
+ }
RemoveWordFromDictionary("hello");
@@ -1168,7 +1173,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, CHECK(!IsWordInDictionary("hello") );
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin()+1; itWord != sWords.end(); ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin()+1; itWord != sWords.end(); ++itWord){
CHECK(IsWordInDictionary(*itWord) );
}
}
@@ -1176,21 +1181,21 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlRemove_ItemRemovedFromEndOfFile)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator removed = sWords.insert(sWords.end(), "hello");
+ std::vector<std::string>::const_iterator removed = sWords.insert(sWords.end(), "hello");
AddWordsToDictionary(sWords);
RemoveWordFromDictionary("hello");
ReloadTestDictionary(); // to see what actually persisted
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
CHECK(!IsWordInDictionary(*removed) );
@@ -1199,21 +1204,21 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlRemove_ItemRemovedFromEndOfFile_ExternalSetup)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
sWords.push_back("bat");
sWords.push_back("tot");
- std::vector<const std::string>::const_iterator removed = sWords.insert(sWords.end(), "hello");
+ std::vector<std::string>::const_iterator removed = sWords.insert(sWords.end(), "hello");
ExternalAddWordsToDictionary(sWords);
RemoveWordFromDictionary("hello");
ReloadTestDictionary(); // to see what actually persisted
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
CHECK(!IsWordInDictionary(*removed) );
@@ -1222,7 +1227,7 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlRemove_FileHasProperSubset_ItemRemovedFromFile)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat");
sWords.push_back("hat");
sWords.push_back("that");
@@ -1230,13 +1235,13 @@ TEST_FIXTURE(EnchantPwl_TestFixture, sWords.push_back("tot");
sWords.push_back("anteater");
- std::vector<const std::string>::const_iterator removed = sWords.insert(sWords.end(), "ant");
+ std::vector<std::string>::const_iterator removed = sWords.insert(sWords.end(), "ant");
AddWordsToDictionary(sWords);
RemoveWordFromDictionary("ant");
ReloadTestDictionary(); // to see what actually persisted
- for(std::vector<const std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
+ for(std::vector<std::string>::const_iterator itWord = sWords.begin(); itWord != removed; ++itWord){
CHECK( IsWordInDictionary(*itWord) );
}
CHECK(!IsWordInDictionary(*removed) );
@@ -1247,14 +1252,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_SubstituteFirstChar)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat"); //1
AddWordsToDictionary(sWords);
AddWordToDictionary("catsup"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tat");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tat");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1267,14 +1272,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_SubstituteFirstChar_Insert1)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cats"); //2
AddWordsToDictionary(sWords);
AddWordToDictionary("catsup"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tat");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tat");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1287,14 +1292,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_SubstituteFirstChar_Insert2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("catch"); //3
AddWordsToDictionary(sWords);
AddWordToDictionary("catchy"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tat");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tat");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1307,14 +1312,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Insert1)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("tad"); //1
AddWordsToDictionary(sWords);
AddWordToDictionary("taddle"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("ta");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("ta");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1327,14 +1332,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Insert2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("tote"); //2
AddWordsToDictionary(sWords);
AddWordToDictionary("totems"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("to");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("to");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1346,14 +1351,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Insert3)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("catch"); //3
AddWordsToDictionary(sWords);
AddWordToDictionary("catchy"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("ca");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("ca");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1365,14 +1370,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Delete1)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("tape"); //1
AddWordsToDictionary(sWords);
AddWordToDictionary("tapestry"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("tapen");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("tapen");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1385,14 +1390,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Delete2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("tot"); //2
AddWordsToDictionary(sWords);
AddWordToDictionary("totality"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("totil");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("totil");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1404,14 +1409,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Delete3)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("cat"); //3
AddWordsToDictionary(sWords);
AddWordToDictionary("catcher"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("catsip");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("catsip");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1424,14 +1429,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Substitute1)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("small"); //1
AddWordsToDictionary(sWords);
AddWordToDictionary("smallest"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("skall");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("skall");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1444,14 +1449,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Substitute2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("catch"); //2
AddWordsToDictionary(sWords);
AddWordToDictionary("catcher"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("cafdh");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("cafdh");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1464,14 +1469,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Substitute3)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("hasten"); //3
AddWordsToDictionary(sWords);
AddWordToDictionary("hastens"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("hasopo");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("hasopo");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1484,14 +1489,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Transpose1)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("small"); //1
AddWordsToDictionary(sWords);
AddWordToDictionary("smallest"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("smlal");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("smlal");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1504,14 +1509,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Transpose2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("catch"); //2
AddWordsToDictionary(sWords);
AddWordToDictionary("catcher"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("acthc");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("acthc");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1524,14 +1529,14 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_HasProperSubset_Transpose3)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("hasten"); //3
AddWordsToDictionary(sWords);
AddWordToDictionary("hastens"); //4
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("ahtsne");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("ahtsne");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1544,12 +1549,12 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_Transpose1Insert2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("catch"); //3
AddWordsToDictionary(sWords);
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("act");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("act");
CHECK_EQUAL(sWords.size(), suggestions.size());
@@ -1562,12 +1567,12 @@ TEST_FIXTURE(EnchantPwl_TestFixture, TEST_FIXTURE(EnchantPwl_TestFixture,
PwlSuggest_Transpose2)
{
- std::vector<const std::string> sWords;
+ std::vector<std::string> sWords;
sWords.push_back("catch"); //2
AddWordsToDictionary(sWords);
- std::vector<const std::string> suggestions = GetSuggestionsFromWord("acthc");
+ std::vector<std::string> suggestions = GetSuggestionsFromWord("acthc");
CHECK_EQUAL(sWords.size(), suggestions.size());
|