167 lines
5.2 KiB
JavaScript
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]);
|
|
});
|
|
});
|
|
});
|