已合并
feat: 补充select算子op_api UT #4082
wangqi_ai创建于 7月14日
feat: 补充select算子op_api UT #4082
已合并
wangqi_ai创建于 7月14日
共 1 个文件变更+189-0
@@ -0,0 +1,189 @@
1+/**
2+ * Copyright (c) 2026 Huawei Technologies Co., Ltd.
3+ * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
4+ * CANN Open Software License Agreement Version 2.0 (the "License").
5+ * Please refer to the License for details. You may not use this file except in compliance with the License.
6+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
7+ * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8+ * See LICENSE in the root of the software repository for the full text of the License.
9+ */
10+ 
11+#include "gtest/gtest.h"
12+#include "../../../op_api/aclnn_s_where.h"
13+#include "op_api_ut_common/tensor_desc.h"
14+#include "op_api_ut_common/op_api_ut.h"
15+ 
16+using namespace std;
17+ 
18+class l2_s_where_test : public testing::Test {
19+protected:
20+ static void SetUpTestCase() { cout << "l2_s_where_test SetUp" << endl; }
21+ 
22+ static void TearDownTestCase() { cout << "l2_s_where_test TearDown" << endl; }
23+};
24+ 
25+// condition为空指针
26+TEST_F(l2_s_where_test, l2_s_where_test_nullptr_condition)
27+{
28+ auto selfDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
29+ auto otherDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
30+ auto outDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).Precision(0.0001, 0.0001);
31+ 
32+ auto ut = OP_API_UT(aclnnSWhere, INPUT(nullptr, selfDesc, otherDesc), OUTPUT(outDesc));
33+ 
34+ uint64_t workspaceSize = 0;
35+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
36+ EXPECT_NE(getWorkspaceResult, ACLNN_ERR_INNER_NULLPTR);
37+}
38+ 
39+// self为空指针
40+TEST_F(l2_s_where_test, l2_s_where_test_nullptr_self)
41+{
42+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
43+ auto otherDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
44+ auto outDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).Precision(0.0001, 0.0001);
45+ 
46+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, nullptr, otherDesc), OUTPUT(outDesc));
47+ 
48+ uint64_t workspaceSize = 0;
49+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
50+ EXPECT_NE(getWorkspaceResult, ACLNN_ERR_INNER_NULLPTR);
51+}
52+ 
53+// other为空指针
54+TEST_F(l2_s_where_test, l2_s_where_test_nullptr_other)
55+{
56+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
57+ auto selfDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
58+ auto outDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).Precision(0.0001, 0.0001);
59+ 
60+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, nullptr), OUTPUT(outDesc));
61+ 
62+ uint64_t workspaceSize = 0;
63+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
64+ EXPECT_NE(getWorkspaceResult, ACLNN_ERR_INNER_NULLPTR);
65+}
66+ 
67+// out为空指针
68+TEST_F(l2_s_where_test, l2_s_where_test_nullptr_out)
69+{
70+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
71+ auto selfDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
72+ auto otherDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
73+ 
74+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(nullptr));
75+ 
76+ uint64_t workspaceSize = 0;
77+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
78+ EXPECT_NE(getWorkspaceResult, ACLNN_ERR_INNER_NULLPTR);
79+}
80+ 
81+// 正常路径,float32
82+TEST_F(l2_s_where_test, l2_s_where_test_dtype_float32)
83+{
84+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
85+ auto selfDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
86+ auto otherDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
87+ auto outDesc = TensorDesc({4, 2}, ACL_FLOAT, ACL_FORMAT_ND).Precision(0.0001, 0.0001);
88+ 
89+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
90+ 
91+ uint64_t workspaceSize = 0;
92+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
93+ EXPECT_EQ(getWorkspaceResult, ACL_SUCCESS);
94+ // ut.TestPrecision();
95+}
96+ 
97+// 正常路径,float16
98+TEST_F(l2_s_where_test, l2_s_where_test_dtype_float16)
99+{
100+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
101+ auto selfDesc = TensorDesc({4, 2}, ACL_FLOAT16, ACL_FORMAT_ND).ValueRange(-2, 2);
102+ auto otherDesc = TensorDesc({4, 2}, ACL_FLOAT16, ACL_FORMAT_ND).ValueRange(-2, 2);
103+ auto outDesc = TensorDesc({4, 2}, ACL_FLOAT16, ACL_FORMAT_ND).Precision(0.001, 0.001);
104+ 
105+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
106+ 
107+ uint64_t workspaceSize = 0;
108+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
109+ EXPECT_EQ(getWorkspaceResult, ACL_SUCCESS);
110+ // ut.TestPrecision();
111+}
112+ 
113+// 正常路径,int32
114+TEST_F(l2_s_where_test, l2_s_where_test_dtype_int32)
115+{
116+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
117+ auto selfDesc = TensorDesc({4, 2}, ACL_INT32, ACL_FORMAT_ND).ValueRange(-2, 2);
118+ auto otherDesc = TensorDesc({4, 2}, ACL_INT32, ACL_FORMAT_ND).ValueRange(-2, 2);
119+ auto outDesc = TensorDesc({4, 2}, ACL_INT32, ACL_FORMAT_ND);
120+ 
121+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
122+ 
123+ uint64_t workspaceSize = 0;
124+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
125+ EXPECT_EQ(getWorkspaceResult, ACL_SUCCESS);
126+ // ut.TestPrecision();
127+}
128+ 
129+// 正常路径,int64
130+TEST_F(l2_s_where_test, l2_s_where_test_dtype_int64)
131+{
132+ auto conditionDesc = TensorDesc({4, 2}, ACL_BOOL, ACL_FORMAT_ND);
133+ auto selfDesc = TensorDesc({4, 2}, ACL_INT64, ACL_FORMAT_ND).ValueRange(-2, 2);
134+ auto otherDesc = TensorDesc({4, 2}, ACL_INT64, ACL_FORMAT_ND).ValueRange(-2, 2);
135+ auto outDesc = TensorDesc({4, 2}, ACL_INT64, ACL_FORMAT_ND);
136+ 
137+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
138+ 
139+ uint64_t workspaceSize = 0;
140+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
141+ EXPECT_EQ(getWorkspaceResult, ACL_SUCCESS);
142+ // ut.TestPrecision();
143+}
144+ 
145+// 正常路径,3维输入
146+TEST_F(l2_s_where_test, l2_s_where_test_3d)
147+{
148+ auto conditionDesc = TensorDesc({2, 3, 4}, ACL_BOOL, ACL_FORMAT_ND);
149+ auto selfDesc = TensorDesc({2, 3, 4}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
150+ auto otherDesc = TensorDesc({2, 3, 4}, ACL_FLOAT, ACL_FORMAT_ND).ValueRange(-2, 2);
151+ auto outDesc = TensorDesc({2, 3, 4}, ACL_FLOAT, ACL_FORMAT_ND).Precision(0.0001, 0.0001);
152+ 
153+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
154+ 
155+ uint64_t workspaceSize = 0;
156+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
157+ EXPECT_EQ(getWorkspaceResult, ACL_SUCCESS);
158+ // ut.TestPrecision();
159+}
160+ 
161+// self为空tensor
162+TEST_F(l2_s_where_test, l2_s_where_test_empty_tensor)
163+{
164+ auto conditionDesc = TensorDesc({4, 0}, ACL_BOOL, ACL_FORMAT_ND);
165+ auto selfDesc = TensorDesc({4, 0}, ACL_FLOAT, ACL_FORMAT_ND);
166+ auto otherDesc = TensorDesc({4, 0}, ACL_FLOAT, ACL_FORMAT_ND);
167+ auto outDesc = TensorDesc({4, 0}, ACL_FLOAT, ACL_FORMAT_ND);
168+ 
169+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
170+ 
171+ uint64_t workspaceSize = 0;
172+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
173+ EXPECT_EQ(getWorkspaceResult, ACL_SUCCESS);
174+}
175+ 
176+// 用例不支持,最大维度超过8
177+TEST_F(l2_s_where_test, l2_s_where_test_dimension)
178+{
179+ auto conditionDesc = TensorDesc({2, 2, 1, 1, 1, 1, 1, 1, 1, 1}, ACL_BOOL, ACL_FORMAT_ND);
180+ auto selfDesc = TensorDesc({2, 2, 1, 1, 1, 1, 1, 1, 1, 1}, ACL_FLOAT, ACL_FORMAT_ND);
181+ auto otherDesc = TensorDesc({2, 2, 1, 1, 1, 1, 1, 1, 1, 1}, ACL_FLOAT, ACL_FORMAT_ND);
182+ auto outDesc = TensorDesc({2, 2, 1, 1, 1, 1, 1, 1, 1, 1}, ACL_FLOAT, ACL_FORMAT_ND);
183+ 
184+ auto ut = OP_API_UT(aclnnSWhere, INPUT(conditionDesc, selfDesc, otherDesc), OUTPUT(outDesc));
185+ 
186+ uint64_t workspaceSize = 0;
187+ aclnnStatus getWorkspaceResult = ut.TestGetWorkspaceSize(&workspaceSize);
188+ EXPECT_EQ(getWorkspaceResult, ACLNN_ERR_PARAM_INVALID);
189+}