Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// META: title=validation tests for WebNN API concat operation
// META: global=window,dedicatedworker
// META: script=../resources/utils_validation.js
'use strict';
const tests = [
{
name: '[concat] Test building Concat with one input.',
inputs: [{dataType: 'float32', dimensions: [4,4,3]}],
axis: 2,
output: {dataType: 'float32', dimensions: [4,4,3]}
},
{
name: '[concat] Test building Concat with two inputs',
inputs: [{dataType: 'float32', dimensions: [3,1,5]},
{dataType: 'float32', dimensions: [3,2,5]}],
axis: 1,
output: {dataType: 'float32', dimensions: [3,3,5]}
},
{
name: '[concat] Test building Concat with three inputs',
inputs: [{dataType: 'float32', dimensions: [3,5,1]},
{dataType: 'float32', dimensions: [3,5,2]},
{dataType: 'float32', dimensions: [3,5,3]}],
axis: 2,
output: {dataType: 'float32', dimensions: [3,5,6]}
},
{
name: '[concat] Test building Concat with two 1D inputs.',
inputs: [{dataType: 'float32', dimensions: [1]},
{dataType: 'float32', dimensions: [1]}],
axis: 0,
output: {dataType: 'float32', dimensions: [2]}
},
{
name: '[concat] Throw if the inputs are empty.',
axis: 0,
},
{
name: '[concat] Throw if the argument types are inconsistent.',
inputs: [{dataType: 'float32', dimensions: [1,1]},
{dataType: 'int32', dimensions: [1,1]}],
axis: 0,
},
{
name: '[concat] Throw if the inputs have different ranks.',
inputs: [{dataType: 'float32', dimensions: [1,1]},
{dataType: 'float32', dimensions: [1,1,1]}],
axis: 0,
},
{
name: '[concat] Throw if the axis is equal to or greater than the size of ranks',
inputs: [{dataType: 'float32', dimensions: [1,1]},
{dataType: 'float32', dimensions: [1,1]}],
axis: 2,
},
{
name: '[concat] Throw if concat with two 0-D scalars.',
inputs: [{dataType: 'float32', dimensions: []},
{dataType: 'float32', dimensions: []}],
axis: 0,
},
{
name: '[concat] Throw if the inputs have other axes with different sizes except on the axis.',
inputs: [{dataType: 'float32', dimensions: [1,1,1]},
{dataType: 'float32', dimensions: [1,2,3]}],
axis: 1,
},
];
tests.forEach(test =>
promise_test(async t => {
let inputs = [];
if (test.inputs) {
for (let i = 0; i < test.inputs.length; ++i) {
inputs[i] = builder.input(
`inputs[${i}]`,
{ dataType: test.inputs[i].dataType, dimensions: test.inputs[i].dimensions }
);
}
}
if (test.output) {
const output = builder.concat(inputs, test.axis);
assert_equals(output.dataType(), test.output.dataType);
assert_array_equals(output.shape(), test.output.dimensions);
} else {
assert_throws_js(TypeError, () => builder.concat(inputs, test.axis));
}
}, test.name)
);
multi_builder_test(async (t, builder, otherBuilder) => {
const operandDescriptor = {dataType: 'float32', dimensions: [2, 2]};
const inputFromOtherBuilder = otherBuilder.input('input', operandDescriptor);
const input1 = builder.input('input', operandDescriptor);
const input2 = builder.input('input', operandDescriptor);
const input3 = builder.input('input', operandDescriptor);
assert_throws_js(
TypeError,
() => builder.concat([input1, input2, inputFromOtherBuilder, input3]));
}, '[concat] throw if any input is from another builder');