2020-01-24 07:06:09 +01:00
/*
* Cppcheck - A tool for static C / C + + code analysis
2023-01-28 10:16:34 +01:00
* Copyright ( C ) 2007 - 2023 Cppcheck team .
2020-01-24 07:06:09 +01:00
*
* 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 3 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 , see < http : //www.gnu.org/licenses/>.
*/
2023-01-27 08:18:32 +01:00
# include "helpers.h"
# include "fixture.h"
2023-03-02 21:50:14 +01:00
# include "settings.h"
2020-01-24 07:06:09 +01:00
# include "utils.h"
2023-04-30 07:33:19 +02:00
# include <cstddef>
# include <cstdint>
# include <limits>
# include <string>
2021-02-18 16:28:04 +01:00
const Settings givenACodeSampleToTokenize : : settings ;
2020-01-24 07:06:09 +01:00
class TestUtils : public TestFixture {
public :
2021-08-07 20:51:18 +02:00
TestUtils ( ) : TestFixture ( " TestUtils " ) { }
2020-01-24 07:06:09 +01:00
private :
2022-02-10 23:02:24 +01:00
void run ( ) override {
2020-01-24 07:06:09 +01:00
TEST_CASE ( isValidGlobPattern ) ;
TEST_CASE ( matchglob ) ;
2022-10-09 11:19:19 +02:00
TEST_CASE ( isStringLiteral ) ;
TEST_CASE ( isCharLiteral ) ;
2023-04-08 22:29:09 +02:00
TEST_CASE ( strToInt ) ;
2020-01-24 07:06:09 +01:00
}
2022-03-02 07:46:47 +01:00
void isValidGlobPattern ( ) const {
2020-01-24 07:06:09 +01:00
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " * " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " *x " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " x* " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " */x/* " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " x/*/z " ) ) ;
ASSERT_EQUALS ( false , : : isValidGlobPattern ( " ** " ) ) ;
ASSERT_EQUALS ( false , : : isValidGlobPattern ( " **x " ) ) ;
ASSERT_EQUALS ( false , : : isValidGlobPattern ( " x** " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " ? " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " ?x " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " x? " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " ?/x/? " ) ) ;
ASSERT_EQUALS ( true , : : isValidGlobPattern ( " x/?/z " ) ) ;
ASSERT_EQUALS ( false , : : isValidGlobPattern ( " ?? " ) ) ;
ASSERT_EQUALS ( false , : : isValidGlobPattern ( " ??x " ) ) ;
ASSERT_EQUALS ( false , : : isValidGlobPattern ( " x?? " ) ) ;
}
2022-03-02 07:46:47 +01:00
void matchglob ( ) const {
2020-01-24 07:06:09 +01:00
ASSERT_EQUALS ( true , : : matchglob ( " * " , " xyz " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " x* " , " xyz " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " *z " , " xyz " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " *y* " , " xyz " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " *y* " , " yz " ) ) ;
ASSERT_EQUALS ( false , : : matchglob ( " *y* " , " abc " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " * " , " x/y/z " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " */y/z " , " x/y/z " ) ) ;
ASSERT_EQUALS ( false , : : matchglob ( " ? " , " xyz " ) ) ;
ASSERT_EQUALS ( false , : : matchglob ( " x? " , " xyz " ) ) ;
ASSERT_EQUALS ( false , : : matchglob ( " ?z " , " xyz " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " ?y? " , " xyz " ) ) ;
ASSERT_EQUALS ( true , : : matchglob ( " ?/?/? " , " x/y/z " ) ) ;
}
2022-10-09 11:19:19 +02:00
void isStringLiteral ( ) const {
// empty
ASSERT_EQUALS ( false , : : isStringLiteral ( " " ) ) ;
// no literals
ASSERT_EQUALS ( false , : : isStringLiteral ( " u8 " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " U " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " L " ) ) ;
// incomplete string literals
ASSERT_EQUALS ( false , : : isStringLiteral ( " \" " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u8 \" " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u \" " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " U \" " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " L \" " ) ) ;
// valid string literals
ASSERT_EQUALS ( true , : : isStringLiteral ( " \" \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " u8 \" \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " u \" \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " U \" \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " L \" \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " \" t \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " u8 \" t \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " u \" t \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " U \" t \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " L \" t \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " \" test \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " u8 \" test \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " u \" test \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " U \" test \" " ) ) ;
ASSERT_EQUALS ( true , : : isStringLiteral ( " L \" test \" " ) ) ;
// incomplete char literals
ASSERT_EQUALS ( false , : : isStringLiteral ( " ' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u8' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " U' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " L' " ) ) ;
// valid char literals
ASSERT_EQUALS ( false , : : isStringLiteral ( " 't' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u8't' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u't' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " U't' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " L't' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " 'test' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u8'test' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " u'test' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " U'test' " ) ) ;
ASSERT_EQUALS ( false , : : isStringLiteral ( " L'test' " ) ) ;
}
void isCharLiteral ( ) const {
// empty
ASSERT_EQUALS ( false , : : isCharLiteral ( " " ) ) ;
// no literals
ASSERT_EQUALS ( false , : : isCharLiteral ( " u8 " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " U " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " L " ) ) ;
// incomplete string literals
ASSERT_EQUALS ( false , : : isCharLiteral ( " \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u8 \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " U \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " L \" " ) ) ;
// valid string literals
ASSERT_EQUALS ( false , : : isCharLiteral ( " \" \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u8 \" \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u \" \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " U \" \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " L \" \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " \" t \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u8 \" t \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u \" t \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " U \" t \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " L \" t \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " \" test \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u8 \" test \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u \" test \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " U \" test \" " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " L \" test \" " ) ) ;
// incomplete char literals
ASSERT_EQUALS ( false , : : isCharLiteral ( " ' " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u8' " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " u' " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " U' " ) ) ;
ASSERT_EQUALS ( false , : : isCharLiteral ( " L' " ) ) ;
// valid char literals
ASSERT_EQUALS ( true , : : isCharLiteral ( " 't' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " u8't' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " u't' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " U't' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " L't' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " 'test' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " u8'test' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " u'test' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " U'test' " ) ) ;
ASSERT_EQUALS ( true , : : isCharLiteral ( " L'test' " ) ) ;
}
2023-04-08 22:29:09 +02:00
void strToInt ( ) {
ASSERT_EQUALS ( 1 , : : strToInt < int > ( " 1 " ) ) ;
ASSERT_EQUALS ( - 1 , : : strToInt < int > ( " -1 " ) ) ;
ASSERT_EQUALS ( 1 , : : strToInt < std : : size_t > ( " 1 " ) ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( " " ) , std : : runtime_error , " converting '' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < std : : size_t > ( " " ) , std : : runtime_error , " converting '' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( " " ) , std : : runtime_error , " converting ' ' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < std : : size_t > ( " " ) , std : : runtime_error , " converting ' ' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < unsigned int > ( " -1 " ) , std : : runtime_error , " converting '-1' to integer failed - needs to be positive " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( " 1ms " ) , std : : runtime_error , " converting '1ms' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( " 1.0 " ) , std : : runtime_error , " converting '1.0' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( " one " ) , std : : runtime_error , " converting 'one' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < unsigned int > ( " 1ms " ) , std : : runtime_error , " converting '1ms' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < unsigned int > ( " 1.0 " ) , std : : runtime_error , " converting '1.0' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < unsigned int > ( " one " ) , std : : runtime_error , " converting 'one' to integer failed - not an integer " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int > : : max ( ) ) + 1 ) ) , std : : runtime_error , " converting '2147483648' to integer failed - out of range (limits) " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int > : : min ( ) ) - 1 ) ) , std : : runtime_error , " converting '-2147483649' to integer failed - out of range (limits) " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int8_t > ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int8_t > : : max ( ) ) + 1 ) ) , std : : runtime_error , " converting '128' to integer failed - out of range (limits) " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int8_t > ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int8_t > : : min ( ) ) - 1 ) ) , std : : runtime_error , " converting '-129' to integer failed - out of range (limits) " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < unsigned int > ( std : : to_string ( static_cast < uint64_t > ( std : : numeric_limits < unsigned int > : : max ( ) ) + 1 ) ) , std : : runtime_error , " converting '4294967296' to integer failed - out of range (limits) " ) ;
ASSERT_THROW_EQUALS_2 ( : : strToInt < int > ( " 9223372036854775808 " ) , std : : runtime_error , " converting '9223372036854775808' to integer failed - out of range (stoll) " ) ; // LLONG_MAX + 1
ASSERT_THROW_EQUALS_2 ( : : strToInt < std : : size_t > ( " 18446744073709551616 " ) , std : : runtime_error , " converting '18446744073709551616' to integer failed - out of range (stoull) " ) ; // ULLONG_MAX + 1
{
long tmp ;
ASSERT ( : : strToInt ( " 1 " , tmp ) ) ;
ASSERT_EQUALS ( 1 , tmp ) ;
}
{
long tmp ;
ASSERT ( : : strToInt ( " -1 " , tmp ) ) ;
ASSERT_EQUALS ( - 1 , tmp ) ;
}
{
std : : size_t tmp ;
ASSERT ( : : strToInt ( " 1 " , tmp ) ) ;
}
{
std : : size_t tmp ;
ASSERT ( ! : : strToInt ( " -1 " , tmp ) ) ;
}
{
long tmp ;
ASSERT ( ! : : strToInt ( " 1ms " , tmp ) ) ;
}
{
unsigned long tmp ;
ASSERT ( ! : : strToInt ( " 1ms " , tmp ) ) ;
}
{
long tmp ;
ASSERT ( ! : : strToInt ( " " , tmp ) ) ;
}
{
unsigned long tmp ;
ASSERT ( ! : : strToInt ( " " , tmp ) ) ;
}
{
long tmp ;
ASSERT ( ! : : strToInt ( " " , tmp ) ) ;
}
{
unsigned long tmp ;
ASSERT ( ! : : strToInt ( " " , tmp ) ) ;
}
{
long tmp ;
std : : string err ;
ASSERT ( : : strToInt ( " 1 " , tmp , & err ) ) ;
ASSERT_EQUALS ( 1 , tmp ) ;
ASSERT_EQUALS ( " " , err ) ;
}
{
std : : size_t tmp ;
std : : string err ;
ASSERT ( : : strToInt ( " 1 " , tmp , & err ) ) ;
ASSERT_EQUALS ( 1 , tmp ) ;
ASSERT_EQUALS ( " " , err ) ;
}
{
unsigned long tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " -1 " , tmp , & err ) ) ;
ASSERT_EQUALS ( " needs to be positive " , err ) ;
}
{
long tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " 1ms " , tmp , & err ) ) ;
ASSERT_EQUALS ( " not an integer " , err ) ;
}
{
long tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " 1.0 " , tmp , & err ) ) ;
ASSERT_EQUALS ( " not an integer " , err ) ;
}
{
long tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " one " , tmp , & err ) ) ;
ASSERT_EQUALS ( " not an integer " , err ) ;
}
{
std : : size_t tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " 1ms " , tmp , & err ) ) ;
ASSERT_EQUALS ( " not an integer " , err ) ;
}
{
long tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " 9223372036854775808 " , tmp , & err ) ) ; // LLONG_MAX + 1
ASSERT_EQUALS ( " out of range (stoll) " , err ) ;
}
{
int tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int > : : max ( ) ) + 1 ) , tmp , & err ) ) ;
ASSERT_EQUALS ( " out of range (limits) " , err ) ;
}
{
int tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int > : : min ( ) ) - 1 ) , tmp , & err ) ) ;
ASSERT_EQUALS ( " out of range (limits) " , err ) ;
}
{
int8_t tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int8_t > : : max ( ) ) + 1 ) , tmp , & err ) ) ;
ASSERT_EQUALS ( " out of range (limits) " , err ) ;
}
{
int8_t tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( std : : to_string ( static_cast < int64_t > ( std : : numeric_limits < int8_t > : : min ( ) ) - 1 ) , tmp , & err ) ) ;
ASSERT_EQUALS ( " out of range (limits) " , err ) ;
}
{
std : : size_t tmp ;
std : : string err ;
ASSERT ( ! : : strToInt ( " 18446744073709551616 " , tmp , & err ) ) ; // ULLONG_MAX + 1
ASSERT_EQUALS ( " out of range (stoull) " , err ) ;
}
}
2020-01-24 07:06:09 +01:00
} ;
REGISTER_TEST ( TestUtils )