#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"