1 /*
2 * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development 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 "gtest/gtest.h"
17 #include "drawing_bitmap.h"
18 #include "drawing_brush.h"
19 #include "drawing_canvas.h"
20 #include "drawing_color.h"
21 #include "drawing_color_filter.h"
22 #include "drawing_filter.h"
23 #include "drawing_font.h"
24 #include "drawing_image.h"
25 #include "drawing_mask_filter.h"
26 #include "drawing_matrix.h"
27 #include "drawing_memory_stream.h"
28 #include "drawing_path.h"
29 #include "drawing_pen.h"
30 #include "drawing_point.h"
31 #include "drawing_rect.h"
32 #include "drawing_region.h"
33 #include "drawing_round_rect.h"
34 #include "drawing_sampling_options.h"
35 #include "drawing_shader_effect.h"
36 #include "drawing_text_blob.h"
37 #include "drawing_typeface.h"
38 #include "drawing_record_cmd.h"
39 #include <random>
40 #include <thread>
41 #include <iomanip>
42 #include <sstream>
43
44 using namespace testing;
45 using namespace testing::ext;
46
47 namespace OHOS {
48 namespace Rosen {
49 namespace Drawing {
50 class DrawingCanvasDrawRecordCmdTest : public testing::Test {
51 protected:
52 // 在每个测试用例执行前调用
SetUp()53 void SetUp() override
54 {
55 // 设置代码
56 std::cout << "DrawingCanvasDrawRecordCmdTest Setup code called before each test case." << std::endl;
57 OH_Drawing_ErrorCodeReset();
58 std::cout << "DrawingCanvasDrawRecordCmdTest errorCodeReset before each test case." << std::endl;
59 }
TearDown()60 void TearDown() override
61 {
62 std::cout << "DrawingCanvasDrawRecordCmdTest Setup code called after each test case." << std::endl;
63 OH_Drawing_ErrorCodeReset();
64 std::cout << "DrawingCanvasDrawRecordCmdTest errorCodeReset after each test case." << std::endl;
65 }
66 };
drawCircle1(OH_Drawing_Canvas * canvas,int position)67 void drawCircle1(OH_Drawing_Canvas *canvas, int position)
68 {
69 int x = 10;
70 int radius = 200;
71 OH_Drawing_Point *point = OH_Drawing_PointCreate(x * position + radius, x + radius);
72 OH_Drawing_CanvasDrawCircle(canvas, point, radius);
73 OH_Drawing_PointDestroy(point);
74 }
threadFunctionTest6()75 OH_Drawing_RecordCmd *threadFunctionTest6()
76 {
77 int32_t width = 2;
78 int32_t height = 5;
79 OH_Drawing_RecordCmd *recordCmd = nullptr;
80 OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
81 OH_Drawing_RecordCmdUtils *recordCmdUtils = OH_Drawing_RecordCmdUtilsCreate();
82 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils, width, height, &canvas);
83 float penWidth = 1.0f; // pen width 1
84 // 创建一个画笔Pen对象,Pen对象用于形状的边框线绘制
85 OH_Drawing_Pen *cPen = OH_Drawing_PenCreate();
86 OH_Drawing_PenSetAntiAlias(cPen, true);
87 OH_Drawing_PenSetColor(cPen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
88 OH_Drawing_PenSetWidth(cPen, penWidth);
89 OH_Drawing_PenSetJoin(cPen, LINE_ROUND_JOIN);
90 // 将Pen画笔设置到canvas中
91 OH_Drawing_CanvasAttachPen(canvas, cPen);
92 // 创建一个画刷Brush对象,Brush对象用于形状的填充
93 OH_Drawing_Brush *cBrush = OH_Drawing_BrushCreate();
94 OH_Drawing_BrushSetColor(cBrush, OH_Drawing_ColorSetArgb(0xFF, 0x00, 0xFF, 0x00));
95 // 将Brush画刷设置到canvas中
96 OH_Drawing_CanvasAttachBrush(canvas, cBrush);
97 drawCircle1(canvas, width);
98 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils, &recordCmd);
99 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils);
100 OH_Drawing_BrushDestroy(cBrush);
101 OH_Drawing_PenDestroy(cPen);
102 cBrush = nullptr;
103 cPen = nullptr;
104 return recordCmd;
105 }
106
107 /*
108 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_RECORDER_0500
109 * @tc.name: testCanvasDrawRecordCmdNormal
110 * @tc.desc: test for testCanvasDrawRecordCmdNormal.
111 * @tc.size : SmallTest
112 * @tc.type : Function
113 * @tc.level : Level 0
114 */
115 HWTEST_F(DrawingCanvasDrawRecordCmdTest, testCanvasDrawRecordCmdNormal, Function | SmallTest | Level0) {
116 OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
117 // add assert
118 EXPECT_NE(canvas, nullptr);
119 OH_Drawing_RecordCmd *picture = nullptr;
__anonf7437c940102() 120 std::thread thread([&picture]() { picture = threadFunctionTest6(); });
121 thread.join();
122 if (picture != nullptr) {
123 OH_Drawing_ErrorCode result = OH_Drawing_CanvasDrawRecordCmd(canvas, picture);
124 EXPECT_EQ(result, OH_DRAWING_SUCCESS);
125 }
126 }
127
128 /*
129 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_RECORDER_0500
130 * @tc.name: testCanvasDrawRecordCmdABNormal
131 * @tc.desc: test for testCanvasDrawRecordCmdABNormal.
132 * @tc.size : SmallTest
133 * @tc.type : Function
134 * @tc.level : Level 0
135 */
136 HWTEST_F(DrawingCanvasDrawRecordCmdTest, testCanvasDrawRecordCmdABNormal, Function | SmallTest | Level0) {
137 OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
138 // add assert
139 EXPECT_NE(canvas, nullptr);
140 OH_Drawing_RecordCmd *picture = nullptr;
__anonf7437c940202() 141 std::thread thread([&picture]() { picture = threadFunctionTest6(); });
142 thread.join();
143 OH_Drawing_ErrorCode result1 = OH_Drawing_CanvasDrawRecordCmd(canvas, nullptr);
144 EXPECT_EQ(result1, OH_DRAWING_ERROR_INVALID_PARAMETER);
__anonf7437c940302() 145 std::thread thread1([&picture]() { picture = threadFunctionTest6(); });
146 thread1.join();
147 if (picture != nullptr) {
148 OH_Drawing_ErrorCode result = OH_Drawing_CanvasDrawRecordCmd(nullptr, picture);
149 EXPECT_EQ(result, OH_DRAWING_ERROR_INVALID_PARAMETER);
150 }
151 }
152
153 /*
154 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_RECORDER_0600
155 * @tc.name: testCanvasDrawRecordCmdNestingNormal
156 * @tc.desc: test for testCanvasDrawRecordCmdNestingNormal.
157 * @tc.size : SmallTest
158 * @tc.type : Function
159 * @tc.level : Level 0
160 */
161 HWTEST_F(DrawingCanvasDrawRecordCmdTest, testCanvasDrawRecordCmdNestingNormal, Function | SmallTest | Level0) {
162 OH_Drawing_Canvas *canvas0 = OH_Drawing_CanvasCreate();
163 int32_t width = 100;
164 int32_t height = 100;
165 OH_Drawing_RecordCmd *recordCmd = nullptr; //beginRecording-draw-finishRecording
166 OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
167 OH_Drawing_RecordCmdUtils *recordCmdUtils = OH_Drawing_RecordCmdUtilsCreate();
168 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils, width, height, &canvas);
169 drawCircle1(canvas, width);
170 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils, &recordCmd);
171 canvas = nullptr;
172 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils);
173 OH_Drawing_ErrorCode result1 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas0, recordCmd);
174 EXPECT_EQ(result1, OH_DRAWING_SUCCESS);
175 OH_Drawing_RecordCmd *recordCmd1 = nullptr; //beginRecording-finishRecording
176 OH_Drawing_Canvas *canvas1 = OH_Drawing_CanvasCreate();
177 OH_Drawing_RecordCmdUtils *recordCmdUtils1 = OH_Drawing_RecordCmdUtilsCreate();
178 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils1, width, height, &canvas1);
179 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils1, &recordCmd1);
180 canvas1 = nullptr;
181 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils1);
182 OH_Drawing_ErrorCode result2 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas0, recordCmd1);
183 EXPECT_EQ(result2, OH_DRAWING_SUCCESS);
184 OH_Drawing_RecordCmd *recordCmd2 = nullptr; //beginRecording-draw-nesting-draw-finishRecording
185 OH_Drawing_Canvas *canvas2 = OH_Drawing_CanvasCreate();
186 OH_Drawing_RecordCmdUtils *recordCmdUtils2 = OH_Drawing_RecordCmdUtilsCreate();
187 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils2, width, height, &canvas2);
188 drawCircle1(canvas2, width);
189 OH_Drawing_ErrorCode result3 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas2, recordCmd1);
190 drawCircle1(canvas2, width);
191 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils2, &recordCmd2);
192 canvas2 = nullptr;
193 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils2);
194 EXPECT_EQ(result3, OH_DRAWING_SUCCESS);
195 OH_Drawing_RecordCmd *recordCmd3 = nullptr; //beginRecording-nesting-nesting-finishRecording
196 OH_Drawing_Canvas *canvas3 = OH_Drawing_CanvasCreate();
197 OH_Drawing_RecordCmdUtils *recordCmdUtils3 = OH_Drawing_RecordCmdUtilsCreate();
198 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils3, width, height, &canvas3);
199 OH_Drawing_ErrorCode result4 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas3, recordCmd2);
200 OH_Drawing_ErrorCode result5 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas3, recordCmd1);
201 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils3, &recordCmd3);
202 canvas3 = nullptr;
203 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils3);
204 EXPECT_EQ(result4, OH_DRAWING_SUCCESS);
205 EXPECT_EQ(result5, OH_DRAWING_SUCCESS);
206 OH_Drawing_RecordCmdDestroy(recordCmd);
207 OH_Drawing_RecordCmdDestroy(recordCmd1);
208 OH_Drawing_RecordCmdDestroy(recordCmd2);
209 OH_Drawing_RecordCmdDestroy(recordCmd3);
210 }
211
212 /*
213 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_RECORDER_0601
214 * @tc.name: testCanvasDrawRecordCmdNestingAbNormal
215 * @tc.desc: test for testCanvasDrawRecordCmdNestingAbNormal.
216 * @tc.size : SmallTest
217 * @tc.type : Function
218 * @tc.level : Level 3
219 */
220 HWTEST_F(DrawingCanvasDrawRecordCmdTest, testCanvasDrawRecordCmdNestingAbNormal, Function | SmallTest | Level3) {
221 OH_Drawing_Canvas *canvas0 = OH_Drawing_CanvasCreate();
222 int32_t width = 100;
223 int32_t height = 100;
224 OH_Drawing_RecordCmd *recordCmd = nullptr;
225 OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
226 OH_Drawing_RecordCmdUtils *recordCmdUtils = OH_Drawing_RecordCmdUtilsCreate();
227 OH_Drawing_ErrorCode result = OH_Drawing_CanvasDrawRecordCmdNesting(canvas, recordCmd);
228 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils, width, height, &canvas);
229 drawCircle1(canvas, width);
230 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils, &recordCmd);
231 canvas = nullptr;
232 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils);
233 OH_Drawing_ErrorCode result1 = OH_Drawing_CanvasDrawRecordCmdNesting(nullptr, recordCmd);
234 EXPECT_EQ(result, OH_DRAWING_ERROR_INVALID_PARAMETER);
235 EXPECT_EQ(result1, OH_DRAWING_ERROR_INVALID_PARAMETER);
236 OH_Drawing_ErrorCode result2 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas0, nullptr);
237 EXPECT_EQ(result2, OH_DRAWING_ERROR_INVALID_PARAMETER);
238 OH_Drawing_RecordCmdDestroy(recordCmd);
239 }
240
241 /*
242 * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_RECORDER_0602
243 * @tc.name: testCanvasDrawRecordCmdNestingAbNormal1
244 * @tc.desc: test for testCanvasDrawRecordCmdNestingAbNormal1.
245 * @tc.size : SmallTest
246 * @tc.type : Function
247 * @tc.level : Level 3
248 */
249 HWTEST_F(DrawingCanvasDrawRecordCmdTest, testCanvasDrawRecordCmdNestingAbNormal1, Function | SmallTest | Level3) {
250 OH_Drawing_Canvas *canvas0 = OH_Drawing_CanvasCreate();
251 int32_t width = 100;
252 int32_t height = 100;
253 OH_Drawing_RecordCmd *recordCmd = nullptr;
254 OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
255 OH_Drawing_RecordCmdUtils *recordCmdUtils = OH_Drawing_RecordCmdUtilsCreate();
256 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils, width, height, &canvas);
257 OH_Drawing_ErrorCode result = OH_Drawing_CanvasDrawRecordCmdNesting(canvas, recordCmd);
258 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils, width, height, &canvas);
259 OH_Drawing_ErrorCode result1 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas, recordCmd);
260 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils, &recordCmd);
261 canvas = nullptr;
262 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils);
263 EXPECT_EQ(result, OH_DRAWING_ERROR_INVALID_PARAMETER);
264 EXPECT_EQ(result1, OH_DRAWING_ERROR_INVALID_PARAMETER);
265
266 OH_Drawing_RecordCmd *recordCmd1 = nullptr;
267 OH_Drawing_Canvas *canvas1 = OH_Drawing_CanvasCreate();
268 OH_Drawing_RecordCmdUtils *recordCmdUtils1 = OH_Drawing_RecordCmdUtilsCreate();
269 OH_Drawing_RecordCmdUtilsBeginRecording(recordCmdUtils1, width, height, &canvas);
270 OH_Drawing_ErrorCode result2 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas1, recordCmd1);
271 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils1, &recordCmd1);
272 OH_Drawing_ErrorCode result3 = OH_Drawing_CanvasDrawRecordCmdNesting(canvas0, recordCmd1);
273 OH_Drawing_RecordCmdUtilsFinishRecording(recordCmdUtils1, &recordCmd1);
274 canvas1 = nullptr;
275 OH_Drawing_RecordCmdUtilsDestroy(recordCmdUtils1);
276 EXPECT_EQ(result2, OH_DRAWING_ERROR_INVALID_PARAMETER);
277 EXPECT_EQ(result3, OH_DRAWING_SUCCESS);
278 OH_Drawing_RecordCmdDestroy(recordCmd);
279 OH_Drawing_RecordCmdDestroy(recordCmd1);
280 }
281 } // namespace Drawing
282 } // namespace Rosen
283 } // namespace OHOS
284