Browse Source
QA: Add some tests on SHAPE_POLY_SET::Distance
QA: Add some tests on SHAPE_POLY_SET::Distance
These tests pick up the bug fixed in: 90178eb681
(as it is already fixed there is no failure).
pull/13/head
committed by
Wayne Stambaugh
9 changed files with 468 additions and 0 deletions
-
1qa/common/CMakeLists.txt
-
149qa/common/geometry/test_shape_poly_set_distance.cpp
-
5qa/qa_utils/CMakeLists.txt
-
49qa/qa_utils/geometry/line_chain_construction.cpp
-
54qa/qa_utils/geometry/poly_set_construction.cpp
-
39qa/qa_utils/geometry/seg_construction.cpp
-
56qa/qa_utils/include/qa_utils/geometry/line_chain_construction.h
-
59qa/qa_utils/include/qa_utils/geometry/poly_set_construction.h
-
56qa/qa_utils/include/qa_utils/geometry/seg_construction.h
@ -0,0 +1,149 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2017 CERN |
|||
* @author Alejandro García Montoro <alejandro.garciamontoro@gmail.com> |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
#include <unit_test_utils/unit_test_utils.h>
|
|||
|
|||
#include <convert_to_biu.h>
|
|||
|
|||
#include <geometry/shape_poly_set.h>
|
|||
|
|||
#include <qa_utils/geometry/poly_set_construction.h>
|
|||
#include <qa_utils/geometry/seg_construction.h>
|
|||
|
|||
/**
|
|||
* Declares the Boost test suite fixture. |
|||
*/ |
|||
BOOST_AUTO_TEST_SUITE( SPSDistance ) |
|||
|
|||
struct SPS_DISTANCE_TO_SEG_CASE |
|||
{ |
|||
std::string m_case_name; |
|||
|
|||
/// list of lists of polygon points
|
|||
SHAPE_POLY_SET m_polyset; |
|||
|
|||
/// the segment to check distance to
|
|||
SEG m_seg; |
|||
int m_seg_width; |
|||
|
|||
/// The expected answer
|
|||
int m_exp_dist; |
|||
}; |
|||
|
|||
static std::vector<SPS_DISTANCE_TO_SEG_CASE> GetSPSSegDistCases() |
|||
{ |
|||
namespace KT = KI_TEST; |
|||
std::vector<SPS_DISTANCE_TO_SEG_CASE> cases; |
|||
|
|||
// Single 10mm square at origin
|
|||
const SHAPE_POLY_SET square_10mm_0_0 = KT::BuildPolyset( { |
|||
KT::BuildSquareChain( Millimeter2iu( 10 ) ), |
|||
} ); |
|||
|
|||
// Double square: 10mm each, one at (0, 0), one at (10, 0)
|
|||
const SHAPE_POLY_SET squares_10mm_0_0_and_20_0 = KT::BuildPolyset( { |
|||
KT::BuildSquareChain( Millimeter2iu( 10 ) ), |
|||
KT::BuildSquareChain( Millimeter2iu( 10 ), //
|
|||
{ Millimeter2iu( 20 ), Millimeter2iu( 0 ) } ), |
|||
} ); |
|||
|
|||
// Hollow square: 10mm hole in 20mm square, at origin
|
|||
const SHAPE_POLY_SET hollow_square_20_10_at_0_0 = |
|||
KT::BuildHollowSquare( Millimeter2iu( 20 ), Millimeter2iu( 10 ) ); |
|||
|
|||
cases.push_back( { |
|||
"Square poly -> 1D segment", |
|||
square_10mm_0_0, |
|||
KT::BuildHSeg( { Millimeter2iu( 0 ), Millimeter2iu( 15 ) }, Millimeter2iu( 10 ) ), |
|||
Millimeter2iu( 0 ), // 1-d segment
|
|||
Millimeter2iu( 10 ), |
|||
} ); |
|||
|
|||
cases.push_back( { |
|||
"Square poly -> 2D (thick) segment", |
|||
square_10mm_0_0, |
|||
KT::BuildHSeg( { Millimeter2iu( 0 ), Millimeter2iu( 15 ) }, Millimeter2iu( 10 ) ), |
|||
Millimeter2iu( 2 ), // thick segment
|
|||
Millimeter2iu( 9 ), |
|||
} ); |
|||
|
|||
cases.push_back( { |
|||
"Two Squares poly -> 2D segment (nearest second square)", squares_10mm_0_0_and_20_0, |
|||
KT::BuildHSeg( { Millimeter2iu( 15 ), Millimeter2iu( 15 ) }, Millimeter2iu( 10 ) ), |
|||
Millimeter2iu( 2 ), // thick segment
|
|||
Millimeter2iu( 9 ), // from line to second square
|
|||
} ); |
|||
|
|||
cases.push_back( { |
|||
"Square poly -> one intersect", square_10mm_0_0, |
|||
KT::BuildHSeg( { Millimeter2iu( -5 ), Millimeter2iu( 0 ) }, Millimeter2iu( 10 ) ), |
|||
Millimeter2iu( 0 ), // 1-d segment
|
|||
Millimeter2iu( 0 ), // intersect
|
|||
} ); |
|||
|
|||
cases.push_back( { |
|||
"Square poly -> multiple intersection", square_10mm_0_0, |
|||
KT::BuildHSeg( { Millimeter2iu( -5 ), Millimeter2iu( 0 ) }, Millimeter2iu( 20 ) ), |
|||
Millimeter2iu( 0 ), // 1-d segment
|
|||
Millimeter2iu( 0 ), // intersect
|
|||
} ); |
|||
|
|||
cases.push_back( { |
|||
"Square poly -> 1D seg touching", square_10mm_0_0, |
|||
// touch left side at (-5, 0)
|
|||
KT::BuildHSeg( { Millimeter2iu( -10 ), Millimeter2iu( 0 ) }, Millimeter2iu( 5 ) ), |
|||
Millimeter2iu( 0 ), // 2D segment
|
|||
Millimeter2iu( 0 ), // intersect
|
|||
} ); |
|||
|
|||
cases.push_back( { |
|||
"Square poly -> 2D seg (end cap is nearest)", square_10mm_0_0, |
|||
KT::BuildHSeg( { Millimeter2iu( -20 ), Millimeter2iu( 0 ) }, Millimeter2iu( 10 ) ), |
|||
Millimeter2iu( 2 ), // 2D segment, 1mm cap radius
|
|||
Millimeter2iu( 4 ), // 4mm short, 5mm to wire end, -1mm radius
|
|||
} ); |
|||
|
|||
return cases; |
|||
}; |
|||
|
|||
/**
|
|||
* Check segment distances |
|||
*/ |
|||
BOOST_AUTO_TEST_CASE( SegDistance ) |
|||
{ |
|||
for( const auto& c : GetSPSSegDistCases() ) |
|||
{ |
|||
BOOST_TEST_CONTEXT( c.m_case_name ) |
|||
{ |
|||
SHAPE_POLY_SET polyset = c.m_polyset; |
|||
|
|||
int dist = polyset.Distance( c.m_seg, c.m_seg_width ); |
|||
|
|||
// right answer?
|
|||
BOOST_CHECK_EQUAL( dist, c.m_exp_dist ); |
|||
} |
|||
} |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_SUITE_END() |
|||
@ -0,0 +1,49 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
#include <qa_utils/geometry/line_chain_construction.h>
|
|||
|
|||
namespace KI_TEST |
|||
{ |
|||
|
|||
SHAPE_LINE_CHAIN BuildRectChain( const VECTOR2I& aSize, const VECTOR2I& aCentre ) |
|||
{ |
|||
const std::vector<VECTOR2I> pts = { |
|||
{ aCentre.x - aSize.x / 2, aCentre.y - aSize.y / 2 }, |
|||
{ aCentre.x - aSize.x / 2, aCentre.y + aSize.y / 2 }, |
|||
{ aCentre.x + aSize.x / 2, aCentre.y + aSize.y / 2 }, |
|||
{ aCentre.x + aSize.x / 2, aCentre.y - aSize.y / 2 }, |
|||
}; |
|||
|
|||
SHAPE_LINE_CHAIN chain( pts.data(), pts.size() ); |
|||
chain.SetClosed( true ); |
|||
|
|||
return chain; |
|||
} |
|||
|
|||
SHAPE_LINE_CHAIN BuildSquareChain( int aSize, const VECTOR2I& aCentre ) |
|||
{ |
|||
return BuildRectChain( { aSize, aSize }, aCentre ); |
|||
} |
|||
|
|||
} // namespace KI_TEST
|
|||
@ -0,0 +1,54 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
#include <qa_utils/geometry/poly_set_construction.h>
|
|||
|
|||
#include <qa_utils/geometry/line_chain_construction.h>
|
|||
|
|||
namespace KI_TEST |
|||
{ |
|||
|
|||
SHAPE_POLY_SET BuildPolyset( const std::vector<SHAPE_LINE_CHAIN>& aOutlines ) |
|||
{ |
|||
SHAPE_POLY_SET polyset; |
|||
|
|||
for( const auto& outline : aOutlines ) |
|||
{ |
|||
polyset.AddOutline( outline ); |
|||
} |
|||
|
|||
return polyset; |
|||
} |
|||
|
|||
|
|||
SHAPE_POLY_SET BuildHollowSquare( int aOuterSize, int aInnerSize, const VECTOR2I& aCentre ) |
|||
{ |
|||
SHAPE_POLY_SET polyset; |
|||
|
|||
polyset.AddOutline( BuildRectChain( { aOuterSize, aOuterSize }, aCentre ) ); |
|||
polyset.AddHole( BuildRectChain( { aInnerSize, aInnerSize }, aCentre ) ); |
|||
|
|||
return polyset; |
|||
} |
|||
|
|||
} // namespace KI_TEST
|
|||
@ -0,0 +1,39 @@ |
|||
/*
|
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
#include <qa_utils/geometry/seg_construction.h>
|
|||
|
|||
namespace KI_TEST |
|||
{ |
|||
|
|||
SEG BuildHSeg( const VECTOR2I& aStart, int aLength ) |
|||
{ |
|||
return SEG{ { aStart.x, aStart.y }, { aStart.x + aLength, aStart.y } }; |
|||
} |
|||
|
|||
SEG BuildVSeg( const VECTOR2I& aStart, int aLength ) |
|||
{ |
|||
return SEG{ { aStart.x, aStart.y }, { aStart.x, aStart.y + aLength } }; |
|||
} |
|||
|
|||
} // namespace KI_TEST
|
|||
@ -0,0 +1,56 @@ |
|||
/* |
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
|||
* or you may search the http://www.gnu.org website for the version 2 license, |
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
/** |
|||
* @file |
|||
* Utilities for creating useful line chain idioms commonly founds in |
|||
* QA utilities and tests |
|||
*/ |
|||
|
|||
#ifndef QA_UTILS_GEOMETRY_LINE_CHAIN_CONSTRUCTION__H |
|||
#define QA_UTILS_GEOMETRY_LINE_CHAIN_CONSTRUCTION__H |
|||
|
|||
#include <geometry/shape_line_chain.h> |
|||
|
|||
namespace KI_TEST |
|||
{ |
|||
|
|||
/** |
|||
* Builds a rectangular #SHAPE_LINE_CHAIN of a certain size at a certain centre |
|||
* @param aSize the rectangle size |
|||
* @param aCentre centre of the rectangle |
|||
* @return a closed line chain of the rectangle |
|||
*/ |
|||
SHAPE_LINE_CHAIN BuildRectChain( const VECTOR2I& aSize, const VECTOR2I& aCentre = { 0, 0 } ); |
|||
|
|||
/** |
|||
* Builds a square #SHAPE_LINE_CHAIN of a certain size at a certain centre |
|||
* @param aSize the square size (x == y) |
|||
* @param aCentre centre of the square |
|||
* @return a closed line chain of the square |
|||
*/ |
|||
SHAPE_LINE_CHAIN BuildSquareChain( int aSize, const VECTOR2I& aCentre = { 0, 0 } ); |
|||
|
|||
} // namespace KI_TEST |
|||
|
|||
#endif // QA_UTILS_GEOMETRY_LINE_CHAIN_CONSTRUCTION__H |
|||
@ -0,0 +1,59 @@ |
|||
/* |
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
|||
* or you may search the http://www.gnu.org website for the version 2 license, |
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
/** |
|||
* @file |
|||
* Utilities for creating useful polygon shapes that are commonly |
|||
* found in QA utilities and tests. |
|||
*/ |
|||
|
|||
#ifndef QA_UTILS_GEOMETRY_POLY_SET_CONSTRUCTION__H |
|||
#define QA_UTILS_GEOMETRY_POLY_SET_CONSTRUCTION__H |
|||
|
|||
#include <geometry/shape_poly_set.h> |
|||
|
|||
#include <qa_utils/geometry/line_chain_construction.h> |
|||
|
|||
namespace KI_TEST |
|||
{ |
|||
|
|||
/** |
|||
* Construct a #SHAPE_POLY_SET from a list of points for each of outlines |
|||
* (no holes) |
|||
*/ |
|||
SHAPE_POLY_SET BuildPolyset( const std::vector<SHAPE_LINE_CHAIN>& aOutlines ); |
|||
|
|||
/** |
|||
* Build a #SHAPE_POLY_SET in the shape of a square outline, with a square |
|||
* hole, both centred at the given point. |
|||
* @param aOuterSize the size (x and y) of the outer square |
|||
* @param aInnerSize the size (x and y) of the hole |
|||
* @param aCentre the centre point of both squares (default: origin) |
|||
* @return a SHAPE_POLY_SET of the desired shape |
|||
*/ |
|||
SHAPE_POLY_SET BuildHollowSquare( |
|||
int aOuterSize, int aInnerSize, const VECTOR2I& aCentre = { 0, 0 } ); |
|||
|
|||
} // namespace KI_TEST |
|||
|
|||
#endif // QA_UTILS_GEOMETRY_POLY_SET_CONSTRUCTION__H |
|||
@ -0,0 +1,56 @@ |
|||
/* |
|||
* This program source code file is part of KiCad, a free EDA CAD application. |
|||
* |
|||
* Copyright (C) 2019 KiCad Developers, see CHANGELOG.TXT for contributors. |
|||
* |
|||
* This program is free software; you can redistribute it and/or |
|||
* modify it under the terms of the GNU General Public License |
|||
* as published by the Free Software Foundation; either version 2 |
|||
* of the License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program; if not, you may find one here: |
|||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
|||
* or you may search the http://www.gnu.org website for the version 2 license, |
|||
* or you may write to the Free Software Foundation, Inc., |
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|||
*/ |
|||
|
|||
/** |
|||
* @file |
|||
* Utilities for creating useful line chain idioms commonly founds in |
|||
* QA utilities and tests |
|||
*/ |
|||
|
|||
#ifndef QA_UTILS_GEOMETRY_SEG_CONSTRUCTION__H |
|||
#define QA_UTILS_GEOMETRY_SEG_CONSTRUCTION__H |
|||
|
|||
#include <geometry/seg.h> |
|||
|
|||
namespace KI_TEST |
|||
{ |
|||
|
|||
/** |
|||
* Build a horizontal segment from a point with a length |
|||
* @param aStart the starting point |
|||
* @param aLength the segment length |
|||
* @return the resulting segment |
|||
*/ |
|||
SEG BuildHSeg( const VECTOR2I& aStart, int aLength ); |
|||
|
|||
/** |
|||
* Build a vertical segment from a point with a length |
|||
* @param aStart the starting point |
|||
* @param aLength the segment length |
|||
* @return the resulting segment |
|||
*/ |
|||
SEG BuildVSeg( const VECTOR2I& aStart, int aLength ); |
|||
|
|||
} // namespace KI_TEST |
|||
|
|||
#endif // QA_UTILS_GEOMETRY_SEG_CONSTRUCTION__H |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue