3 #include "testing/testing.h"
12 class AddFunction :
public MultiFunction {
16 static MFSignature signature = create_signature();
17 this->set_signature(&signature);
20 static MFSignature create_signature()
22 MFSignatureBuilder signature(
"Add");
23 signature.single_input<
int>(
"A");
24 signature.single_input<
int>(
"B");
25 signature.single_output<
int>(
"Result");
26 return signature.build();
31 const VArray<int> &
a =
params.readonly_single_input<
int>(0,
"A");
32 const VArray<int> &
b =
params.readonly_single_input<
int>(1,
"B");
33 MutableSpan<int>
result =
params.uninitialized_single_output<
int>(2,
"Result");
41 TEST(multi_function, AddFunction)
45 Array<int> input1 = {4, 5, 6};
46 Array<int> input2 = {10, 20, 30};
49 MFParamsBuilder
params(fn, 3);
50 params.add_readonly_single_input(input1.as_span());
51 params.add_readonly_single_input(input2.as_span());
52 params.add_uninitialized_single_output(
output.as_mutable_span());
63 TEST(multi_function, AddPrefixFunction)
67 Array<std::string> strings = {
71 "Another much longer string to trigger an allocation",
74 std::string prefix =
"AB";
76 MFParamsBuilder
params(fn, strings.size());
77 params.add_readonly_single_input(&prefix);
78 params.add_single_mutable(strings.as_mutable_span());
86 EXPECT_EQ(strings[2],
"ABThis is a test");
87 EXPECT_EQ(strings[3],
"ABAnother much longer string to trigger an allocation");
90 TEST(multi_function, CreateRangeFunction)
92 CreateRangeFunction fn;
94 GVectorArray ranges(CPPType::get<int>(), 5);
95 GVectorArray_TypedMutableRef<int> ranges_ref{ranges};
96 Array<int> sizes = {3, 0, 6, 1, 4};
98 MFParamsBuilder
params(fn, ranges.size());
99 params.add_readonly_single_input(sizes.as_span());
100 params.add_vector_output(ranges);
119 TEST(multi_function, GenericAppendFunction)
121 GenericAppendFunction fn(CPPType::get<int32_t>());
123 GVectorArray vectors(CPPType::get<int32_t>(), 4);
124 GVectorArray_TypedMutableRef<int> vectors_ref{vectors};
125 vectors_ref.append(0, 1);
126 vectors_ref.append(0, 2);
127 vectors_ref.append(2, 6);
128 Array<int> values = {5, 7, 3, 1};
130 MFParamsBuilder
params(fn, vectors.size());
131 params.add_vector_mutable(vectors);
132 params.add_readonly_single_input(values.as_span());
152 TEST(multi_function, CustomMF_SI_SO)
154 CustomMF_SI_SO<std::string, uint> fn(
"strlen",
155 [](
const std::string &
str) {
return str.size(); });
157 Array<std::string> strings = {
"hello",
"world",
"test",
"another test"};
158 Array<uint> sizes(strings.size(), 0);
160 MFParamsBuilder
params(fn, strings.size());
161 params.add_readonly_single_input(strings.as_span());
162 params.add_uninitialized_single_output(sizes.as_mutable_span());
174 TEST(multi_function, CustomMF_SI_SI_SO)
176 CustomMF_SI_SI_SO<int, int, int> fn(
"mul", [](
int a,
int b) {
return a *
b; });
178 Array<int> values_a = {4, 6, 8, 9};
180 Array<int>
outputs(values_a.size(), -1);
182 MFParamsBuilder
params(fn, values_a.size());
183 params.add_readonly_single_input(values_a.as_span());
184 params.add_readonly_single_input(&value_b);
185 params.add_uninitialized_single_output(
outputs.as_mutable_span());
197 TEST(multi_function, CustomMF_SI_SI_SI_SO)
199 CustomMF_SI_SI_SI_SO<int, std::string, bool, uint> fn{
201 [](
int a,
const std::string &
b,
bool c) {
return (
uint)((
uint)
a +
b.size() + (
uint)
c); }};
203 Array<int> values_a = {5, 7, 3, 8};
204 Array<std::string> values_b = {
"hello",
"world",
"another",
"test"};
205 Array<bool> values_c = {
true,
false,
false,
true};
206 Array<uint>
outputs(values_a.size(), 0);
208 MFParamsBuilder
params(fn, values_a.size());
209 params.add_readonly_single_input(values_a.as_span());
210 params.add_readonly_single_input(values_b.as_span());
211 params.add_readonly_single_input(values_c.as_span());
212 params.add_uninitialized_single_output(
outputs.as_mutable_span());
224 TEST(multi_function, CustomMF_SM)
226 CustomMF_SM<std::string> fn(
"AddSuffix", [](std::string &value) { value +=
" test"; });
228 Array<std::string> values = {
"a",
"b",
"c",
"d",
"e"};
230 MFParamsBuilder
params(fn, values.size());
231 params.add_single_mutable(values.as_mutable_span());
244 TEST(multi_function, CustomMF_Constant)
246 CustomMF_Constant<int> fn{42};
251 params.add_uninitialized_single_output(
outputs.as_mutable_span());
263 TEST(multi_function, CustomMF_GenericConstant)
266 CustomMF_GenericConstant fn{CPPType::get<int32_t>(), (
const void *)&value,
false};
271 params.add_uninitialized_single_output(
outputs.as_mutable_span());
283 TEST(multi_function, CustomMF_GenericConstantArray)
285 std::array<int, 4> values = {3, 4, 5, 6};
286 CustomMF_GenericConstantArray fn{GSpan(
Span(values))};
288 GVectorArray vector_array{CPPType::get<int32_t>(), 4};
289 GVectorArray_TypedMutableRef<int> vector_array_ref{vector_array};
291 MFParamsBuilder
params(fn, vector_array.size());
292 params.add_vector_output(vector_array);
302 for (
int i = 1; i < 4; i++) {
310 TEST(multi_function, IgnoredOutputs)
312 OptionalOutputsFunction fn;
314 MFParamsBuilder
params(fn, 10);
315 params.add_ignored_single_output(
"Out 1");
316 params.add_ignored_single_output(
"Out 2");
321 Array<int> results_1(10);
322 Array<std::string> results_2(10, NoInitialization());
324 MFParamsBuilder
params(fn, 10);
325 params.add_uninitialized_single_output(results_1.as_mutable_span(),
"Out 1");
326 params.add_uninitialized_single_output(results_2.as_mutable_span(),
"Out 2");
333 EXPECT_EQ(results_2[0],
"hello, this is a long string");
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
ccl_global KernelShaderEvalInput ccl_global float * output
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)
TEST(field, ConstantFunction)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
static bNodeSocketTemplate outputs[]