xref: /aosp_15_r20/external/sandboxed-api/contrib/hunspell/test/hunspell_test.cc (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1*ec63e07aSXin Li // Copyright 2022 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li //     https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li 
15*ec63e07aSXin Li #include <fstream>
16*ec63e07aSXin Li 
17*ec63e07aSXin Li #include "../sandboxed.h"
18*ec63e07aSXin Li #include "sandboxed_api/util/path.h"
19*ec63e07aSXin Li #include "sandboxed_api/util/status_matchers.h"
20*ec63e07aSXin Li #include "sandboxed_api/util/temp_file.h"
21*ec63e07aSXin Li 
22*ec63e07aSXin Li namespace {
23*ec63e07aSXin Li 
24*ec63e07aSXin Li using ::sapi::IsOk;
25*ec63e07aSXin Li 
26*ec63e07aSXin Li class HunspellTest : public ::testing::Test {
27*ec63e07aSXin Li  protected:
28*ec63e07aSXin Li   static constexpr absl::string_view kEncoding = "UTF-8";
29*ec63e07aSXin Li   static constexpr absl::string_view kAffixFileName = "utf8.aff";
30*ec63e07aSXin Li   static constexpr absl::string_view kDictionaryFileName = "utf8.dic";
31*ec63e07aSXin Li 
32*ec63e07aSXin Li   static constexpr absl::string_view kGoodFileName = "utf8.good";
33*ec63e07aSXin Li   static constexpr absl::string_view kWrongFileName = "utf8.wrong";
34*ec63e07aSXin Li 
35*ec63e07aSXin Li   static constexpr absl::string_view kSuggestion = "fo";
36*ec63e07aSXin Li   static constexpr absl::string_view kRandomWord = "random_word123";
37*ec63e07aSXin Li 
SetUp()38*ec63e07aSXin Li   void SetUp() override {
39*ec63e07aSXin Li     test_files_dir_ = getenv("TEST_FILES_DIR");
40*ec63e07aSXin Li     ASSERT_NE(test_files_dir_, nullptr);
41*ec63e07aSXin Li 
42*ec63e07aSXin Li     std::string s_afn = GetTestFilePath(kAffixFileName);
43*ec63e07aSXin Li     std::string s_dfn = GetTestFilePath(kDictionaryFileName);
44*ec63e07aSXin Li     sapi::v::ConstCStr c_afn(s_afn.c_str());
45*ec63e07aSXin Li     sapi::v::ConstCStr c_dfn(s_dfn.c_str());
46*ec63e07aSXin Li 
47*ec63e07aSXin Li     sandbox_ = std::make_unique<HunspellSapiSandbox>(s_afn, s_dfn);
48*ec63e07aSXin Li     ASSERT_THAT(sandbox_->Init(), IsOk());
49*ec63e07aSXin Li 
50*ec63e07aSXin Li     api_ = std::make_unique<HunspellApi>(sandbox_.get());
51*ec63e07aSXin Li 
52*ec63e07aSXin Li     SAPI_ASSERT_OK_AND_ASSIGN(
53*ec63e07aSXin Li         Hunhandle * hunspell,
54*ec63e07aSXin Li         api_->Hunspell_create(c_afn.PtrBefore(), c_dfn.PtrBefore()));
55*ec63e07aSXin Li     hunspellrp_ = std::make_unique<sapi::v::RemotePtr>(hunspell);
56*ec63e07aSXin Li   }
57*ec63e07aSXin Li 
TearDown()58*ec63e07aSXin Li   void TearDown() override {
59*ec63e07aSXin Li     absl::Status status = api_->Hunspell_destroy(&(*hunspellrp_));
60*ec63e07aSXin Li     ASSERT_THAT(status, IsOk());
61*ec63e07aSXin Li   }
62*ec63e07aSXin Li 
GetTestFilePath(const absl::string_view & filename)63*ec63e07aSXin Li   std::string GetTestFilePath(const absl::string_view& filename) {
64*ec63e07aSXin Li     return sapi::file::JoinPath(test_files_dir_, filename);
65*ec63e07aSXin Li   }
66*ec63e07aSXin Li 
67*ec63e07aSXin Li   std::unique_ptr<HunspellSapiSandbox> sandbox_;
68*ec63e07aSXin Li   std::unique_ptr<HunspellApi> api_;
69*ec63e07aSXin Li   std::unique_ptr<sapi::v::RemotePtr> hunspellrp_;
70*ec63e07aSXin Li 
71*ec63e07aSXin Li  private:
72*ec63e07aSXin Li   const char* test_files_dir_;
73*ec63e07aSXin Li };
74*ec63e07aSXin Li 
TEST_F(HunspellTest,CheckEncoding)75*ec63e07aSXin Li TEST_F(HunspellTest, CheckEncoding) {
76*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(char* ret,
77*ec63e07aSXin Li                             api_->Hunspell_get_dic_encoding(&(*hunspellrp_)));
78*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
79*ec63e07aSXin Li       std::string encoding,
80*ec63e07aSXin Li       api_->GetSandbox()->GetCString(sapi::v::RemotePtr(ret)));
81*ec63e07aSXin Li   EXPECT_EQ(encoding, kEncoding);
82*ec63e07aSXin Li }
83*ec63e07aSXin Li 
TEST_F(HunspellTest,CheckGoodSpell)84*ec63e07aSXin Li TEST_F(HunspellTest, CheckGoodSpell) {
85*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(char* ret,
86*ec63e07aSXin Li                             api_->Hunspell_get_dic_encoding(&(*hunspellrp_)));
87*ec63e07aSXin Li   std::ifstream wtclst(GetTestFilePath(kGoodFileName), std::ios_base::in);
88*ec63e07aSXin Li   ASSERT_TRUE(wtclst.is_open());
89*ec63e07aSXin Li 
90*ec63e07aSXin Li   std::string buf;
91*ec63e07aSXin Li   while (std::getline(wtclst, buf)) {
92*ec63e07aSXin Li     sapi::v::ConstCStr cbuf(buf.c_str());
93*ec63e07aSXin Li     SAPI_ASSERT_OK_AND_ASSIGN(
94*ec63e07aSXin Li         int result, api_->Hunspell_spell(&(*hunspellrp_), cbuf.PtrBefore()));
95*ec63e07aSXin Li     ASSERT_EQ(result, 1);
96*ec63e07aSXin Li   }
97*ec63e07aSXin Li }
98*ec63e07aSXin Li 
TEST_F(HunspellTest,CheckWrongSpell)99*ec63e07aSXin Li TEST_F(HunspellTest, CheckWrongSpell) {
100*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(char* ret,
101*ec63e07aSXin Li                             api_->Hunspell_get_dic_encoding(&(*hunspellrp_)));
102*ec63e07aSXin Li   std::ifstream wtclst(GetTestFilePath(kWrongFileName), std::ios_base::in);
103*ec63e07aSXin Li   ASSERT_TRUE(wtclst.is_open());
104*ec63e07aSXin Li 
105*ec63e07aSXin Li   std::string buf;
106*ec63e07aSXin Li   while (std::getline(wtclst, buf)) {
107*ec63e07aSXin Li     sapi::v::ConstCStr cbuf(buf.c_str());
108*ec63e07aSXin Li     SAPI_ASSERT_OK_AND_ASSIGN(
109*ec63e07aSXin Li         int result, api_->Hunspell_spell(&(*hunspellrp_), cbuf.PtrBefore()));
110*ec63e07aSXin Li     ASSERT_EQ(result, 0);
111*ec63e07aSXin Li   }
112*ec63e07aSXin Li }
113*ec63e07aSXin Li 
TEST_F(HunspellTest,CheckAddToDict)114*ec63e07aSXin Li TEST_F(HunspellTest, CheckAddToDict) {
115*ec63e07aSXin Li   sapi::v::ConstCStr cbuf(kRandomWord.data());
116*ec63e07aSXin Li 
117*ec63e07aSXin Li   int result;
118*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
119*ec63e07aSXin Li       result, api_->Hunspell_spell(&(*hunspellrp_), cbuf.PtrBefore()));
120*ec63e07aSXin Li   ASSERT_EQ(result, 0);
121*ec63e07aSXin Li 
122*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
123*ec63e07aSXin Li       result, api_->Hunspell_add(&(*hunspellrp_), cbuf.PtrBefore()));
124*ec63e07aSXin Li   ASSERT_EQ(result, 0);
125*ec63e07aSXin Li 
126*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
127*ec63e07aSXin Li       result, api_->Hunspell_spell(&(*hunspellrp_), cbuf.PtrBefore()));
128*ec63e07aSXin Li   ASSERT_EQ(result, 1);
129*ec63e07aSXin Li 
130*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
131*ec63e07aSXin Li       result, api_->Hunspell_remove(&(*hunspellrp_), cbuf.PtrBefore()));
132*ec63e07aSXin Li   ASSERT_EQ(result, 0);
133*ec63e07aSXin Li 
134*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
135*ec63e07aSXin Li       result, api_->Hunspell_spell(&(*hunspellrp_), cbuf.PtrBefore()));
136*ec63e07aSXin Li   ASSERT_EQ(result, 0);
137*ec63e07aSXin Li }
138*ec63e07aSXin Li 
TEST_F(HunspellTest,CheckSuggestion)139*ec63e07aSXin Li TEST_F(HunspellTest, CheckSuggestion) {
140*ec63e07aSXin Li   sapi::v::ConstCStr cbuf(kSuggestion.data());
141*ec63e07aSXin Li 
142*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
143*ec63e07aSXin Li       int result, api_->Hunspell_spell(&(*hunspellrp_), cbuf.PtrBefore()));
144*ec63e07aSXin Li   ASSERT_EQ(result, 0);
145*ec63e07aSXin Li 
146*ec63e07aSXin Li   sapi::v::GenericPtr outptr;
147*ec63e07aSXin Li   SAPI_ASSERT_OK_AND_ASSIGN(
148*ec63e07aSXin Li       int nlist, api_->Hunspell_suggest(&(*hunspellrp_), outptr.PtrAfter(),
149*ec63e07aSXin Li                                         cbuf.PtrBefore()));
150*ec63e07aSXin Li   ASSERT_GT(nlist, 0);
151*ec63e07aSXin Li }
152*ec63e07aSXin Li 
153*ec63e07aSXin Li }  // namespace
154