Browse Source

Trade: properly test all constexpr SceneFieldData constructors.

pull/601/head
Vladimír Vondruš 3 years ago
parent
commit
8b058faae2
  1. 204
      src/Magnum/Trade/Test/SceneDataTest.cpp

204
src/Magnum/Trade/Test/SceneDataTest.cpp

@ -804,16 +804,8 @@ void SceneDataTest::debugFieldFlagsSupersets() {
}
}
const UnsignedShort RotationMapping2D[3] {
17,
35,
98
};
constexpr Complexd RotationField2D[3] {
Complexd{Constantsd::sqrtHalf(), Constantsd::sqrtHalf()}, /* 45° */
Complexd{1.0, 0.0}, /* 0° */
Complexd{0.0, 1.0}, /* 90° */
};
constexpr UnsignedShort RotationMapping2D[3]{};
constexpr Complexd RotationField2D[3]{};
void SceneDataTest::constructField() {
const UnsignedShort rotationMappingData[3]{};
@ -843,13 +835,14 @@ void SceneDataTest::constructField() {
CORRADE_COMPARE(rotations.fieldData(someArray).stride(), sizeof(Complexd));
CORRADE_COMPARE(rotations.fieldData(someArray).data(), rotationFieldData);
#ifndef CORRADE_MSVC2015_COMPATIBILITY /* Won't bother anymore */
constexpr SceneFieldData crotations{SceneField::Rotation, Containers::arrayView(RotationMapping2D), Containers::arrayView(RotationField2D), SceneFieldFlag::ImplicitMapping};
constexpr SceneField name = crotations.name();
constexpr SceneFieldFlags flags = crotations.flags();
constexpr std::size_t size = crotations.size();
constexpr SceneMappingType mappingType = crotations.mappingType();
CORRADE_COMPARE(name, SceneField::Rotation);
CORRADE_COMPARE(flags, SceneFieldFlag::ImplicitMapping);
CORRADE_COMPARE(size, 3);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedShort);
/* These are not marked constexpr because it'd work only partially, not for
string fields (tested in constructFieldOffsetOnlyString()) */
@ -864,7 +857,6 @@ void SceneDataTest::constructField() {
CORRADE_COMPARE(crotations.fieldData().size(), 3);
CORRADE_COMPARE(crotations.fieldData().stride(), sizeof(Complexd));
CORRADE_COMPARE(crotations.fieldData().data(), RotationField2D);
#endif
}
void SceneDataTest::constructFieldDefault() {
@ -999,6 +991,9 @@ void SceneDataTest::constructFieldStringNegativeOffset() {
CORRADE_COMPARE(names.stringData(someArray), static_cast<const void*>(data.nameString));
}
constexpr char ScalingMappingData[3*sizeof(UnsignedLong)]{};
constexpr char ScalingFieldData[3*sizeof(Vector3)]{};
void SceneDataTest::constructFieldTypeErased() {
const UnsignedLong scalingMappingData[3]{};
const Vector3 scalingFieldData[3];
@ -1015,6 +1010,30 @@ void SceneDataTest::constructFieldTypeErased() {
CORRADE_COMPARE(scalings.fieldData().size(), 3);
CORRADE_COMPARE(scalings.fieldData().stride(), sizeof(Vector3));
CORRADE_COMPARE(scalings.fieldData().data(), scalingFieldData);
constexpr SceneFieldData cscalings{SceneField::Scaling, SceneMappingType::UnsignedLong, Containers::StridedArrayView1D<const void>{ScalingMappingData, 3, sizeof(UnsignedLong)}, SceneFieldType::Vector3, Containers::StridedArrayView1D<const void>{ScalingFieldData, 3, sizeof(Vector3)}, SceneFieldFlag::OrderedMapping};
constexpr SceneField name = cscalings.name();
constexpr SceneFieldFlags flags = cscalings.flags();
constexpr std::size_t size = cscalings.size();
constexpr SceneMappingType mappingType = cscalings.mappingType();
CORRADE_COMPARE(name, SceneField::Scaling);
CORRADE_COMPARE(flags, SceneFieldFlag::OrderedMapping);
CORRADE_COMPARE(size, 3);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedLong);
/* These are not marked constexpr because it'd work only partially, not for
string fields (tested in constructFieldTypeErasedString()) */
CORRADE_COMPARE(cscalings.fieldType(), SceneFieldType::Vector3);
CORRADE_COMPARE(cscalings.fieldArraySize(), 0);
/* These are deliberately not constexpr to save header size a bit --
compared to SceneField APIs they get used very little and it's mostly
useless in a constexpr context anyway */
CORRADE_COMPARE(cscalings.mappingType(), SceneMappingType::UnsignedLong);
CORRADE_COMPARE(cscalings.mappingData().size(), 3);
CORRADE_COMPARE(cscalings.mappingData().stride(), sizeof(UnsignedLong));
CORRADE_COMPARE(cscalings.mappingData().data(), ScalingMappingData);
CORRADE_COMPARE(cscalings.fieldData().size(), 3);
CORRADE_COMPARE(cscalings.fieldData().stride(), sizeof(Vector3));
CORRADE_COMPARE(cscalings.fieldData().data(), ScalingFieldData);
}
void SceneDataTest::constructFieldTypeErasedString() {
@ -1060,6 +1079,9 @@ void SceneDataTest::constructFieldTypeErased2D() {
CORRADE_COMPARE(rotations.fieldData().size(), 3);
CORRADE_COMPARE(rotations.fieldData().stride(), 2*sizeof(Complexd));
CORRADE_COMPARE(rotations.fieldData().data(), rotationFieldView.data());
/* 2D type-erased construction is not constexpr due to branching to select
a corresponding SceneMappingType */
}
void SceneDataTest::constructFieldTypeErased2DString() {
@ -1083,6 +1105,9 @@ void SceneDataTest::constructFieldTypeErased2DString() {
CORRADE_COMPARE(names.fieldData().stride(), 2*sizeof(UnsignedShort)*2);
CORRADE_COMPARE(names.fieldData().data(), nameFieldView.data());
CORRADE_COMPARE(names.stringData(), static_cast<const void*>(nameStringData));
/* 2D type-erased construction is not constexpr due to branching to select
a corresponding SceneMappingType */
}
void SceneDataTest::constructFieldNonOwningArray() {
@ -1119,6 +1144,33 @@ void SceneDataTest::constructFieldOffsetOnly() {
CORRADE_COMPARE_AS(Containers::arrayCast<const Vector2>(a.fieldData(data)),
Containers::arrayView<Vector2>({{2.0f, 3.0f}, {67.0f, -1.1f}}),
TestSuite::Compare::Container);
constexpr SceneFieldData ca{SceneField::Translation, 2, SceneMappingType::UnsignedShort, offsetof(Data, object), sizeof(Data), SceneFieldType::Vector2, offsetof(Data, translation), sizeof(Data), SceneFieldFlag::ImplicitMapping};
constexpr SceneField name = ca.name();
constexpr SceneFieldFlags flags = ca.flags();
constexpr std::size_t size = ca.size();
constexpr SceneMappingType mappingType = ca.mappingType();
CORRADE_COMPARE(name, SceneField::Translation);
CORRADE_COMPARE(flags, SceneFieldFlag::OffsetOnly|SceneFieldFlag::ImplicitMapping);
CORRADE_COMPARE(size, 2);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedShort);
/* These are not marked constexpr because it'd work only partially, not for
string fields (tested in constructFieldOffsetOnlyString()) */
CORRADE_COMPARE(ca.fieldType(), SceneFieldType::Vector2);
CORRADE_COMPARE(ca.fieldArraySize(), 0);
/* These are deliberately not constexpr to save header size a bit --
compared to SceneField APIs they get used very little and it's mostly
useless in a constexpr context anyway */
CORRADE_COMPARE(ca.mappingData(data).size(), 2);
CORRADE_COMPARE(ca.mappingData(data).stride(), sizeof(Data));
CORRADE_COMPARE_AS(Containers::arrayCast<const UnsignedShort>(ca.mappingData(data)),
Containers::arrayView<UnsignedShort>({2, 15}),
TestSuite::Compare::Container);
CORRADE_COMPARE(ca.fieldData(data).size(), 2);
CORRADE_COMPARE(ca.fieldData(data).stride(), sizeof(Data));
CORRADE_COMPARE_AS(Containers::arrayCast<const Vector2>(ca.fieldData(data)),
Containers::arrayView<Vector2>({{2.0f, 3.0f}, {67.0f, -1.1f}}),
TestSuite::Compare::Container);
}
void SceneDataTest::constructFieldOffsetOnlyString() {
@ -1232,18 +1284,27 @@ void SceneDataTest::constructFieldArray() {
CORRADE_VERIFY(data.fieldData().data() == offsetFieldData);
constexpr SceneFieldData cdata{sceneFieldCustom(34), Containers::arrayView(ArrayOffsetMappingData), Containers::StridedArrayView2D<const Int>{ArrayOffsetFieldData, {3, 4}}, SceneFieldFlag::OrderedMapping};
CORRADE_COMPARE(cdata.flags(), SceneFieldFlag::OrderedMapping);
CORRADE_COMPARE(cdata.name(), sceneFieldCustom(34));
CORRADE_COMPARE(cdata.size(), 3);
CORRADE_COMPARE(cdata.mappingType(), SceneMappingType::UnsignedByte);
CORRADE_COMPARE(cdata.mappingData().size(), 3);
CORRADE_COMPARE(cdata.mappingData().stride(), sizeof(UnsignedByte));
CORRADE_VERIFY(cdata.mappingData().data() == ArrayOffsetMappingData);
constexpr SceneField name = cdata.name();
constexpr SceneFieldFlags flags = cdata.flags();
constexpr std::size_t size = cdata.size();
constexpr SceneMappingType mappingType = cdata.mappingType();
CORRADE_COMPARE(name, sceneFieldCustom(34));
CORRADE_COMPARE(flags, SceneFieldFlag::OrderedMapping);
CORRADE_COMPARE(size, 3);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedByte);
/* These are not marked constexpr because it'd work only partially, not for
string fields (tested in constructFieldOffsetOnlyString()) */
CORRADE_COMPARE(cdata.fieldType(), SceneFieldType::Int);
CORRADE_COMPARE(cdata.fieldArraySize(), 4);
/* These are deliberately not constexpr to save header size a bit --
compared to SceneField APIs they get used very little and it's mostly
useless in a constexpr context anyway */
CORRADE_COMPARE(cdata.mappingData().size(), 3);
CORRADE_COMPARE(cdata.mappingData().stride(), sizeof(UnsignedByte));
CORRADE_COMPARE(cdata.mappingData().data(), ArrayOffsetMappingData);
CORRADE_COMPARE(cdata.fieldData().size(), 3);
CORRADE_COMPARE(cdata.fieldData().stride(), 4*sizeof(Int));
CORRADE_VERIFY(cdata.fieldData().data() == ArrayOffsetFieldData);
CORRADE_COMPARE(cdata.fieldData().data(), ArrayOffsetFieldData);
}
void SceneDataTest::constructFieldArrayTypeErased() {
@ -1263,6 +1324,29 @@ void SceneDataTest::constructFieldArrayTypeErased() {
CORRADE_COMPARE(data.fieldData().size(), 3);
CORRADE_COMPARE(data.fieldData().stride(), 4*sizeof(Int));
CORRADE_VERIFY(data.fieldData().data() == offsetFieldData);
constexpr SceneFieldData cdata{sceneFieldCustom(34), SceneMappingType::UnsignedByte, Containers::StridedArrayView1D<const void>{ArrayOffsetMappingData}, SceneFieldType::Int, Containers::StridedArrayView1D<const void>{ArrayOffsetFieldData, 3, 4*sizeof(Int)}, 4, SceneFieldFlag::OrderedMapping};
constexpr SceneField name = cdata.name();
constexpr SceneFieldFlags flags = cdata.flags();
constexpr std::size_t size = cdata.size();
constexpr SceneMappingType mappingType = cdata.mappingType();
CORRADE_COMPARE(name, sceneFieldCustom(34));
CORRADE_COMPARE(flags, SceneFieldFlag::OrderedMapping);
CORRADE_COMPARE(size, 3);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedByte);
/* These are not marked constexpr because it'd work only partially, not for
string fields (tested in constructFieldOffsetOnlyString()) */
CORRADE_COMPARE(cdata.fieldType(), SceneFieldType::Int);
CORRADE_COMPARE(cdata.fieldArraySize(), 4);
/* These are deliberately not constexpr to save header size a bit --
compared to SceneField APIs they get used very little and it's mostly
useless in a constexpr context anyway */
CORRADE_COMPARE(cdata.mappingData().size(), 3);
CORRADE_COMPARE(cdata.mappingData().stride(), sizeof(UnsignedByte));
CORRADE_COMPARE(cdata.mappingData().data(), ArrayOffsetMappingData);
CORRADE_COMPARE(cdata.fieldData().size(), 3);
CORRADE_COMPARE(cdata.fieldData().stride(), 4*sizeof(Int));
CORRADE_COMPARE(cdata.fieldData().data(), ArrayOffsetFieldData);
}
void SceneDataTest::constructFieldArrayTypeErased2D() {
@ -1281,38 +1365,72 @@ void SceneDataTest::constructFieldArrayTypeErased2D() {
CORRADE_COMPARE(data.fieldData().size(), 3);
CORRADE_COMPARE(data.fieldData().stride(), 4*sizeof(Int));
CORRADE_VERIFY(data.fieldData().data() == offsetFieldData);
/* 2D type-erased construction is not constexpr due to branching to select
a corresponding SceneMappingType */
}
void SceneDataTest::constructFieldArrayOffsetOnly() {
struct Data {
Byte parent;
UnsignedByte object;
Int offset[4];
Int offset[2];
} data[]{
{0, 2, {0, 1}},
{0, 15, {2, 3}},
{0, 22, {4, 5}}
};
SceneFieldData data{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 4, SceneFieldFlag::ImplicitMapping};
CORRADE_COMPARE(data.flags(), SceneFieldFlag::OffsetOnly|SceneFieldFlag::ImplicitMapping);
CORRADE_COMPARE(data.name(), sceneFieldCustom(34));
CORRADE_COMPARE(data.size(), 3);
CORRADE_COMPARE(data.mappingType(), SceneMappingType::UnsignedByte);
CORRADE_COMPARE(data.fieldType(), SceneFieldType::Int);
CORRADE_COMPARE(data.fieldArraySize(), 4);
SceneFieldData a{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 2, SceneFieldFlag::ImplicitMapping};
CORRADE_COMPARE(a.flags(), SceneFieldFlag::OffsetOnly|SceneFieldFlag::ImplicitMapping);
CORRADE_COMPARE(a.name(), sceneFieldCustom(34));
CORRADE_COMPARE(a.size(), 3);
CORRADE_COMPARE(a.mappingType(), SceneMappingType::UnsignedByte);
CORRADE_COMPARE(a.mappingData(data).size(), 3);
CORRADE_COMPARE(a.mappingData(data).stride(), sizeof(Data));
CORRADE_COMPARE_AS(Containers::arrayCast<const UnsignedByte>(a.mappingData(data)),
Containers::arrayView<UnsignedByte>({2, 15, 22}),
TestSuite::Compare::Container);
CORRADE_COMPARE(a.fieldType(), SceneFieldType::Int);
CORRADE_COMPARE(a.fieldArraySize(), 2);
CORRADE_COMPARE(a.fieldData(data).size(), 3);
CORRADE_COMPARE(a.fieldData(data).stride(), sizeof(Data));
CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(a.fieldData(data), 2).transposed<0, 1>())[0],
Containers::arrayView({0, 2, 4}),
TestSuite::Compare::Container);
CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(a.fieldData(data), 2).transposed<0, 1>())[1],
Containers::arrayView({1, 3, 5}),
TestSuite::Compare::Container);
Data actual[3];
CORRADE_COMPARE(data.fieldData(actual).size(), 3);
CORRADE_COMPARE(data.fieldData(actual).stride(), sizeof(Data));
CORRADE_VERIFY(data.fieldData(actual).data() == &actual[0].offset);
CORRADE_COMPARE(data.mappingData(actual).size(), 3);
CORRADE_COMPARE(data.mappingData(actual).stride(), sizeof(Data));
CORRADE_VERIFY(data.mappingData(actual).data() == &actual[0].object);
constexpr SceneFieldData cdata{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 4, SceneFieldFlag::OrderedMapping};
CORRADE_COMPARE(cdata.flags(), SceneFieldFlag::OffsetOnly|SceneFieldFlag::OrderedMapping);
CORRADE_COMPARE(cdata.name(), sceneFieldCustom(34));
CORRADE_COMPARE(cdata.size(), 3);
CORRADE_COMPARE(cdata.mappingType(), SceneMappingType::UnsignedByte);
CORRADE_COMPARE(cdata.fieldType(), SceneFieldType::Int);
CORRADE_COMPARE(cdata.fieldArraySize(), 4);
constexpr SceneFieldData ca{sceneFieldCustom(34), 3, SceneMappingType::UnsignedByte, offsetof(Data, object), sizeof(Data), SceneFieldType::Int, offsetof(Data, offset), sizeof(Data), 2, SceneFieldFlag::OrderedMapping};
constexpr SceneField name = ca.name();
constexpr SceneFieldFlags flags = ca.flags();
constexpr std::size_t size = ca.size();
constexpr SceneMappingType mappingType = ca.mappingType();
CORRADE_COMPARE(name, sceneFieldCustom(34));
CORRADE_COMPARE(flags, SceneFieldFlag::OffsetOnly|SceneFieldFlag::OrderedMapping);
CORRADE_COMPARE(size, 3);
CORRADE_COMPARE(mappingType, SceneMappingType::UnsignedByte);
/* These are not marked constexpr because it'd work only partially, not for
string fields (tested in constructFieldOffsetOnlyString()) */
CORRADE_COMPARE(ca.fieldType(), SceneFieldType::Int);
CORRADE_COMPARE(ca.fieldArraySize(), 2);
/* These are deliberately not constexpr to save header size a bit --
compared to SceneField APIs they get used very little and it's mostly
useless in a constexpr context anyway */
CORRADE_COMPARE(ca.mappingData(data).size(), 3);
CORRADE_COMPARE(ca.mappingData(data).stride(), sizeof(Data));
CORRADE_COMPARE_AS(Containers::arrayCast<const UnsignedByte>(ca.mappingData(data)),
Containers::arrayView<UnsignedByte>({2, 15, 22}),
TestSuite::Compare::Container);
CORRADE_COMPARE(ca.fieldData(data).size(), 3);
CORRADE_COMPARE(ca.fieldData(data).stride(), sizeof(Data));
CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(ca.fieldData(data), 2).transposed<0, 1>())[0],
Containers::arrayView({0, 2, 4}),
TestSuite::Compare::Container);
CORRADE_COMPARE_AS((Containers::arrayCast<2, const Int>(ca.fieldData(data), 2).transposed<0, 1>())[1],
Containers::arrayView({1, 3, 5}),
TestSuite::Compare::Container);
}
void SceneDataTest::constructFieldInconsistentViewSize() {

Loading…
Cancel
Save