#include
#include
#include
#include
#include
#include
#include
Q_DECLARE_METATYPE(Base::Vector3f)
Q_DECLARE_METATYPE(Base::ColorRGB)
Q_DECLARE_METATYPE(Base::Line3f)
Q_DECLARE_METATYPE(Base::BindingElement::Binding)
Q_DECLARE_METATYPE(Base::DrawStyle)
Q_DECLARE_METATYPE(Base::DrawStyle::Style)
Q_DECLARE_METATYPE(Base::PolygonOffset)
Q_DECLARE_METATYPE(Base::PolygonOffset::Style)
class testInventorBuilder: public QObject
{
Q_OBJECT
public:
testInventorBuilder()
: builder(output)
{}
~testInventorBuilder() override = default;
SoNode* loadBuffer(const std::string& buffer)
{
SoInput in;
in.setBuffer((void*)buffer.c_str(), buffer.size());
return SoDB::readAll(&in);
}
private Q_SLOTS:
void initTestCase()
{
SoDB::init();
}
void initTestCase_data()
{}
void cleanupTestCase()
{
SoDB::finish();
}
void init()
{}
void cleanup()
{
// clear the buffer
output.str(std::string());
}
void test_Invalid()
{
SoNode* node = loadBuffer("Hello, World");
QCOMPARE(node, nullptr);
}
void test_Output()
{
std::stringstream str;
Base::InventorBuilder builder(str);
QCOMPARE(str.str().c_str(), "#Inventor V2.1 ascii \n\n");
}
void test_MaterialBinding_data()
{
// clang-format off
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::Overall
<< "MaterialBinding { value OVERALL } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::PerPart
<< "MaterialBinding { value PER_PART } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::PerPartIndexed
<< "MaterialBinding { value PER_PART_INDEXED } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::PerFace
<< "MaterialBinding { value PER_FACE } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::PerFaceIndexed
<< "MaterialBinding { value PER_FACE_INDEXED } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::PerVertex
<< "MaterialBinding { value PER_VERTEX } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::PerVertexIndexed
<< "MaterialBinding { value PER_VERTEX_INDEXED } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::Default
<< "MaterialBinding { value OVERALL } \n";
QTest::newRow("MaterialBinding") << Base::BindingElement::Binding::None
<< "MaterialBinding { value OVERALL } \n";
// clang-format on
}
void test_MaterialBinding()
{
QFETCH(Base::BindingElement::Binding, input);
QFETCH(QString, result);
Base::MaterialBindingItem item;
item.setValue(input);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Label_data()
{
auto result =
R"(Label {
label "FreeCAD"
}
)";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("Label") << "FreeCAD" << result;
}
void test_Label()
{
QFETCH(QString, input);
QFETCH(QString, result);
Base::LabelItem item {input.toStdString()};
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Info_data()
{
auto result =
R"(Info {
string "FreeCAD"
}
)";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("Info") << "FreeCAD" << result;
}
void test_Info()
{
QFETCH(QString, input);
QFETCH(QString, result);
Base::InfoItem item {input.toStdString()};
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Text2_data()
{
auto result = "Text2 { string \"FreeCAD\" }\n";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("Text2") << "FreeCAD" << result;
}
void test_Text2()
{
QFETCH(QString, input);
QFETCH(QString, result);
Base::Text2Item item {input.toStdString()};
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_BaseColor_data()
{
auto result =
R"(BaseColor {
rgb 0.21 0.3 0.4
}
)";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("BaseColor") << Base::ColorRGB {0.21F, 0.3F, 0.4F} << result;
}
void test_BaseColor()
{
QFETCH(Base::ColorRGB, input);
QFETCH(QString, result);
Base::BaseColorItem item {input};
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Material_data()
{
auto result =
R"(Material {
diffuseColor 1 0 0
}
)";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("Material") << Base::ColorRGB {1, 0, 0} << result;
}
void test_Material()
{
QFETCH(Base::ColorRGB, input);
QFETCH(QString, result);
Base::MaterialItem item;
item.setDiffuseColor({input});
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Materials_data()
{
auto result =
R"(Material {
diffuseColor [
1 0 0
0 1 0
0 0 1
]
}
)";
QTest::addColumn("input1");
QTest::addColumn("input2");
QTest::addColumn("input3");
QTest::addColumn("result");
QTest::newRow("Material") << Base::ColorRGB {1, 0, 0} << Base::ColorRGB {0, 1, 0}
<< Base::ColorRGB {0, 0, 1} << result;
}
void test_Materials()
{
QFETCH(Base::ColorRGB, input1);
QFETCH(Base::ColorRGB, input2);
QFETCH(Base::ColorRGB, input3);
QFETCH(QString, result);
Base::MaterialItem item;
item.setDiffuseColor({input1, input2, input3});
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
QVERIFY(node->getRefCount() == 0);
}
void test_DrawStyle_data()
{
auto result =
R"(DrawStyle {
style FILLED
pointSize 3
lineWidth 3
linePattern 0xf0f0
}
)";
QTest::addColumn("styleEnum");
QTest::addColumn("pointSize");
QTest::addColumn("lineWidth");
QTest::addColumn("linePattern");
QTest::addColumn("result");
QTest::newRow("DrawStyle")
<< Base::DrawStyle::Style::Filled << ushort(3) << ushort(3) << ushort(0xf0f0) << result;
}
void test_DrawStyle()
{
QFETCH(Base::DrawStyle::Style, styleEnum);
QFETCH(ushort, pointSize);
QFETCH(ushort, lineWidth);
QFETCH(ushort, linePattern);
QFETCH(QString, result);
Base::DrawStyleItem item;
Base::DrawStyle style;
style.style = styleEnum;
style.pointSize = pointSize;
style.lineWidth = lineWidth;
style.linePattern = linePattern;
item.setValue(style);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_ShapeHints_data()
{
auto result =
R"(ShapeHints {
creaseAngle 0.5
vertexOrdering UNKNOWN_ORDERING
shapeType UNKNOWN_SHAPE_TYPE
}
)";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("ShapeHints") << 0.5F << result;
}
void test_ShapeHints()
{
QFETCH(float, input);
QFETCH(QString, result);
Base::ShapeHintsItem item {input};
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_PolygonOffset_data()
{
auto result =
R"(PolygonOffset {
factor 2
units 1
styles FILLED
on FALSE
}
)";
QTest::addColumn("styleEnum");
QTest::addColumn("factor");
QTest::addColumn("units");
QTest::addColumn("on");
QTest::addColumn("result");
QTest::newRow("PolygonOffset")
<< Base::PolygonOffset::Style::Filled << 2.0F << 1.0F << false << result;
}
void test_PolygonOffset()
{
QFETCH(Base::PolygonOffset::Style, styleEnum);
QFETCH(float, factor);
QFETCH(float, units);
QFETCH(bool, on);
QFETCH(QString, result);
Base::PolygonOffsetItem item;
Base::PolygonOffset offset;
offset.factor = factor;
offset.units = units;
offset.style = styleEnum;
offset.on = on;
item.setValue(offset);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_PointSet_data()
{
auto result = "PointSet { }\n";
QTest::addColumn("result");
QTest::newRow("PointSet") << result;
}
void test_PointSet()
{
QFETCH(QString, result);
Base::PointSetItem item;
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_LineSet_data()
{
auto result = "LineSet { }\n";
QTest::addColumn("result");
QTest::newRow("LineSet") << result;
}
void test_LineSet()
{
QFETCH(QString, result);
Base::LineSetItem item;
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_FaceSet_data()
{
QTest::addColumn("num");
QTest::newRow("FaceSet") << 2;
}
void test_FaceSet()
{
QFETCH(int, num);
Base::FaceSetItem item {{num}};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_IndexedLineSet_data()
{
QTest::addColumn("c1");
QTest::addColumn("c2");
QTest::addColumn("c3");
QTest::newRow("IndexedLineSet") << 0 << 1 << 2;
}
void test_IndexedLineSet()
{
QFETCH(int, c1);
QFETCH(int, c2);
QFETCH(int, c3);
Base::IndexedLineSetItem item {{c1, c2, c3}};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_IndexedFaceSet_data()
{
QTest::addColumn("c1");
QTest::addColumn("c2");
QTest::addColumn("c3");
QTest::addColumn("c4");
QTest::newRow("IndexedFaceSet") << 0 << 1 << 2 << -1;
}
void test_IndexedFaceSet()
{
QFETCH(int, c1);
QFETCH(int, c2);
QFETCH(int, c3);
QFETCH(int, c4);
Base::IndexedFaceSetItem item {{c1, c2, c3, c4}};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_Transform()
{
Base::Placement plm;
Base::TransformItem item {plm};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_Normal_data()
{
auto result =
R"(Normal {
vector 1 0 0.5
}
)";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("Normal") << Base::Vector3f {1, 0, 0.5} << result;
}
void test_Normal()
{
QFETCH(Base::Vector3f, input);
QFETCH(QString, result);
builder.addNode(Base::NormalItem {{input}});
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_LineItem_data()
{
QTest::addColumn("line");
QTest::addColumn("style");
QTest::newRow("LineItem") << Base::Line3f {} << Base::DrawStyle {};
}
void test_LineItem()
{
QFETCH(Base::Line3f, line);
QFETCH(Base::DrawStyle, style);
Base::LineItem item {line, style};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_MultiLineItem_data()
{
QTest::addColumn("p1");
QTest::addColumn("p2");
QTest::addColumn("p3");
QTest::addColumn("style");
QTest::newRow("MultiLineItem") << Base::Vector3f {0, 0, 0} << Base::Vector3f {1, 0, 0}
<< Base::Vector3f {1, 1, 0} << Base::DrawStyle {};
}
void test_MultiLineItem()
{
QFETCH(Base::Vector3f, p1);
QFETCH(Base::Vector3f, p2);
QFETCH(Base::Vector3f, p3);
QFETCH(Base::DrawStyle, style);
Base::MultiLineItem item {{p1, p2, p3}, style};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_ArrowItem_data()
{
QTest::addColumn("line");
QTest::addColumn("style");
QTest::newRow("Arrow") << Base::Line3f {Base::Vector3f {0, 0, 10}, Base::Vector3f {}}
<< Base::DrawStyle {};
}
void test_ArrowItem()
{
QFETCH(Base::Line3f, line);
QFETCH(Base::DrawStyle, style);
Base::ArrowItem item {line, style};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_BoundingBoxItem_data()
{
QTest::addColumn("p1");
QTest::addColumn("p2");
QTest::addColumn("style");
QTest::newRow("BoundingBoxItem")
<< Base::Vector3f {0, 0, 0} << Base::Vector3f {1, 1, 1} << Base::DrawStyle {};
}
void test_BoundingBoxItem()
{
QFETCH(Base::Vector3f, p1);
QFETCH(Base::Vector3f, p2);
QFETCH(Base::DrawStyle, style);
Base::BoundingBoxItem item {p1, p2, style};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_Coordinate3Item_data()
{
QTest::addColumn("p1");
QTest::addColumn("p2");
QTest::addColumn("p3");
QTest::newRow("Coordinate3Item")
<< Base::Vector3f {0, 0, 0} << Base::Vector3f {1, 0, 0} << Base::Vector3f {1, 1, 0};
}
void test_Coordinate3Item()
{
QFETCH(Base::Vector3f, p1);
QFETCH(Base::Vector3f, p2);
QFETCH(Base::Vector3f, p3);
Base::Coordinate3Item item {{p1, p2, p3}};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_PointItem_data()
{
QTest::addColumn("point");
QTest::addColumn("style");
QTest::newRow("PointItem") << Base::Vector3f {} << Base::DrawStyle {};
}
void test_PointItem()
{
QFETCH(Base::Vector3f, point);
QFETCH(Base::DrawStyle, style);
Base::PointItem item {point, style};
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
void test_NormalBinding_data()
{
// clang-format off
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::Overall
<< "NormalBinding { value OVERALL }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::PerPart
<< "NormalBinding { value PER_PART }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::PerPartIndexed
<< "NormalBinding { value PER_PART_INDEXED }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::PerFace
<< "NormalBinding { value PER_FACE }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::PerFaceIndexed
<< "NormalBinding { value PER_FACE_INDEXED }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::PerVertex
<< "NormalBinding { value PER_VERTEX }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::PerVertexIndexed
<< "NormalBinding { value PER_VERTEX_INDEXED }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::Default
<< "NormalBinding { value OVERALL }\n";
QTest::newRow("NormalBinding") << Base::BindingElement::Binding::None
<< "NormalBinding { value OVERALL }\n";
// clang-format on
}
void test_NormalBinding()
{
QFETCH(Base::BindingElement::Binding, input);
QFETCH(QString, result);
Base::NormalBindingItem item;
item.setValue(input);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Cylinder_data()
{
auto result =
R"(Cylinder {
radius 3
height 7
parts (SIDES | TOP | BOTTOM)
}
)";
QTest::addColumn("radius");
QTest::addColumn("height");
QTest::addColumn("result");
QTest::newRow("Cylinder") << 3.0F << 7.0F << result;
}
void test_Cylinder()
{
QFETCH(float, radius);
QFETCH(float, height);
QFETCH(QString, result);
Base::CylinderItem item;
item.setRadius(radius);
item.setHeight(height);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Cone_data()
{
auto result = "Cone { bottomRadius 2 height 10 }\n";
QTest::addColumn("radius");
QTest::addColumn("height");
QTest::addColumn("result");
QTest::newRow("Cone") << 2.0F << 10.0F << result;
}
void test_Cone()
{
QFETCH(float, radius);
QFETCH(float, height);
QFETCH(QString, result);
Base::ConeItem item;
item.setBottomRadius(radius);
item.setHeight(height);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_Sphere_data()
{
auto result = "Sphere { radius 4 }\n";
QTest::addColumn("input");
QTest::addColumn("result");
QTest::newRow("Sphere") << 4.0F << result;
}
void test_Sphere()
{
QFETCH(float, input);
QFETCH(QString, result);
Base::SphereItem item;
item.setRadius(input);
builder.addNode(item);
QString string = QString::fromStdString(output.str());
QCOMPARE(string, result);
}
void test_NurbsSurface_data()
{
QTest::addColumn("knot1");
QTest::addColumn("knot2");
QTest::addColumn("poles");
QTest::newRow("Nurbs") << 0.0F << 1.0F << 2;
}
void test_NurbsSurface()
{
QFETCH(float, knot1);
QFETCH(float, knot2);
QFETCH(int, poles);
Base::NurbsSurfaceItem item;
item.setKnotVector({knot1, knot2}, {knot1, knot2});
item.setControlPoints(poles, poles);
builder.addNode(item);
SoNode* node = loadBuffer(output.str());
QVERIFY(node != nullptr);
}
private:
std::stringstream output;
Base::InventorBuilder builder;
};
QTEST_GUILESS_MAIN(testInventorBuilder)
#include "InventorBuilder.moc"