1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
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
16 #include <gmock/gmock.h>
17 #include <gtest/gtest.h>
18 #include <memory>
19
20 #include "mock/mock_any_span.h"
21 #include "param_test_macros.h"
22 #include "texgine_exception.h"
23 #include "typography_builder_impl.h"
24 #include "typography_impl.h"
25
26 using namespace testing;
27 using namespace testing::ext;
28
29 namespace OHOS {
30 namespace Rosen {
31 namespace TextEngine {
32 struct MockVars {
33 TextStyle ys;
34 std::vector<VariantSpan> catchedSpans;
35 std::vector<TextStyle> catchedStyles;
36 } g_tbMockvars;
37
InitMockVars(struct MockVars && vars)38 void InitMockVars(struct MockVars &&vars)
39 {
40 g_tbMockvars = std::move(vars);
41 }
42
TypographyImpl(TypographyStyle & ys,std::vector<VariantSpan> & spans,std::shared_ptr<FontProviders> providers)43 TypographyImpl::TypographyImpl(TypographyStyle &ys, std::vector<VariantSpan> &spans,
44 std::shared_ptr<FontProviders> providers)
45 {
46 g_tbMockvars.catchedSpans = spans;
47 }
48
SetTextStyle(const TextStyle & style)49 void VariantSpan::SetTextStyle(const TextStyle &style) noexcept(true)
50 {
51 g_tbMockvars.catchedStyles.push_back(style);
52 }
53
ConvertToTextStyle() const54 TextStyle TypographyStyle::ConvertToTextStyle() const
55 {
56 return g_tbMockvars.ys;
57 }
58
59 class TypographyBuilderImplTest : public testing::Test {
60 public:
61 std::shared_ptr<TypographyBuilderImpl> builder_ =
62 std::make_shared<TypographyBuilderImpl>(TypographyStyle{}, FontProviders::Create());
63 };
64
65 /**
66 * @tc.name: Create
67 * @tc.desc: Verify the Create
68 * @tc.type:FUNC
69 */
70 HWTEST_F(TypographyBuilderImplTest, Create, TestSize.Level1)
71 {
72 EXPECT_NE(TypographyBuilder::Create(), nullptr);
73 }
74
75 /**
76 * @tc.name: PushPopStyle
77 * @tc.desc: Verify the PushPopStyle
78 * @tc.type:FUNC
79 */
80 HWTEST_F(TypographyBuilderImplTest, PushPopStyle, TestSize.Level1)
81 {
82 TextStyle s1 = {.fontSize = 1};
83 TextStyle s2 = {.fontSize = 2};
84 TextStyle s3 = {.fontSize = 3};
85 auto normalAnySpan = std::make_shared<MockAnySpan>();
86
87 InitMockVars({.ys = s1});
88 TypographyBuilderImpl builder1({}, FontProviders::Create());
89 builder1.AppendSpan(normalAnySpan);
90 EXPECT_NE(builder1.Build(), nullptr);
91 EXPECT_EQ(g_tbMockvars.catchedStyles[0], s1);
92
93 InitMockVars({.ys = s1});
94 TypographyBuilderImpl builder2({}, FontProviders::Create());
95 builder2.PushStyle(s2);
96 builder2.AppendSpan(normalAnySpan);
97 EXPECT_NE(builder2.Build(), nullptr);
98 EXPECT_EQ(g_tbMockvars.catchedStyles[0], s2);
99
100 InitMockVars({.ys = s1});
101 TypographyBuilderImpl builder3({}, FontProviders::Create());
102 builder3.PushStyle(s2);
103 builder3.PushStyle(s3);
104 builder3.AppendSpan(normalAnySpan);
105 EXPECT_NE(builder3.Build(), nullptr);
106 EXPECT_EQ(g_tbMockvars.catchedStyles[0], s3);
107
108 InitMockVars({.ys = s1});
109 TypographyBuilderImpl builder4({}, FontProviders::Create());
110 builder4.PushStyle(s2);
111 builder4.PushStyle(s3);
112 builder4.PopStyle();
113 builder4.AppendSpan(normalAnySpan);
114 EXPECT_NE(builder4.Build(), nullptr);
115 EXPECT_EQ(g_tbMockvars.catchedStyles[0], s2);
116 }
117
118 /**
119 * @tc.name: AppendSpan1
120 * @tc.desc: Verify the AppendSpan
121 * @tc.type:FUNC
122 */
123 HWTEST_F(TypographyBuilderImplTest, AppendSpan1, TestSize.Level1)
124 {
125 std::shared_ptr<AnySpan> nullptrAnySpan = nullptr;
126 std::shared_ptr<TextSpan> nullptrTextSpan = nullptr;
127
128 InitMockVars({});
129 TypographyBuilderImpl builder1({}, FontProviders::Create());
130 builder1.AppendSpan(nullptrAnySpan);
131 EXPECT_NE(builder1.Build(), nullptr);
132 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 0u);
133
134 InitMockVars({});
135 TypographyBuilderImpl builder2({}, FontProviders::Create());
136 builder2.AppendSpan(nullptrTextSpan);
137 EXPECT_NE(builder2.Build(), nullptr);
138 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 0u);
139
140 auto as1 = std::make_shared<MockAnySpan>();
141 InitMockVars({});
142 TypographyBuilderImpl builder3({}, FontProviders::Create());
143 builder3.AppendSpan(as1);
144 EXPECT_NE(builder3.Build(), nullptr);
145 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 1u);
146 EXPECT_EQ(g_tbMockvars.catchedSpans[0], as1);
147
148 auto ts1 = TextSpan::MakeEmpty();
149 InitMockVars({});
150 TypographyBuilderImpl builder4({}, FontProviders::Create());
151 builder4.AppendSpan(ts1);
152 EXPECT_NE(builder4.Build(), nullptr);
153 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 1u);
154 EXPECT_EQ(g_tbMockvars.catchedSpans[0], ts1);
155
156 auto as2 = std::make_shared<MockAnySpan>();
157 auto as3 = std::make_shared<MockAnySpan>();
158 InitMockVars({});
159 TypographyBuilderImpl builder5({}, FontProviders::Create());
160 builder5.AppendSpan(as2);
161 builder5.AppendSpan(as3);
162 EXPECT_NE(builder5.Build(), nullptr);
163 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 2u);
164 EXPECT_EQ(g_tbMockvars.catchedSpans[0], as2);
165 EXPECT_EQ(g_tbMockvars.catchedSpans[1], as3);
166 }
167
168 /**
169 * @tc.name: AppendSpan2
170 * @tc.desc: Verify the AppendSpan
171 * @tc.type:FUNC
172 */
173 HWTEST_F(TypographyBuilderImplTest, AppendSpan2, TestSize.Level1)
174 {
175 TextStyle xs = {};
176
177 auto ts2 = TextSpan::MakeEmpty();
178 auto ts3 = TextSpan::MakeEmpty();
179 InitMockVars({});
180 TypographyBuilderImpl builder6({}, FontProviders::Create());
181 builder6.AppendSpan(ts2);
182 builder6.AppendSpan(ts3);
183 EXPECT_NE(builder6.Build(), nullptr);
184 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 1u);
185 EXPECT_EQ(g_tbMockvars.catchedSpans[0], ts2);
186
187 auto ts4 = TextSpan::MakeEmpty();
188 auto ts5 = TextSpan::MakeEmpty();
189 InitMockVars({});
190 TypographyBuilderImpl builder7({}, FontProviders::Create());
191 builder7.AppendSpan(ts4);
192 builder7.PushStyle(xs);
193 builder7.AppendSpan(ts5);
194 EXPECT_NE(builder7.Build(), nullptr);
195 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 2u);
196 EXPECT_EQ(g_tbMockvars.catchedSpans[0], ts4);
197 EXPECT_EQ(g_tbMockvars.catchedSpans[1], ts5);
198
199 auto ts6 = TextSpan::MakeEmpty();
200 auto as4 = std::make_shared<MockAnySpan>();
201 auto ts7 = TextSpan::MakeEmpty();
202 InitMockVars({});
203 TypographyBuilderImpl builder8({}, FontProviders::Create());
204 builder8.AppendSpan(ts6);
205 builder8.AppendSpan(as4);
206 builder8.AppendSpan(ts7);
207 EXPECT_NE(builder8.Build(), nullptr);
208 EXPECT_EQ(g_tbMockvars.catchedSpans.size(), 3u);
209 EXPECT_EQ(g_tbMockvars.catchedSpans[0], ts6);
210 EXPECT_EQ(g_tbMockvars.catchedSpans[1], as4);
211 EXPECT_EQ(g_tbMockvars.catchedSpans[2], ts7);
212 }
213 } // namespace TextEngine
214 } // namespace Rosen
215 } // namespace OHOS
216