• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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