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_error_code.h"
17 #include "drawing_image.h"
18 #include "drawing_point.h"
19 #include "drawing_sampling_options.h"
20 #include "drawing_shader_effect.h"
21 #include "gtest/gtest.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 namespace Drawing {
29 class NativeDrawingShaderEffectTest : public testing::Test {
30 public:
31     static void SetUpTestCase();
32     static void TearDownTestCase();
33     void SetUp() override;
34     void TearDown() override;
35 };
36 
37 constexpr uint32_t POINT_NUM = 3;
38 
SetUpTestCase()39 void NativeDrawingShaderEffectTest::SetUpTestCase() {}
TearDownTestCase()40 void NativeDrawingShaderEffectTest::TearDownTestCase() {}
SetUp()41 void NativeDrawingShaderEffectTest::SetUp() {}
TearDown()42 void NativeDrawingShaderEffectTest::TearDown() {}
43 
44 constexpr uint32_t NUM_20 = 20;
45 constexpr uint32_t NUM_300 = 300;
46 
47 /*
48  * @tc.name: OH_Drawing_ShaderEffectCreateLinearGradient
49  * @tc.desc: Test OH_Drawing_ShaderEffectCreateLinearGradient
50  * @tc.type: FUNC
51  */
52 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateLinearGradient, TestSize.Level1)
53 {
54     OH_Drawing_Point* startPt = OH_Drawing_PointCreate(NUM_20, NUM_20);
55     OH_Drawing_Point* endPt = OH_Drawing_PointCreate(NUM_300, NUM_300);
56     uint32_t colors[] = { 0xFFFFFFFF };
57     float pos[] = { 0.0f, 1.0f };
58     OH_Drawing_ShaderEffect* effect =
59         OH_Drawing_ShaderEffectCreateLinearGradient(nullptr, nullptr, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
60     ASSERT_TRUE(effect == nullptr);
61     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
62     OH_Drawing_ShaderEffectCreateLinearGradient(nullptr, endPt, colors, pos, 1, OH_Drawing_TileMode::CLAMP);
63     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
64     OH_Drawing_ShaderEffectCreateLinearGradient(startPt, nullptr, colors, pos, 1, OH_Drawing_TileMode::CLAMP);
65     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
66     OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, nullptr, pos, 1, OH_Drawing_TileMode::CLAMP);
67     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
68 
69     OH_Drawing_PointDestroy(startPt);
70     OH_Drawing_PointDestroy(endPt);
71 }
72 
73 /*
74  * @tc.name: OH_Drawing_ShaderEffectCreateRadialGradient
75  * @tc.desc: Test OH_Drawing_ShaderEffectCreateRadialGradient
76  * @tc.type: FUNC
77  */
78 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateRadialGradient001, TestSize.Level1)
79 {
80     OH_Drawing_ShaderEffect* effect =
81         OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, 1, nullptr, nullptr, 1, OH_Drawing_TileMode::CLAMP);
82     ASSERT_TRUE(effect == nullptr);
83     uint32_t gColors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000 };
84     float_t gPos[] = { 0.25f, 0.75f };
85     float radius = 200;
86     float x = 200;
87     float y = 200;
88     OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(x, y);
89     OH_Drawing_ShaderEffect* effect1 =
90         OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
91     ASSERT_TRUE(effect1 != nullptr);
92     OH_Drawing_ShaderEffectCreateRadialGradient(nullptr, radius, gColors, gPos, 1, OH_Drawing_TileMode::REPEAT);
93     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
94     OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, radius, nullptr, gPos, 1, OH_Drawing_TileMode::REPEAT);
95     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
96 }
97 
98 /*
99  * @tc.name: OH_Drawing_ShaderEffectCreateImageShader
100  * @tc.desc: Test OH_Drawing_ShaderEffectCreateImageShader
101  * @tc.type: FUNC
102  */
103 HWTEST_F(NativeDrawingShaderEffectTest, OH_Drawing_ShaderEffectCreateImageShader, TestSize.Level1)
104 {
105     OH_Drawing_Image* image = OH_Drawing_ImageCreate();
106     ASSERT_TRUE(image != nullptr);
107     OH_Drawing_SamplingOptions* options = OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_LINEAR);
108     ASSERT_TRUE(options != nullptr);
109     OH_Drawing_Matrix* matrix = nullptr;
110     OH_Drawing_ShaderEffect* effect = OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, options, matrix);
111     ASSERT_TRUE(effect != nullptr);
112     OH_Drawing_ShaderEffectCreateImageShader(nullptr, CLAMP, CLAMP, options, matrix);
113     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
114     OH_Drawing_ShaderEffectCreateImageShader(image, CLAMP, CLAMP, nullptr, matrix);
115     EXPECT_EQ(OH_Drawing_ErrorCodeGet(), OH_DRAWING_ERROR_INVALID_PARAMETER);
116 }
117 
118 /*
119  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001
120  * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
121  * the two specified points.
122  * @tc.type: FUNC
123  * @tc.require: AR000GTO5R
124  */
125 HWTEST_F(NativeDrawingShaderEffectTest,
126     NativeDrawingShaderEffectTest_ShaderEffectCreateLinearGradientWithLocalMatrix001, TestSize.Level1)
127 {
128     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
129     OH_Drawing_Point2D start = {0, 0};
130     OH_Drawing_Point2D end = {100.f, 0}; // 100.f: end point's x
131     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
132         &start, &end, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
133 
134     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
135     EXPECT_EQ(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
136         &start, nullptr, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
137     EXPECT_NE(OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
138         &start, &end, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
139 }
140 
141 /*
142  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002
143  * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a linear gradient between
144  * the two specified points.
145  * @tc.type: FUNC
146  * @tc.require: AR000GTO5R
147  */
148 HWTEST_F(NativeDrawingShaderEffectTest,
149     NativeDrawingShaderEffectTest_ShaderEffectCreateRadialGradientWithLocalMatrix002, TestSize.Level1)
150 {
151     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
152     float radius = 5.0; // 5.0f: gradient color radius
153     OH_Drawing_Point2D start = {100.f, 0};  // 100.f: start point's x
154     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
155         &start, radius, nullptr, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
156 
157     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
158     EXPECT_EQ(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
159         nullptr, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
160     EXPECT_NE(OH_Drawing_ShaderEffectCreateRadialGradientWithLocalMatrix(
161         &start, radius, colors, pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
162 }
163 
164 /*
165  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003
166  * @tc.desc: test for greates an <b>OH_Drawing_ShaderEffect</b> that generates a conical gradient given two circles.
167  * @tc.type: FUNC
168  * @tc.require: AR000GTO5R
169  */
170 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateTwoPointConicalGradient003,
171     TestSize.Level1)
172 {
173     OH_Drawing_Point2D startPt = {0, 0};
174     OH_Drawing_Point2D endPt = {100.f, 0}; // 100.f: end point's x
175     uint32_t colors[POINT_NUM] = {0xFF00FFFF, 0xFFFF00FF, 0xFFFFFF00};
176     float pos[POINT_NUM] = {0.0f, 0.5f, 1.0f}; // 0.5f: gradient color points, 1.0f: gradient color points
177     float startRadius = 5.0f, endRadius = 10.0f; // 5.0f: gradient color radius, 10.0f: gradient color radius
178     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, nullptr, endRadius, colors,
179         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
180     EXPECT_EQ(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, nullptr,
181         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
182     EXPECT_NE(OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(&startPt, startRadius, &endPt, endRadius, colors,
183         pos, POINT_NUM, OH_Drawing_TileMode::CLAMP, nullptr), nullptr);
184 }
185 
186 /*
187  * @tc.name: NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004
188  * @tc.desc: test for creates an <b>OH_Drawing_ShaderEffect</b> that generates a shader with single color.
189  * @tc.type: FUNC
190  * @tc.require: AR000GTO5R
191  */
192 HWTEST_F(NativeDrawingShaderEffectTest, NativeDrawingShaderEffectTest_ShaderEffectCreateColorShader004,
193     TestSize.Level1)
194 {
195     const uint32_t color = 0xFFFF0000;
196     OH_Drawing_ShaderEffect * colorShaderEffect = OH_Drawing_ShaderEffectCreateColorShader(color);
197     EXPECT_NE(colorShaderEffect, nullptr);
198     OH_Drawing_ShaderEffectDestroy(colorShaderEffect);
199 }
200 } // namespace Drawing
201 } // namespace Rosen
202 } // namespace OHOS