290 | 290 |
}
|
291 | 291 |
}
|
292 | 292 |
|
293 | |
TEST_F(CandidateFilterTest, IsolatedWord) {
|
|
293 |
TEST_F(CandidateFilterTest, IsolatedWordOrGeneralSymbol) {
|
294 | 294 |
std::unique_ptr<CandidateFilter> filter(CreateCandidateFilter(true));
|
295 | 295 |
vector<const Node *> nodes;
|
296 | 296 |
Segment::Candidate *c = NewCandidate();
|
|
301 | 301 |
nodes.push_back(node);
|
302 | 302 |
node->prev = NewNode();
|
303 | 303 |
node->next = NewNode();
|
304 | |
node->lid = pos_matcher().GetIsolatedWordId();
|
305 | |
node->rid = pos_matcher().GetIsolatedWordId();
|
306 | 304 |
node->key = "abc";
|
307 | 305 |
node->value = "test";
|
308 | 306 |
|
309 | |
node->prev->node_type = Node::NOR_NODE;
|
310 | |
node->next->node_type = Node::EOS_NODE;
|
311 | |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
312 | |
EXPECT_EQ(CandidateFilter::BAD_CANDIDATE,
|
313 | |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
314 | |
// Clear the internal set |seen_| to prevent "abc" from being filtered by
|
315 | |
// "seen" rule.
|
316 | |
filter->Reset();
|
317 | |
}
|
318 | |
|
319 | |
node->prev->node_type = Node::BOS_NODE;
|
320 | |
node->next->node_type = Node::NOR_NODE;
|
321 | |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
322 | |
EXPECT_EQ(CandidateFilter::BAD_CANDIDATE,
|
323 | |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
324 | |
filter->Reset();
|
325 | |
}
|
326 | |
|
327 | |
node->prev->node_type = Node::NOR_NODE;
|
328 | |
node->next->node_type = Node::NOR_NODE;
|
329 | |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
330 | |
EXPECT_EQ(CandidateFilter::BAD_CANDIDATE,
|
331 | |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
332 | |
filter->Reset();
|
333 | |
}
|
334 | |
|
335 | |
node->prev->node_type = Node::BOS_NODE;
|
336 | |
node->next->node_type = Node::EOS_NODE;
|
337 | |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
338 | |
EXPECT_EQ(CandidateFilter::GOOD_CANDIDATE,
|
339 | |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
340 | |
filter->Reset();
|
341 | |
}
|
342 | |
|
343 | |
Node *backup_node = node->prev;
|
344 | |
node->prev = nullptr;
|
345 | |
node->next->node_type = Node::EOS_NODE;
|
346 | |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
347 | |
EXPECT_EQ(CandidateFilter::GOOD_CANDIDATE,
|
348 | |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
349 | |
filter->Reset();
|
350 | |
}
|
351 | |
node->prev = backup_node;
|
352 | |
|
353 | |
backup_node = node->next;
|
354 | |
node->prev->node_type = Node::BOS_NODE;
|
355 | |
node->next = nullptr;
|
356 | |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
357 | |
EXPECT_EQ(CandidateFilter::GOOD_CANDIDATE,
|
358 | |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
359 | |
filter->Reset();
|
360 | |
}
|
361 | |
node->next = backup_node;
|
|
307 |
const uint16 pos_ids[] = {
|
|
308 |
pos_matcher().GetIsolatedWordId(),
|
|
309 |
pos_matcher().GetGeneralSymbolId(),
|
|
310 |
};
|
|
311 |
// Perform the same test for the above POS IDs.
|
|
312 |
for (const uint16 id : pos_ids) {
|
|
313 |
node->lid = id;
|
|
314 |
node->rid = id;
|
|
315 |
|
|
316 |
node->prev->node_type = Node::NOR_NODE;
|
|
317 |
node->next->node_type = Node::EOS_NODE;
|
|
318 |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
|
319 |
EXPECT_EQ(CandidateFilter::BAD_CANDIDATE,
|
|
320 |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
|
321 |
// Clear the internal set |seen_| to prevent "abc" from being filtered by
|
|
322 |
// "seen" rule.
|
|
323 |
filter->Reset();
|
|
324 |
}
|
|
325 |
|
|
326 |
node->prev->node_type = Node::BOS_NODE;
|
|
327 |
node->next->node_type = Node::NOR_NODE;
|
|
328 |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
|
329 |
EXPECT_EQ(CandidateFilter::BAD_CANDIDATE,
|
|
330 |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
|
331 |
filter->Reset();
|
|
332 |
}
|
|
333 |
|
|
334 |
node->prev->node_type = Node::NOR_NODE;
|
|
335 |
node->next->node_type = Node::NOR_NODE;
|
|
336 |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
|
337 |
EXPECT_EQ(CandidateFilter::BAD_CANDIDATE,
|
|
338 |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
|
339 |
filter->Reset();
|
|
340 |
}
|
|
341 |
|
|
342 |
node->prev->node_type = Node::BOS_NODE;
|
|
343 |
node->next->node_type = Node::EOS_NODE;
|
|
344 |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
|
345 |
EXPECT_EQ(CandidateFilter::GOOD_CANDIDATE,
|
|
346 |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
|
347 |
filter->Reset();
|
|
348 |
}
|
|
349 |
|
|
350 |
Node *backup_node = node->prev;
|
|
351 |
node->prev = nullptr;
|
|
352 |
node->next->node_type = Node::EOS_NODE;
|
|
353 |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
|
354 |
EXPECT_EQ(CandidateFilter::GOOD_CANDIDATE,
|
|
355 |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
|
356 |
filter->Reset();
|
|
357 |
}
|
|
358 |
node->prev = backup_node;
|
|
359 |
|
|
360 |
backup_node = node->next;
|
|
361 |
node->prev->node_type = Node::BOS_NODE;
|
|
362 |
node->next = nullptr;
|
|
363 |
for (size_t i = 0; i < arraysize(kRequestTypes); ++i) {
|
|
364 |
EXPECT_EQ(CandidateFilter::GOOD_CANDIDATE,
|
|
365 |
filter->FilterCandidate("abc", c, nodes, kRequestTypes[i]));
|
|
366 |
filter->Reset();
|
|
367 |
}
|
|
368 |
node->next = backup_node;
|
|
369 |
}
|
362 | 370 |
}
|
363 | 371 |
|
364 | 372 |
TEST_F(CandidateFilterTest, IsolatedWordInMultipleNodes) {
|