1 // Copyright (C) 2022 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "icing/scoring/scored-document-hit.h"
16
17 #include <cstdint>
18 #include <utility>
19 #include <vector>
20
21 #include "gmock/gmock.h"
22 #include "gtest/gtest.h"
23 #include "icing/testing/common-matchers.h"
24
25 namespace icing {
26 namespace lib {
27
28 namespace {
29
30 using ::testing::DoubleEq;
31 using ::testing::IsEmpty;
32
TEST(ScoredDocumentHitTest,ScoredDocumentHitConvertToJoinedScoredDocumentHit)33 TEST(ScoredDocumentHitTest, ScoredDocumentHitConvertToJoinedScoredDocumentHit) {
34 ScoredDocumentHit::Converter converter;
35
36 double score = 2.0;
37 ScoredDocumentHit scored_document_hit(/*document_id=*/5,
38 /*section_id_mask=*/49, score);
39
40 JoinedScoredDocumentHit joined_scored_document_hit =
41 converter(ScoredDocumentHit(scored_document_hit));
42 EXPECT_THAT(joined_scored_document_hit.final_score(), DoubleEq(score));
43 EXPECT_THAT(joined_scored_document_hit.parent_scored_document_hit(),
44 EqualsScoredDocumentHit(scored_document_hit));
45 EXPECT_THAT(joined_scored_document_hit.child_scored_document_hits(),
46 IsEmpty());
47 }
48
TEST(ScoredDocumentHitTest,JoinedScoredDocumentHitConvertToJoinedScoredDocumentHit)49 TEST(ScoredDocumentHitTest,
50 JoinedScoredDocumentHitConvertToJoinedScoredDocumentHit) {
51 JoinedScoredDocumentHit::Converter converter;
52
53 ScoredDocumentHit parent_scored_document_hit(/*document_id=*/5,
54 /*section_id_mask=*/49,
55 /*score=*/1.0);
56 std::vector<ScoredDocumentHit> child_scored_document_hits{
57 ScoredDocumentHit(/*document_id=*/1,
58 /*section_id_mask=*/1,
59 /*score=*/2.0),
60 ScoredDocumentHit(/*document_id=*/2,
61 /*section_id_mask=*/2,
62 /*score=*/3.0),
63 ScoredDocumentHit(/*document_id=*/3,
64 /*section_id_mask=*/3,
65 /*score=*/4.0)};
66
67 JoinedScoredDocumentHit joined_scored_document_hit(
68 /*final_score=*/12345.6789, std::move(parent_scored_document_hit),
69 std::move(child_scored_document_hits));
70 EXPECT_THAT(converter(JoinedScoredDocumentHit(joined_scored_document_hit)),
71 EqualsJoinedScoredDocumentHit(joined_scored_document_hit));
72 }
73
TEST(ScoredDocumentHitTest,Copyable)74 TEST(ScoredDocumentHitTest, Copyable) {
75 ScoredDocumentHit hit1(/*document_id=*/5,
76 /*section_id_mask=*/49,
77 /*score=*/1.0, /*additional_scores=*/{0, 1, 2});
78
79 ScoredDocumentHit hit2(/*document_id=*/6,
80 /*section_id_mask=*/50,
81 /*score=*/2.0, /*additional_scores=*/{3, 4, 5});
82
83 // Copy constructor
84 ScoredDocumentHit copy = hit1;
85 EXPECT_THAT(copy, EqualsScoredDocumentHit(ScoredDocumentHit(
86 /*document_id=*/5,
87 /*section_id_mask=*/49,
88 /*score=*/1.0, /*additional_scores=*/{0, 1, 2})));
89
90 // Copy assignment
91 copy = hit2;
92 EXPECT_THAT(copy, EqualsScoredDocumentHit(ScoredDocumentHit(
93 /*document_id=*/6,
94 /*section_id_mask=*/50,
95 /*score=*/2.0, /*additional_scores=*/{3, 4, 5})));
96 }
97
TEST(ScoredDocumentHitTest,Movable)98 TEST(ScoredDocumentHitTest, Movable) {
99 ScoredDocumentHit hit1(/*document_id=*/5,
100 /*section_id_mask=*/49,
101 /*score=*/1.0, /*additional_scores=*/{0, 1, 2});
102 ScoredDocumentHit hit1_copy = hit1;
103
104 ScoredDocumentHit hit2(/*document_id=*/6,
105 /*section_id_mask=*/50,
106 /*score=*/2.0, /*additional_scores=*/{3, 4, 5});
107 ScoredDocumentHit hit2_copy = hit2;
108
109 // Move constructor
110 ScoredDocumentHit moved = std::move(hit1);
111 EXPECT_THAT(moved, EqualsScoredDocumentHit(hit1_copy));
112
113 // Move assignment
114 moved = std::move(hit2);
115 EXPECT_THAT(moved, EqualsScoredDocumentHit(hit2_copy));
116 }
117
TEST(ScoredDocumentHitTest,Swapable)118 TEST(ScoredDocumentHitTest, Swapable) {
119 ScoredDocumentHit hit1(/*document_id=*/5,
120 /*section_id_mask=*/49,
121 /*score=*/1.0, /*additional_scores=*/{0, 1, 2});
122 ScoredDocumentHit hit1_copy = hit1;
123
124 ScoredDocumentHit hit2(/*document_id=*/6,
125 /*section_id_mask=*/50,
126 /*score=*/2.0, /*additional_scores=*/{3, 4, 5});
127 ScoredDocumentHit hit2_copy = hit2;
128
129 std::swap(hit1, hit2);
130 EXPECT_THAT(hit1, EqualsScoredDocumentHit(hit2_copy));
131 EXPECT_THAT(hit2, EqualsScoredDocumentHit(hit1_copy));
132 }
133
134 } // namespace
135
136 } // namespace lib
137 } // namespace icing
138