7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2024-11-22 04:45:00 +00:00
kicad/qa/tests/common/test_increment.cpp
John Beard 2c2ff64911 Allow incrementing different parts of strings with modifiers
Primary increment is the right most bit, secondary is the next
rightmost. So you can increment 'A1' to 'A2' or 'B1' with
Shift-Alt-Scroll and Ctrl-Alt-Scroll respectively.
2024-10-26 16:01:07 +08:00

130 lines
3.5 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2024 KiCad Developers, see AUTHORS.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/wx_utils/unit_test_utils.h>
#include <increment.h>
/**
* Declares a struct as the Boost test fixture.
*/
BOOST_AUTO_TEST_SUITE( StringIncrement )
struct INCREMENT_TEST_CASE
{
wxString input;
int delta;
size_t part;
wxString expected;
};
/**
* Check formatting the point
*/
BOOST_AUTO_TEST_CASE( BasicCase )
{
const std::vector<INCREMENT_TEST_CASE> cases{
// Null
{ "", 1, 0, "nullopt" },
{ "", 1, 1, "nullopt" },
{ "", -1, 1, "nullopt" },
// Up
{ "1", 1, 0, "2" },
{ "1", 9, 0, "10" },
// Down
{ "2", -1, 0, "1" },
{ "10", -1, 0, "9" },
// Down from 0
{ "0", -1, 0, "nullopt" },
// Ran out of a parts
{ "1", 1, 1, "nullopt" },
// Leading zeros preserved
{ "01", 1, 0, "02" },
// Alpha
{ "A", 1, 0, "B" },
{ "E", -1, 0, "D" },
// Skip I
{ "H", 1, 0, "J" },
{ "J", -1, 0, "H" },
// But I works if it's there
{ "I", 1, 0, "J" },
{ "I", -1, 0, "H" },
// Alpha wrap
{ "Z", 1, 0, "AA" },
// Reject huge alphabetic value
{ "ABB", 1, 0, "nullopt" },
// Dashes skipped
{ "A-1", 1, 0, "A-2" },
{ "A-1", 1, 1, "B-1" },
};
STRING_INCREMENTER incrementer;
incrementer.SetSkipIOSQXZ( true );
for( const auto& c : cases )
{
BOOST_TEST_INFO( "Input: " << c.input << " Delta: " << c.delta << " Part: " << c.part );
wxString result = incrementer.Increment( c.input, c.delta, c.part ).value_or( "nullopt" );
BOOST_CHECK_EQUAL( result, c.expected );
}
}
struct ALPHABETIC_TEST_CASE
{
wxString input;
const wxString& alphabet;
int expected;
};
BOOST_AUTO_TEST_CASE( AlphabeticIndexes )
{
const wxString alphabet = "ABCDEFGHJKLMNPRTUVWY";
const std::vector<ALPHABETIC_TEST_CASE> cases{ {
{ "A", alphabet, 0 },
{ "B", alphabet, 1 },
{ "Y", alphabet, 19 },
{ "AA", alphabet, 20 },
{ "AY", alphabet, 39 },
} };
for( const auto& c : cases )
{
BOOST_TEST_INFO( "Input: " << c.input << " <-> " << c.expected );
const int fromString = IndexFromAlphabetic( c.input, c.alphabet );
BOOST_CHECK_EQUAL( fromString, c.expected );
const wxString fromIndex = AlphabeticFromIndex( c.expected, c.alphabet, true );
BOOST_CHECK_EQUAL( fromIndex, c.input );
}
}
BOOST_AUTO_TEST_SUITE_END()