1/*
2 * Copyright (c) 2024 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, Hardware
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 "drawing_color.h"
17#include "drawing_error_code.h"
18#include "drawing_filter.h"
19#include "drawing_mask_filter.h"
20#include "drawing_rect.h"
21#include "drawing_round_rect.h"
22#include "gtest/gtest.h"
23
24#include "utils/round_rect.h"
25#include "utils/scalar.h"
26
27using namespace testing;
28using namespace testing::ext;
29
30namespace OHOS {
31namespace Rosen {
32namespace Drawing {
33class NativeDrawingRoundRectLargeValueTest : public testing::Test {
34public:
35    static void SetUpTestCase();
36    static void TearDownTestCase();
37    void SetUp() override;
38    void TearDown() override;
39};
40
41void NativeDrawingRoundRectLargeValueTest::SetUpTestCase() {}
42void NativeDrawingRoundRectLargeValueTest::TearDownTestCase() {}
43void NativeDrawingRoundRectLargeValueTest::SetUp() {}
44void NativeDrawingRoundRectLargeValueTest::TearDown() {}
45
46constexpr uint32_t FOUR = 4;
47constexpr int32_t MINUS_ONE = -1;
48
49/*
50 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos001
51 * @tc.desc: test CCornerPosCastToCornerPos
52 * @tc.type: FUNC
53 * @tc.require: AR000GTO5R
54 */
55HWTEST_F(NativeDrawingRoundRectLargeValueTest, CCornerPosCastToCornerPos001, TestSize.Level1)
56{
57    OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 2160, 4096);
58    OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
59    ASSERT_NE(nullptr, roundRect);
60
61    OH_Drawing_Corner_Radii radius = { 10, 10 };
62
63    OH_Drawing_RoundRectSetCorner(nullptr, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT, radius);
64    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
65    OH_Drawing_RoundRectSetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(FOUR), radius);
66    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
67    OH_Drawing_RoundRectSetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(MINUS_ONE), radius);
68    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
69    OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT, radius);
70
71    OH_Drawing_RoundRectGetCorner(nullptr, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT);
72    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
73    OH_Drawing_RoundRectGetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(FOUR));
74    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
75    OH_Drawing_RoundRectGetCorner(roundRect, static_cast<OH_Drawing_CornerPos>(MINUS_ONE));
76    EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_PARAMETER_OUT_OF_RANGE);
77    OH_Drawing_Corner_Radii retrievedRadius;
78    retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_LEFT);
79    ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
80    ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
81
82    OH_Drawing_RoundRectDestroy(roundRect);
83    OH_Drawing_RectDestroy(rect);
84}
85
86/*
87 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos002
88 * @tc.desc: test CCornerPosCastToCornerPos
89 * @tc.type: FUNC
90 * @tc.require: AR000GTO5R
91 */
92HWTEST_F(NativeDrawingRoundRectLargeValueTest, CCornerPosCastToCornerPos002, TestSize.Level1)
93{
94    OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 2160, 4096);
95    OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
96    ASSERT_NE(nullptr, roundRect);
97
98    OH_Drawing_Corner_Radii radius = { 10, 10 };
99
100    OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_RIGHT, radius);
101
102    OH_Drawing_Corner_Radii retrievedRadius;
103
104    retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_TOP_RIGHT);
105    ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
106    ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
107
108    OH_Drawing_RoundRectDestroy(roundRect);
109    OH_Drawing_RectDestroy(rect);
110}
111
112/*
113 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos003
114 * @tc.desc: test CCornerPosCastToCornerPos
115 * @tc.type: FUNC
116 * @tc.require: AR000GTO5R
117 */
118HWTEST_F(NativeDrawingRoundRectLargeValueTest, CCornerPosCastToCornerPos003, TestSize.Level1)
119{
120    OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 2160, 4096);
121    OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
122    ASSERT_NE(nullptr, roundRect);
123
124    OH_Drawing_Corner_Radii radius = { 10, 10 };
125
126    OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_RIGHT, radius);
127
128    OH_Drawing_Corner_Radii retrievedRadius;
129
130    retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_RIGHT);
131    ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
132    ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
133
134    OH_Drawing_RoundRectDestroy(roundRect);
135    OH_Drawing_RectDestroy(rect);
136}
137
138/*
139 * @tc.name: NativeDrawingRectTest_CCornerPosCastToCornerPos004
140 * @tc.desc: test CCornerPosCastToCornerPos
141 * @tc.type: FUNC
142 * @tc.require: AR000GTO5R
143 */
144HWTEST_F(NativeDrawingRoundRectLargeValueTest, CCornerPosCastToCornerPos004, TestSize.Level1)
145{
146    OH_Drawing_Rect* rect = OH_Drawing_RectCreate(100, 100, 2160, 4096);
147    OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 200, 200);
148    ASSERT_NE(nullptr, roundRect);
149
150    OH_Drawing_Corner_Radii radius = { 10, 10 };
151
152    OH_Drawing_RoundRectSetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_LEFT, radius);
153
154    OH_Drawing_Corner_Radii retrievedRadius;
155
156    retrievedRadius = OH_Drawing_RoundRectGetCorner(roundRect, OH_Drawing_CornerPos::CORNER_POS_BOTTOM_LEFT);
157    ASSERT_FLOAT_EQ(retrievedRadius.x, radius.x);
158    ASSERT_FLOAT_EQ(retrievedRadius.y, radius.y);
159
160    OH_Drawing_RoundRectDestroy(roundRect);
161    OH_Drawing_RectDestroy(rect);
162}
163
164/*
165 * @tc.name: NativeDrawingRoundRectLargeValueTest_RoundRectOffset006
166 * @tc.desc: test for test for Translates RoundRect by (dx, dy).
167 * @tc.type: FUNC
168 * @tc.require: AR000GTO5R
169 */
170HWTEST_F(NativeDrawingRoundRectLargeValueTest, NativeDrawingRoundRectLargeValueTest_RoundRectOffset006, TestSize.Level1)
171{
172    OH_Drawing_Rect* rect = OH_Drawing_RectCreate(10, 100, 2160, 4096);
173    OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 25, 25); // 25: xRad, 25: yRad
174    float dx = 10.0f, dy = 10.0f; //10.0f: X-axis offset, 10.0f: Y-axis offset
175
176    EXPECT_EQ(OH_Drawing_RoundRectOffset(nullptr, dx, dy), OH_DRAWING_ERROR_INVALID_PARAMETER);
177    EXPECT_EQ(OH_Drawing_RoundRectOffset(roundRect, dx, dy), OH_DRAWING_SUCCESS);
178
179    OH_Drawing_RectDestroy(rect);
180    OH_Drawing_RoundRectDestroy(roundRect);
181}
182} // namespace Drawing
183} // namespace Rosen
184} // namespace OHOS