Files
UnrealEngine/Engine/Source/ThirdParty/MaterialX/MaterialX-1.38.10/javascript/MaterialXTest/element.spec.js
2025-05-18 13:04:45 +08:00

167 lines
5.2 KiB
JavaScript

import { expect } from 'chai';
import Module from './_build/JsMaterialXCore.js';
describe('Element', () =>
{
let mx, doc, valueTypes;
const primitiveValueTypes = {
Integer: 10,
Boolean: true,
String: 'test',
Float: 15,
IntegerArray: [1, 2, 3, 4, 5],
FloatArray: [12, 14], // Not using actual floats to avoid precision problems
StringArray: ['first', 'second'],
BooleanArray: [true, true, false],
}
before(async () =>
{
mx = await Module();
doc = mx.createDocument();
valueTypes = {
Color3: new mx.Color3(1, 0, 0.5),
Color4: new mx.Color4(0, 1, 0.5, 1),
Vector2: new mx.Vector2(0, 1),
Vector3: new mx.Vector3(0, 1, 2),
Vector4: new mx.Vector4(0, 1, 2, 1),
Matrix33: new mx.Matrix33(0, 1, 2, 3, 4, 5, 6, 7, 8),
Matrix44: new mx.Matrix44(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),
};
});
describe('value setters', () =>
{
const checkValue = (types, assertionCallback) =>
{
const elem = doc.addChildOfCategory('geomprop');
Object.keys(types).forEach((typeName) =>
{
const setFn = `setValue${typeName}`;
elem[setFn](types[typeName]);
assertionCallback(elem.getValue().getData(), typeName);
});
};
it('should work with expected type', () =>
{
checkValue(valueTypes, (returnedValue, typeName) =>
{
expect(returnedValue).to.be.an.instanceof(mx[`${typeName}`]);
expect(returnedValue.equals(valueTypes[typeName])).to.equal(true);
});
});
it('should work with expected primitive type', () =>
{
checkValue(primitiveValueTypes, (returnedValue, typeName) =>
{
expect(returnedValue).to.eql(primitiveValueTypes[typeName]);
});
});
it('should fail for incorrect type', () =>
{
const elem = doc.addChildOfCategory('geomprop');
expect(() => elem.Matrix33(true)).to.throw();
});
});
describe('typed value setters', () =>
{
const checkTypes = (types, assertionCallback) =>
{
const elem = doc.addChildOfCategory('geomprop');
Object.keys(types).forEach((typeName) =>
{
const setFn = `setTypedAttribute${typeName}`;
const getFn = `getTypedAttribute${typeName}`;
elem[setFn](typeName, types[typeName]);
assertionCallback(elem[getFn](typeName), types[typeName]);
});
};
it('should work with expected custom type', () =>
{
checkTypes(valueTypes, (returnedValue, originalValue) =>
{
expect(returnedValue.equals(originalValue)).to.equal(true);
});
});
it('should work with expected primitive type', () =>
{
checkTypes(primitiveValueTypes, (returnedValue, originalValue) =>
{
expect(returnedValue).to.eql(originalValue);
});
});
it('should fail for incorrect type', () =>
{
const elem = doc.addChildOfCategory('geomprop');
expect(() => elem.setTypedAttributeColor3('wrongType', true)).to.throw();
});
});
it('factory invocation should match specialized functions', () =>
{
// List based in source/MaterialXCore/Element.cpp
const elemtypeArr = [
'Backdrop',
'Collection',
'GeomInfo',
'MaterialAssign',
'PropertySetAssign',
'Visibility',
'GeomPropDef',
'Look',
'LookGroup',
'PropertySet',
'TypeDef',
'AttributeDef',
'NodeGraph',
'Implementation',
'Node',
'NodeDef',
'Variant',
'Member',
'TargetDef',
'GeomProp',
'Input',
'Output',
'Property',
'PropertyAssign',
'Unit',
'UnitDef',
'UnitTypeDef',
'VariantAssign',
'VariantSet',
];
elemtypeArr.forEach((typeName) =>
{
const specializedFn = `addChild${typeName}`;
const factoryName = typeName.toLowerCase();
const type = mx[typeName];
expect(doc[specializedFn]()).to.be.an.instanceof(type);
expect(doc.addChildOfCategory(factoryName)).to.be.an.instanceof(type);
});
const specialElemType = {
'MaterialX': mx.Document,
'Comment': mx.CommentElement,
'Generic': mx.GenericElement,
};
Object.keys(specialElemType).forEach((typeName) =>
{
const specializedFn = `addChild${typeName}`;
const factoryName = typeName.toLowerCase();
expect(doc[specializedFn]()).to.be.an.instanceof(specialElemType[typeName]);
expect(doc.addChildOfCategory(factoryName)).to.be.an.instanceof(specialElemType[typeName]);
});
});
});