/
spivag
/
command_occ
Обзор
Документация
Войти
/
spivag
/
command_occ
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
initial
tests/test_spatial_curve.cpp
217 строк
7 KB
Spivakov
Initial
10 апр 2026, 13:45
10 апр 2026, 13:45
b2ad868
Код
Авторство
О чём код?
#include <../commands/spatial_curve.h> #include <demo_3d_arc.hxx> #include <gtest/gtest.h> class SpatialCurveTest : public testing::Test { }; static std::vector<R3::Point> TwoPoints() { return { R3::Point{ 0., 0., 0. }, R3::Point{ 1., .1, 1. } }; } static std::vector<R3::Point> ThreePointsColinear() { return { R3::Point{ 0., 0., 0. }, R3::Point{ 1., 1., 1. }, R3::Point{ 2., 2., 2. } }; } static std::vector<R3::Point> ThreePointsNonColinear() { return { R3::Point{ 0., 0., 0. }, R3::Point{ 1., 0., 1. }, R3::Point{ 2., 2., 5. } }; } static std::vector<R3::Point> FourPointsNonColinear() { return { R3::Point{ 0., 0., 0. }, R3::Point{ 1., 0., 1. }, R3::Point{ 2., 2., 5. }, R3::Point{ 3., 6., 4. } }; } // Poitive tests // Отрезок TEST_F( SpatialCurveTest, ValidParametersForLineSegment ) { R3::Point pointA( 0, 0, 0 ); R3::Point pointB( 1, 1, 1 ); SpatialLineSegment seg( pointA, pointB ); seg.Execute(); ASSERT_FALSE( seg.GetC3dCurve().is_null() ); } // -- Open curves // Ломаная : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, PolylineConstruction ) { const std::vector< R3::Point > points {TwoPoints()}; SpatialFitPoints curve( points, PointsFit::OnEnds::open, PointsFit::Polyline() ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Кубический сплайн без параметризации : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, CubicSplineConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; PointsFit::CubicSpline splineData{}; SpatialFitPoints curve( points, PointsFit::OnEnds::open, splineData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Сплайн Эрмита без параметризации и без производных // : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, HermitSplineConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; PointsFit::HermitSpline< R3::Vector > hermitData( {}, {} ); SpatialFitPoints curve( points, PointsFit::OnEnds::open, hermitData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Кривая Безье : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, BezierCurveConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; PointsFit::Bezier bezierData; SpatialFitPoints curve( points, PointsFit::OnEnds::open, bezierData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // NURBS : требуется минимум 4 точки по умолчанию TEST_F( SpatialCurveTest, NurbsCurveConstruction ) { const std::vector< R3::Point > points {FourPointsNonColinear()}; PointsFit::Nurbs nurbsData; SpatialFitPoints curve( points, PointsFit::OnEnds::open, nurbsData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // -- Closed curves // Ломаная : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, ClosedPolylineConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; SpatialFitPoints curve( points, PointsFit::OnEnds::closed, PointsFit::Polyline() ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Кубический сплайн без параметризации : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, ClosedCubicSplineConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; PointsFit::CubicSpline splineData{}; SpatialFitPoints curve( points, PointsFit::OnEnds::closed, splineData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Сплайн Эрмита без параметризации и без производных // : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, ClosedHermitSplineConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; PointsFit::HermitSpline< R3::Vector > hermitData( {}, {} ); SpatialFitPoints curve( points, PointsFit::OnEnds::closed, hermitData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Кривая Безье : требуется минимум 3 точки по умолчанию TEST_F( SpatialCurveTest, ClosedBezierCurveConstruction ) { const std::vector< R3::Point > points {ThreePointsColinear()}; PointsFit::Bezier bezierData; SpatialFitPoints curve( points, PointsFit::OnEnds::closed, bezierData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // NURBS : требуется минимум 4 точки по умолчанию TEST_F( SpatialCurveTest, ClosedNurbsCurveConstruction ) { const std::vector< R3::Point > points {ThreePointsNonColinear()}; PointsFit::Nurbs nurbsData; SpatialFitPoints curve( points, PointsFit::OnEnds::closed, nurbsData ); curve.Execute(); ASSERT_FALSE( curve.GetC3dCurve().is_null() ); } // Negative tests // Одинаковые точки в отрезке TEST_F( SpatialCurveTest, SamePointsForLineSegment ) { const R3::Point pointA{ 0., 0., 0. }; const R3::Point pointB{pointA}; SpatialLineSegment seg( pointA, pointB ); seg.Execute(); ASSERT_TRUE( seg.GetC3dCurve().is_null() ); } // Одна точка в открытой ломаной TEST_F( SpatialCurveTest, OnePointOpenPolyline ) { const std::vector< R3::Point > points {R3::Point{ 0., 0., 0. }}; SpatialFitPoints curve( points, PointsFit::OnEnds::open, PointsFit::Polyline() ); curve.Execute(); ASSERT_TRUE( curve.GetC3dCurve().is_null() ); } // Одна точка в замкнутой ломаной TEST_F( SpatialCurveTest, OnePointClosedPolyline ) { const std::vector< R3::Point > points {R3::Point{ 0., 0., 0. }}; SpatialFitPoints curve( points, PointsFit::OnEnds::closed, PointsFit::Polyline() ); curve.Execute(); ASSERT_TRUE( curve.GetC3dCurve().is_null() ); } // Две точки в замкнутом кубическом сплайне TEST_F( SpatialCurveTest, TwoPointsClosedCubic ) { const std::vector< R3::Point > points {TwoPoints()}; SpatialFitPoints curve( points, PointsFit::OnEnds::closed, PointsFit::CubicSpline() ); curve.Execute(); ASSERT_TRUE( curve.GetC3dCurve().is_null() ); } // Одинаковые точки на концах ломаной TEST_F( SpatialCurveTest, SamePointsOnEndsClosedPolyline ) { std::vector< R3::Point > points {ThreePointsColinear()}; points.push_back(points.front()); SpatialFitPoints curve( points, PointsFit::OnEnds::closed, PointsFit::Polyline() ); curve.Execute(); ASSERT_TRUE( curve.GetC3dCurve().is_null() ); } class SpatialCurveDemo : public SpatialCurveTest { }; class SpatialArcDemoTest : public SpatialCurveDemo {}; TEST_F( SpatialArcDemoTest, ThreePoints ) { auto arc = demo::CurveSpatialArc::ByThreePoints(); arc->Execute(); ASSERT_FALSE( arc->GetC3dCurve().is_null() ); }