import {
defaultValue,
Cartesian3,
MetadataClassProperty,
MetadataTableProperty,
} from "../../Source/Cesium.js";
import MetadataTester from "../MetadataTester.js";
describe("Scene/MetadataTableProperty", function () {
if (!MetadataTester.isSupported()) {
return;
}
var enums = {
myEnum: {
values: [
{
value: 0,
name: "ValueA",
},
{
value: 1,
name: "ValueB",
},
{
value: 999,
name: "Other",
},
],
},
};
it("creates metadata table property", function () {
var extras = {
other: 0,
};
var extensions = {
EXT_other_extension: {},
};
var property = new MetadataTableProperty({
count: 2,
property: {
bufferView: 0,
extras: extras,
extensions: extensions,
},
classProperty: new MetadataClassProperty({
id: "property",
property: {
type: "FLOAT32",
},
}),
bufferViews: {
0: new Uint8Array(8),
},
});
expect(property.extras).toBe(extras);
expect(property.extensions).toBe(extensions);
});
it("constructor throws without count", function () {
expect(function () {
return new MetadataTableProperty({
property: {},
classProperty: {},
bufferViews: {},
});
}).toThrowDeveloperError();
});
it("constructor throws if count is less than 1", function () {
expect(function () {
return new MetadataTableProperty({
count: 0,
property: {},
classProperty: {},
bufferViews: {},
});
}).toThrowDeveloperError();
});
it("constructor throws without property", function () {
expect(function () {
return new MetadataTableProperty({
count: 1,
classProperty: {},
bufferViews: {},
});
}).toThrowDeveloperError();
});
it("constructor throws without bufferViews", function () {
expect(function () {
return new MetadataTableProperty({
count: 1,
property: {},
classProperty: {},
});
}).toThrowDeveloperError();
});
function testGetUint64(options) {
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
var disableBigIntSupport = options.disableBigIntSupport;
var disableBigUint64ArraySupport = options.disableBigUint64ArraySupport;
var originalValues = [
BigInt(0), // eslint-disable-line
BigInt(10), // eslint-disable-line
BigInt("4611686018427387833"), // eslint-disable-line
BigInt("18446744073709551615"), // eslint-disable-line
];
var expectedValues = originalValues;
if (disableBigUint64ArraySupport && disableBigIntSupport) {
// Precision loss is expected if UINT64 is converted to JS numbers
expectedValues = [0, 10, 4611686018427388000, 18446744073709552000];
}
var classProperty = {
type: "UINT64",
};
var property = MetadataTester.createProperty({
property: classProperty,
values: originalValues,
disableBigUint64ArraySupport: disableBigUint64ArraySupport,
disableBigIntSupport: disableBigIntSupport,
});
var length = originalValues.length;
for (var i = 0; i < length; ++i) {
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
function testGetInt64(options) {
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
var disableBigIntSupport = options.disableBigIntSupport;
var disableBigInt64ArraySupport = options.disableBigInt64ArraySupport;
var originalValues = [
BigInt("-9223372036854775808"), // eslint-disable-line
BigInt("-4611686018427387833"), // eslint-disable-line
BigInt(-10), // eslint-disable-line
BigInt(0), // eslint-disable-line
BigInt(10), // eslint-disable-line
BigInt("4611686018427387833"), // eslint-disable-line
BigInt("9223372036854775807"), // eslint-disable-line
];
var expectedValues = originalValues;
if (disableBigInt64ArraySupport && disableBigIntSupport) {
// Precision loss is expected if INT64 is converted to JS numbers
expectedValues = [
-9223372036854776000,
-4611686018427388000,
-10,
0,
10,
4611686018427388000,
9223372036854776000,
];
}
var classProperty = {
type: "INT64",
};
var property = MetadataTester.createProperty({
property: classProperty,
values: originalValues,
disableBigInt64ArraySupport: disableBigInt64ArraySupport,
disableBigIntSupport: disableBigIntSupport,
});
var length = originalValues.length;
for (var i = 0; i < length; ++i) {
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
it("get returns UINT64 property as BigInt when BigUint64Array is not supported and BigInt is supported", function () {
testGetUint64({
disableBigUint64ArraySupport: true,
});
});
it("get returns UINT64 property as number when BigUint64Array is not supported and BigInt is not supported", function () {
testGetUint64({
disableBigUint64ArraySupport: true,
disableBigIntSupport: true,
});
});
it("get returns INT64 property as BigInt when BigInt64Array is supported and BigInt is supported", function () {
testGetInt64();
});
it("get returns INT64 property as BigInt when BigInt64Array is not supported and BigInt is supported", function () {
testGetInt64({
disableBigInt64ArraySupport: true,
});
});
it("get returns INT64 property as number when BigInt64Array is not supported and BigInt is not supported", function () {
testGetInt64({
disableBigInt64ArraySupport: true,
disableBigIntSupport: true,
});
});
it("get returns single values", function () {
// INT64 and UINT64 are tested above
var properties = {
propertyInt8: {
type: "INT8",
},
propertyUint8: {
type: "UINT8",
},
propertyInt16: {
type: "INT16",
},
propertyUint16: {
type: "UINT16",
},
propertyInt32: {
type: "INT32",
},
propertyUint32: {
type: "UINT32",
},
propertyFloat32: {
type: "FLOAT32",
},
propertyFloat64: {
type: "FLOAT64",
},
propertyBoolean: {
type: "BOOLEAN",
},
propertyString: {
type: "STRING",
},
propertyEnum: {
type: "ENUM",
enumType: "myEnum",
},
};
var propertyValues = {
propertyInt8: [-128, -10, 0, 10, 127],
propertyUint8: [0, 10, 20, 30, 255],
propertyInt16: [-32768, -10, 0, 10, 32767],
propertyUint16: [0, 10, 20, 30, 65535],
propertyInt32: [-2147483648, -10, 0, 10, 2147483647],
propertyUint32: [0, 10, 20, 30, 4294967295],
propertyFloat32: [-2.5, -1.0, 0.0, 700.0, Number.POSITIVE_INFINITY],
propertyFloat64: [-234934.12, -1.0, 0.0, 700.0, Number.POSITIVE_INFINITY],
propertyBoolean: [false, true, false, true, false],
propertyString: ["おはようございます。😃", "a", "", "def", "0001"],
propertyEnum: ["ValueA", "ValueB", "Other", "ValueA", "ValueA"],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = propertyValues[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("get returns vectors", function () {
var properties = {
propertyInt8: {
type: "ARRAY",
componentType: "INT8",
componentCount: 3,
},
propertyUint8: {
type: "ARRAY",
componentType: "UINT8",
componentCount: 3,
},
propertyInt16: {
type: "ARRAY",
componentType: "INT16",
componentCount: 3,
},
propertyUint16: {
type: "ARRAY",
componentType: "UINT16",
componentCount: 3,
},
propertyInt32: {
type: "ARRAY",
componentType: "INT32",
componentCount: 3,
},
propertyUint32: {
type: "ARRAY",
componentType: "UINT32",
componentCount: 3,
},
propertyFloat32: {
type: "ARRAY",
componentType: "FLOAT32",
componentCount: 3,
},
propertyFloat64: {
type: "ARRAY",
componentType: "FLOAT64",
componentCount: 3,
},
};
var propertyValues = {
propertyInt8: [
[-2, -1, 0],
[1, 2, 3],
],
propertyUint8: [
[0, 1, 2],
[3, 4, 5],
],
propertyInt16: [
[-2, -1, 0],
[1, 2, 3],
],
propertyUint16: [
[0, 1, 2],
[3, 4, 5],
],
propertyInt32: [
[-2, -1, 0],
[1, 2, 3],
],
propertyUint32: [
[0, 1, 2],
[3, 4, 5],
],
propertyFloat32: [
[-2.0, -1.0, 0.0],
[1.0, 2.0, 3.0],
],
propertyFloat64: [
[-2.0, -1.0, 0.0],
[1.0, 2.0, 3.0],
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = propertyValues[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
var value = property.get(i);
expect(value).toEqual(Cartesian3.unpack(expectedValues[i]));
}
}
}
});
it("get returns fixed size arrays", function () {
var properties = {
propertyInt64: {
type: "ARRAY",
componentType: "INT64",
componentCount: 3,
},
propertyUint64: {
type: "ARRAY",
componentType: "UINT64",
componentCount: 3,
},
propertyBoolean: {
type: "ARRAY",
componentType: "BOOLEAN",
componentCount: 3,
},
propertyString: {
type: "ARRAY",
componentType: "STRING",
componentCount: 3,
},
propertyEnum: {
type: "ARRAY",
componentType: "ENUM",
enumType: "myEnum",
componentCount: 3,
},
};
var propertyValues = {
propertyInt64: [
[BigInt(-2), BigInt(-1), BigInt(0)], // eslint-disable-line
[BigInt(1), BigInt(2), BigInt(3)], // eslint-disable-line
],
propertyUint64: [
[BigInt(0), BigInt(1), BigInt(2)], // eslint-disable-line
[BigInt(3), BigInt(4), BigInt(5)], // eslint-disable-line
],
propertyBoolean: [
[false, true, false],
[true, false, true],
],
propertyString: [
["a", "bc", "def"],
["dog", "cat", "😃😃😃"],
],
propertyEnum: [
["ValueA", "ValueB", "Other"],
["ValueA", "ValueA", "ValueA"],
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = propertyValues[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("get returns variable size arrays", function () {
var properties = {
propertyInt8: {
type: "ARRAY",
componentType: "INT8",
},
propertyUint8: {
type: "ARRAY",
componentType: "UINT8",
},
propertyInt16: {
type: "ARRAY",
componentType: "INT16",
},
propertyUint16: {
type: "ARRAY",
componentType: "UINT16",
},
propertyInt32: {
type: "ARRAY",
componentType: "INT32",
},
propertyUint32: {
type: "ARRAY",
componentType: "UINT32",
},
propertyInt64: {
type: "ARRAY",
componentType: "INT64",
},
propertyUint64: {
type: "ARRAY",
componentType: "UINT64",
},
propertyFloat32: {
type: "ARRAY",
componentType: "FLOAT32",
},
propertyFloat64: {
type: "ARRAY",
componentType: "FLOAT64",
},
propertyBoolean: {
type: "ARRAY",
componentType: "BOOLEAN",
},
propertyString: {
type: "ARRAY",
componentType: "STRING",
},
propertyEnum: {
type: "ARRAY",
componentType: "ENUM",
enumType: "myEnum",
},
};
// Tests empty arrays as well
var propertyValues = {
propertyInt8: [[-2], [-1, 0], [1, 2, 3], []],
propertyUint8: [[0], [1, 2], [3, 4, 5], []],
propertyInt16: [[-2], [-1, 0], [1, 2, 3], []],
propertyUint16: [[0], [1, 2], [3, 4, 5], []],
propertyInt32: [[-2], [-1, 0], [1, 2, 3], []],
propertyUint32: [[0], [1, 2], [3, 4, 5], []],
propertyInt64: [
[BigInt(-2)], // eslint-disable-line
[BigInt(-1), BigInt(0)], // eslint-disable-line
[BigInt(1), BigInt(2), BigInt(3)], // eslint-disable-line
[],
],
propertyUint64: [
[BigInt(0)], // eslint-disable-line
[BigInt(1), BigInt(2)], // eslint-disable-line
[BigInt(3), BigInt(4), BigInt(5)], // eslint-disable-line
[],
],
propertyFloat32: [[-2.0], [-1.0, 0.0], [1.0, 2.0, 3.0], []],
propertyFloat64: [[-2.0], [-1.0, 0.0], [1.0, 2.0, 3.0], []],
propertyBoolean: [[false], [true, false], [true, false, true], []],
propertyString: [["a"], ["bc", "def"], ["dog", "cat", "😃😃😃"], []],
propertyEnum: [
["ValueA"],
["ValueB", "Other"],
["ValueA", "ValueA", "ValueA"],
[],
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = propertyValues[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("get returns normalized value", function () {
var propertyInt8 = MetadataTester.createProperty({
property: {
type: "INT8",
normalized: true,
},
values: [-128],
});
var propertyUint8 = MetadataTester.createProperty({
property: {
type: "UINT8",
normalized: true,
},
values: [255],
});
expect(propertyInt8.get(0)).toBe(-1.0);
expect(propertyUint8.get(0)).toBe(1.0);
});
it("get throws without index", function () {
var property = MetadataTester.createProperty({
property: {
type: "FLOAT32",
},
values: [1.0, 2.0],
});
expect(function () {
property.get();
}).toThrowDeveloperError();
});
it("get throws if index is out of bounds", function () {
var property = MetadataTester.createProperty({
property: {
type: "FLOAT32",
},
values: [1.0, 2.0],
});
expect(property.get(0)).toBe(1.0);
expect(property.get(1)).toBe(2.0);
expect(function () {
property.get(2);
}).toThrowDeveloperError();
});
it("set sets single values", function () {
var properties = {
propertyInt8: {
type: "INT8",
},
propertyUint8: {
type: "UINT8",
},
propertyInt16: {
type: "INT16",
},
propertyUint16: {
type: "UINT16",
},
propertyInt32: {
type: "INT32",
},
propertyUint32: {
type: "UINT32",
},
propertyInt64: {
type: "INT64",
},
propertyUint64: {
type: "UINT64",
},
propertyFloat32: {
type: "FLOAT32",
},
propertyFloat64: {
type: "FLOAT64",
},
propertyBoolean: {
type: "BOOLEAN",
},
propertyString: {
type: "STRING",
},
propertyEnum: {
type: "ENUM",
enumType: "myEnum",
},
};
var propertyValues = {
propertyInt8: [0, 0, 0, 0, 0],
propertyUint8: [0, 0, 0, 0, 0],
propertyInt16: [0, 0, 0, 0, 0],
propertyUint16: [0, 0, 0, 0, 0],
propertyInt32: [0, 0, 0, 0, 0],
propertyUint32: [0, 0, 0, 0, 0],
propertyInt64: [BigInt(0), BigInt(0), BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
propertyUint64: [BigInt(0), BigInt(0), BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
propertyFloat32: [0.0, 0.0, 0.0, 0.0, 0.0],
propertyFloat64: [0.0, 0.0, 0.0, 0.0, 0.0],
propertyBoolean: [false, false, true, false, true],
propertyString: ["", "", "", "", ""],
propertyEnum: ["Other", "Other", "Other", "Other", "Other"],
};
var valuesToSet = {
propertyInt8: [-128, -10, 0, 10, 127],
propertyUint8: [0, 10, 20, 30, 255],
propertyInt16: [-32768, -10, 0, 10, 32767],
propertyUint16: [0, 10, 20, 30, 65535],
propertyInt32: [-2147483648, -10, 0, 10, 2147483647],
propertyUint32: [0, 10, 20, 30, 4294967295],
propertyInt64: [
BigInt("-9223372036854775808"), // eslint-disable-line
BigInt("-4611686018427387833"), // eslint-disable-line
BigInt(0), // eslint-disable-line
BigInt("4611686018427387833"), // eslint-disable-line
BigInt("9223372036854775807"), // eslint-disable-line
],
propertyUint64: [
BigInt(0), // eslint-disable-line
BigInt(10), // eslint-disable-line
BigInt(100), // eslint-disable-line
BigInt("4611686018427387833"), // eslint-disable-line
BigInt("18446744073709551615"), // eslint-disable-line
],
propertyFloat32: [-2.5, -1.0, 0.0, 700.0, Number.POSITIVE_INFINITY],
propertyFloat64: [-234934.12, -1.0, 0.0, 700.0, Number.POSITIVE_INFINITY],
propertyBoolean: [true, true, false, false, true],
propertyString: ["おはようございます。😃", "a", "", "def", "0001"],
propertyEnum: ["ValueA", "ValueB", "Other", "ValueA", "ValueA"],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = valuesToSet[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
property.set(i, expectedValues[i]);
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
// Test setting / getting again
property.set(i, expectedValues[i]);
value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("set sets vector values", function () {
var properties = {
propertyInt8: {
type: "ARRAY",
componentType: "INT8",
componentCount: 3,
},
propertyUint8: {
type: "ARRAY",
componentType: "UINT8",
componentCount: 3,
},
propertyInt16: {
type: "ARRAY",
componentType: "INT16",
componentCount: 3,
},
propertyUint16: {
type: "ARRAY",
componentType: "UINT16",
componentCount: 3,
},
propertyInt32: {
type: "ARRAY",
componentType: "INT32",
componentCount: 3,
},
propertyUint32: {
type: "ARRAY",
componentType: "UINT32",
componentCount: 3,
},
propertyFloat32: {
type: "ARRAY",
componentType: "FLOAT32",
componentCount: 3,
},
propertyFloat64: {
type: "ARRAY",
componentType: "FLOAT64",
componentCount: 3,
},
};
var propertyValues = {
propertyInt8: [
[0, 0, 0],
[0, 0, 0],
],
propertyUint8: [
[0, 0, 0],
[0, 0, 0],
],
propertyInt16: [
[0, 0, 0],
[0, 0, 0],
],
propertyUint16: [
[0, 0, 0],
[0, 0, 0],
],
propertyInt32: [
[0, 0, 0],
[0, 0, 0],
],
propertyUint32: [
[0, 0, 0],
[0, 0, 0],
],
propertyFloat32: [
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
],
propertyFloat64: [
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
],
};
var valuesToSet = {
propertyInt8: [new Cartesian3(-2, -1, 0), new Cartesian3(1, 2, 3)],
propertyUint8: [new Cartesian3(0, 1, 2), new Cartesian3(3, 4, 5)],
propertyInt16: [new Cartesian3(-2, -1, 0), new Cartesian3(1, 2, 3)],
propertyUint16: [new Cartesian3(0, 1, 2), new Cartesian3(3, 4, 5)],
propertyInt32: [new Cartesian3(-2, -1, 0), new Cartesian3(1, 2, 3)],
propertyUint32: [new Cartesian3(0, 1, 2), new Cartesian3(3, 4, 5)],
propertyFloat32: [
new Cartesian3(-2.0, -1.0, 0.0),
new Cartesian3(1.0, 2.0, 3.0),
],
propertyFloat64: [
new Cartesian3(-2.0, -1.0, 0.0),
new Cartesian3(1.0, 2.0, 3.0),
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = valuesToSet[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
property.set(i, expectedValues[i]);
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
// Test setting / getting again
property.set(i, expectedValues[i]);
value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("set sets fixed size arrays", function () {
var properties = {
propertyInt64: {
type: "ARRAY",
componentType: "INT64",
componentCount: 3,
},
propertyUint64: {
type: "ARRAY",
componentType: "UINT64",
componentCount: 3,
},
propertyBoolean: {
type: "ARRAY",
componentType: "BOOLEAN",
componentCount: 3,
},
propertyString: {
type: "ARRAY",
componentType: "STRING",
componentCount: 3,
},
propertyEnum: {
type: "ARRAY",
componentType: "ENUM",
enumType: "myEnum",
componentCount: 3,
},
};
var propertyValues = {
propertyInt64: [
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
],
propertyUint64: [
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
],
propertyBoolean: [
[false, false, false],
[true, true, true],
],
propertyString: [
["", "", ""],
["", "", ""],
],
propertyEnum: [
["Other", "Other", "Other"],
["Other", "Other", "Other"],
],
};
var valuesToSet = {
propertyInt64: [
[BigInt(-2), BigInt(-1), BigInt(0)], // eslint-disable-line
[BigInt(1), BigInt(2), BigInt(3)], // eslint-disable-line
],
propertyUint64: [
[BigInt(0), BigInt(1), BigInt(2)], // eslint-disable-line
[BigInt(3), BigInt(4), BigInt(5)], // eslint-disable-line
],
propertyBoolean: [
[false, true, false],
[true, false, true],
],
propertyString: [
["a", "bc", "def"],
["dog", "cat", "😃😃😃"],
],
propertyEnum: [
["ValueA", "ValueB", "Other"],
["ValueA", "ValueA", "ValueA"],
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = valuesToSet[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
property.set(i, expectedValues[i]);
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
// Test setting / getting again
property.set(i, expectedValues[i]);
value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("set sets variable size arrays with arrays of the same length", function () {
var properties = {
propertyInt8: {
type: "ARRAY",
componentType: "INT8",
},
propertyUint8: {
type: "ARRAY",
componentType: "UINT8",
},
propertyInt16: {
type: "ARRAY",
componentType: "INT16",
},
propertyUint16: {
type: "ARRAY",
componentType: "UINT16",
},
propertyInt32: {
type: "ARRAY",
componentType: "INT32",
},
propertyUint32: {
type: "ARRAY",
componentType: "UINT32",
},
propertyInt64: {
type: "ARRAY",
componentType: "INT64",
},
propertyUint64: {
type: "ARRAY",
componentType: "UINT64",
},
propertyFloat32: {
type: "ARRAY",
componentType: "FLOAT32",
},
propertyFloat64: {
type: "ARRAY",
componentType: "FLOAT64",
},
propertyBoolean: {
type: "ARRAY",
componentType: "BOOLEAN",
},
propertyString: {
type: "ARRAY",
componentType: "STRING",
},
propertyEnum: {
type: "ARRAY",
componentType: "ENUM",
enumType: "myEnum",
},
};
var propertyValues = {
propertyInt8: [[0], [0, 0], [0, 0, 0], []],
propertyUint8: [[0], [0, 0], [0, 0, 0], []],
propertyInt16: [[0], [0, 0], [0, 0, 0], []],
propertyUint16: [[0], [0, 0], [0, 0, 0], []],
propertyInt32: [[0], [0, 0], [0, 0, 0], []],
propertyUint32: [[0], [0, 0], [0, 0, 0], []],
propertyInt64: [
[BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
[],
],
propertyUint64: [
[BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
[],
],
propertyFloat32: [[0.0], [0.0, 0.0], [0.0, 0.0, 0.0], []],
propertyFloat64: [[0.0], [0.0, 0.0], [0.0, 0.0, 0.0], []],
propertyBoolean: [[false], [false, false], [false, false, false], []],
propertyString: [[""], ["", ""], ["", "", ""], []],
propertyEnum: [
["Other"],
["Other", "Other"],
["Other", "Other", "Other"],
[],
],
};
var valuesToSet = {
propertyInt8: [[-2], [-1, 0], [1, 2, 3], []],
propertyUint8: [[0], [1, 2], [3, 4, 5], []],
propertyInt16: [[-2], [-1, 0], [1, 2, 3], []],
propertyUint16: [[0], [1, 2], [3, 4, 5], []],
propertyInt32: [[-2], [-1, 0], [1, 2, 3], []],
propertyUint32: [[0], [1, 2], [3, 4, 5], []],
propertyInt64: [
[BigInt(-2)], // eslint-disable-line
[BigInt(-1), BigInt(0)], // eslint-disable-line
[BigInt(1), BigInt(2), BigInt(3)], // eslint-disable-line
[],
],
propertyUint64: [
[BigInt(0)], // eslint-disable-line
[BigInt(1), BigInt(2)], // eslint-disable-line
[BigInt(3), BigInt(4), BigInt(5)], // eslint-disable-line
[],
],
propertyFloat32: [[-2.0], [-1.0, 0.0], [1.0, 2.0, 3.0], []],
propertyFloat64: [[-2.0], [-1.0, 0.0], [1.0, 2.0, 3.0], []],
propertyBoolean: [[false], [true, false], [true, false, true], []],
propertyString: [["a"], ["bc", "def"], ["dog", "cat", "😃😃😃"], []],
propertyEnum: [
["ValueA"],
["ValueB", "Other"],
["ValueA", "ValueA", "ValueA"],
[],
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = valuesToSet[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
property.set(i, expectedValues[i]);
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
// Test setting / getting again
property.set(i, expectedValues[i]);
value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("set sets variable size arrays with arrays of different lengths", function () {
var properties = {
propertyInt8: {
type: "ARRAY",
componentType: "INT8",
},
propertyUint8: {
type: "ARRAY",
componentType: "UINT8",
},
propertyInt16: {
type: "ARRAY",
componentType: "INT16",
},
propertyUint16: {
type: "ARRAY",
componentType: "UINT16",
},
propertyInt32: {
type: "ARRAY",
componentType: "INT32",
},
propertyUint32: {
type: "ARRAY",
componentType: "UINT32",
},
propertyInt64: {
type: "ARRAY",
componentType: "INT64",
},
propertyUint64: {
type: "ARRAY",
componentType: "UINT64",
},
propertyFloat32: {
type: "ARRAY",
componentType: "FLOAT32",
},
propertyFloat64: {
type: "ARRAY",
componentType: "FLOAT64",
},
propertyBoolean: {
type: "ARRAY",
componentType: "BOOLEAN",
},
propertyString: {
type: "ARRAY",
componentType: "STRING",
},
propertyEnum: {
type: "ARRAY",
componentType: "ENUM",
enumType: "myEnum",
},
};
var propertyValues = {
propertyInt8: [[0], [0, 0], [0, 0, 0], []],
propertyUint8: [[0], [0, 0], [0, 0, 0], []],
propertyInt16: [[0], [0, 0], [0, 0, 0], []],
propertyUint16: [[0], [0, 0], [0, 0, 0], []],
propertyInt32: [[0], [0, 0], [0, 0, 0], []],
propertyUint32: [[0], [0, 0], [0, 0, 0], []],
propertyInt64: [
[BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
[],
],
propertyUint64: [
[BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0)], // eslint-disable-line
[BigInt(0), BigInt(0), BigInt(0)], // eslint-disable-line
[],
],
propertyFloat32: [[0.0], [0.0, 0.0], [0.0, 0.0, 0.0], []],
propertyFloat64: [[0.0], [0.0, 0.0], [0.0, 0.0, 0.0], []],
propertyBoolean: [[false], [false, false], [false, false, false], []],
propertyString: [[""], ["", ""], ["", "", ""], []],
propertyEnum: [
["Other"],
["Other", "Other"],
["Other", "Other", "Other"],
[],
],
};
var valuesToSet = {
propertyInt8: [[1, 2, 3], [], [-2], [-1, 0]],
propertyUint8: [[3, 4, 5], [0], [], [1, 2]],
propertyInt16: [[], [1, 2, 3], [-2], [-1, 0]],
propertyUint16: [[3, 4, 5], [1, 2], [], [0]],
propertyInt32: [[1, 2, 3], [], [-2], [-1, 0]],
propertyUint32: [[0], [3, 4, 5], [1, 2], []],
propertyInt64: [
[BigInt(-1), BigInt(0)], // eslint-disable-line
[BigInt(-2)], // eslint-disable-line
[],
[BigInt(1), BigInt(2), BigInt(3)], // eslint-disable-line
],
propertyUint64: [
[BigInt(0)], // eslint-disable-line
[],
[BigInt(1), BigInt(2)], // eslint-disable-line
[BigInt(3), BigInt(4), BigInt(5)], // eslint-disable-line
],
propertyFloat32: [[-1.0, 0.0], [1.0, 2.0, 3.0], [], [-2.0]],
propertyFloat64: [[-2.0], [1.0, 2.0, 3.0], [-1.0, 0.0], []],
propertyBoolean: [[true, false, true], [], [false], [true, false]],
propertyString: [[], ["bc", "def"], ["a"], ["dog", "cat", "😃😃😃"]],
propertyEnum: [
[],
["ValueA", "ValueA", "ValueA"],
["ValueA"],
["ValueB", "Other"],
],
};
for (var propertyId in properties) {
if (properties.hasOwnProperty(propertyId)) {
var property = MetadataTester.createProperty({
property: properties[propertyId],
values: propertyValues[propertyId],
enums: enums,
});
var expectedValues = valuesToSet[propertyId];
var length = expectedValues.length;
for (var i = 0; i < length; ++i) {
property.set(i, expectedValues[i]);
var value = property.get(i);
expect(value).toEqual(expectedValues[i]);
// Test setting / getting again
property.set(i, expectedValues[i]);
value = property.get(i);
expect(value).toEqual(expectedValues[i]);
}
}
}
});
it("set sets Infinity for FLOAT32 and FLOAT64", function () {
var propertyFloat32 = MetadataTester.createProperty({
property: {
type: "FLOAT32",
},
values: [0.0, 0.0],
});
var propertyFloat64 = MetadataTester.createProperty({
property: {
type: "FLOAT64",
},
values: [0.0, 0.0],
});
propertyFloat32.set(0, Number.POSITIVE_INFINITY);
propertyFloat32.set(1, Number.NEGATIVE_INFINITY);
propertyFloat64.set(0, Number.POSITIVE_INFINITY);
propertyFloat64.set(1, Number.NEGATIVE_INFINITY);
expect(propertyFloat32.get(0)).toBe(Number.POSITIVE_INFINITY);
expect(propertyFloat32.get(1)).toBe(Number.NEGATIVE_INFINITY);
expect(propertyFloat64.get(0)).toBe(Number.POSITIVE_INFINITY);
expect(propertyFloat64.get(1)).toBe(Number.NEGATIVE_INFINITY);
});
it("set sets NaN for FLOAT32 and FLOAT64", function () {
var propertyFloat32 = MetadataTester.createProperty({
property: {
type: "FLOAT32",
},
values: [0.0],
});
var propertyFloat64 = MetadataTester.createProperty({
property: {
type: "FLOAT64",
},
values: [0.0],
});
propertyFloat32.set(0, NaN);
propertyFloat64.set(0, NaN);
expect(isNaN(propertyFloat32.get(0))).toBe(true);
expect(isNaN(propertyFloat64.get(0))).toBe(true);
});
it("set sets value for normalized property", function () {
var propertyInt8 = MetadataTester.createProperty({
property: {
type: "INT8",
normalized: true,
},
values: [0],
});
var propertyUint8 = MetadataTester.createProperty({
property: {
type: "UINT8",
normalized: true,
},
values: [255],
});
propertyInt8.set(0, -1.0);
propertyUint8.get(0, 1.0);
expect(propertyInt8.get(0)).toBe(-1.0);
expect(propertyUint8.get(0)).toBe(1.0);
});
it("set throws without index", function () {
var property = MetadataTester.createProperty({
property: {
type: "FLOAT32",
},
values: [1.0, 2.0],
});
expect(function () {
property.set();
}).toThrowDeveloperError();
});
it("set throws if index is out of bounds", function () {
var property = MetadataTester.createProperty({
property: {
type: "FLOAT32",
},
values: [1.0, 2.0],
});
expect(function () {
property.set(-1, 0.0);
}).toThrowDeveloperError();
property.set(0, 0.0);
property.set(1, 0.0);
expect(function () {
property.set(2, 0.0);
}).toThrowDeveloperError();
});
it("set throws if value doesn't conform to the class property", function () {
var property = MetadataTester.createProperty({
property: {
type: "ARRAY",
componentType: "FLOAT32",
componentCount: 3,
},
values: [[1.0, 2.0, 3.0]],
});
expect(function () {
property.set(0, 8.0);
}).toThrowDeveloperError();
});
it("getTypedArray returns typed array", function () {
var propertyInt32 = {
type: "ARRAY",
componentType: "INT32",
componentCount: 3,
};
var propertyValues = [
[-2, -1, 0],
[1, 2, 3],
];
var expectedTypedArray = new Int32Array([-2, -1, 0, 1, 2, 3]);
var property = MetadataTester.createProperty({
property: propertyInt32,
values: propertyValues,
});
expect(property.getTypedArray()).toEqual(expectedTypedArray);
});
it("getTypedArray returns undefined if values are unpacked", function () {
var propertyInt32 = {
type: "ARRAY",
componentType: "INT32",
};
var propertyValues = [
[-2, -1, 0],
[1, 2, 3],
];
var expectedTypedArray = new Int32Array([-2, -1, 0, 1, 2, 3]);
var property = MetadataTester.createProperty({
property: propertyInt32,
values: propertyValues,
});
expect(property.getTypedArray()).toEqual(expectedTypedArray);
// Variable-size arrays are unpacked on set
property.set(0, [-2, -1]);
expect(property.getTypedArray()).toBeUndefined();
});
});