2008-12-18 22:28:57 +01:00
/*
2009-01-21 21:04:20 +01:00
* Cppcheck - A tool for static C / C + + code analysis
* Copyright ( C ) 2007 - 2009 Daniel Marjamäki , Reijo Tomperi , Nicolas Le Cam ,
2009-03-01 20:52:33 +01:00
* Leandro Penz , Kimmo Varis , Vesa Pikki
2008-12-18 22:28:57 +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/
*/
// The preprocessor that c++check uses is a bit special. Instead of generating
// the code for a known configuration, it generates the code for each configuration.
# include <cstring>
# include "testsuite.h"
2009-01-06 15:18:36 +01:00
# include "../src/tokenize.h"
2008-12-18 22:28:57 +01:00
extern std : : ostringstream errout ;
class TestTokenizer : public TestFixture
{
public :
TestTokenizer ( ) : TestFixture ( " TestTokenizer " )
{ }
2009-02-07 21:06:00 +01:00
class OurTokenizer : public Tokenizer
{
public :
void simplifyCasts ( )
{
Tokenizer : : simplifyCasts ( ) ;
}
bool simplifyIfAddBraces ( )
{
return Tokenizer : : simplifyIfAddBraces ( ) ;
}
bool simplifyKnownVariables ( )
{
return Tokenizer : : simplifyKnownVariables ( ) ;
}
std : : vector < const Token * > & getFunctionList ( )
{
return _functionList ;
}
} ;
2008-12-18 22:28:57 +01:00
private :
void run ( )
{
2009-03-17 20:50:06 +01:00
TEST_CASE ( minus ) ;
2009-01-05 16:49:57 +01:00
TEST_CASE ( longtok ) ;
2008-12-18 22:28:57 +01:00
2009-02-04 20:40:48 +01:00
TEST_CASE ( removeCast1 ) ;
2009-01-05 16:49:57 +01:00
TEST_CASE ( inlineasm ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( dupfuncname ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( const_and_volatile_functions ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( ifAddBraces1 ) ;
TEST_CASE ( ifAddBraces2 ) ;
TEST_CASE ( ifAddBraces3 ) ;
TEST_CASE ( ifAddBraces4 ) ;
2009-03-15 13:44:57 +01:00
TEST_CASE ( ifAddBraces5 ) ;
2009-05-09 22:12:14 +02:00
TEST_CASE ( ifAddBraces6 ) ;
2008-12-22 10:20:46 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( numeric_true_condition ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( simplifyKnownVariables1 ) ;
TEST_CASE ( simplifyKnownVariables2 ) ;
TEST_CASE ( simplifyKnownVariables3 ) ;
TEST_CASE ( simplifyKnownVariables4 ) ;
TEST_CASE ( simplifyKnownVariables5 ) ;
2009-02-20 18:27:57 +01:00
TEST_CASE ( simplifyKnownVariables6 ) ;
2009-02-24 17:11:37 +01:00
TEST_CASE ( simplifyKnownVariables7 ) ;
2009-02-27 19:25:47 +01:00
TEST_CASE ( simplifyKnownVariables8 ) ;
2009-03-25 07:10:17 +01:00
TEST_CASE ( simplifyKnownVariables9 ) ;
2009-05-01 20:31:07 +02:00
TEST_CASE ( simplifyKnownVariables10 ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( match1 ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( match2 ) ;
2008-12-18 22:28:57 +01:00
2009-01-05 16:49:57 +01:00
TEST_CASE ( varid1 ) ;
TEST_CASE ( varid2 ) ;
2009-02-02 18:35:46 +01:00
TEST_CASE ( varid3 ) ;
2009-02-15 15:02:57 +01:00
TEST_CASE ( varid4 ) ;
2009-02-16 18:41:33 +01:00
TEST_CASE ( varid5 ) ;
2009-03-25 18:15:49 +01:00
TEST_CASE ( varid6 ) ;
2009-03-01 17:37:02 +01:00
TEST_CASE ( varid7 ) ;
2009-02-28 21:21:48 +01:00
TEST_CASE ( varidReturn ) ;
2009-03-25 18:10:03 +01:00
TEST_CASE ( varid8 ) ;
2009-03-28 21:07:33 +01:00
TEST_CASE ( varid9 ) ;
2009-04-25 16:55:00 +02:00
TEST_CASE ( varidStl ) ;
2009-04-29 21:22:56 +02:00
TEST_CASE ( varid_delete ) ;
2009-05-03 13:50:26 +02:00
TEST_CASE ( varidclass1 ) ;
TEST_CASE ( varidclass2 ) ;
TEST_CASE ( varidclass3 ) ;
TEST_CASE ( varidclass4 ) ;
2009-01-19 19:40:24 +01:00
2009-01-19 19:51:27 +01:00
TEST_CASE ( file1 ) ;
2009-01-20 23:25:49 +01:00
TEST_CASE ( file2 ) ;
2009-02-15 12:42:04 +01:00
TEST_CASE ( file3 ) ;
2009-01-20 18:26:16 +01:00
TEST_CASE ( doublesharp ) ;
2009-01-24 08:56:47 +01:00
2009-02-13 14:33:12 +01:00
TEST_CASE ( macrodoublesharp ) ;
2009-01-26 23:26:50 +01:00
TEST_CASE ( simplify_function_parameters ) ;
2009-01-25 20:39:05 +01:00
2009-02-04 20:40:48 +01:00
TEST_CASE ( reduce_redundant_paranthesis ) ; // Ticket #61
2009-02-02 07:21:48 +01:00
2009-02-07 20:15:10 +01:00
TEST_CASE ( simplify_numeric_condition ) ;
2009-02-08 10:51:45 +01:00
TEST_CASE ( tokenize_double ) ;
2009-02-08 11:25:33 +01:00
TEST_CASE ( tokenize_strings ) ;
2009-02-12 20:26:42 +01:00
TEST_CASE ( simplify_constants ) ;
2009-02-14 22:33:28 +01:00
TEST_CASE ( simplify_constants2 ) ;
2009-03-13 22:38:42 +01:00
TEST_CASE ( findClassFunction1 ) ;
2009-03-16 19:03:23 +01:00
2009-03-18 20:32:05 +01:00
TEST_CASE ( vardecl1 ) ;
TEST_CASE ( vardecl2 ) ;
2009-04-20 20:38:05 +02:00
TEST_CASE ( volatile_variables ) ;
2009-05-07 22:17:29 +02:00
TEST_CASE ( syntax_error ) ;
2008-12-18 22:28:57 +01:00
}
2009-01-03 21:29:20 +01:00
bool cmptok ( const char * expected [ ] , const Token * actual )
2008-12-18 22:28:57 +01:00
{
unsigned int i = 0 ;
for ( ; expected [ i ] & & actual ; + + i , actual = actual - > next ( ) )
{
2009-05-03 20:10:59 +02:00
if ( strcmp ( expected [ i ] , actual - > str ( ) . c_str ( ) ) ! = 0 )
2008-12-18 22:28:57 +01:00
return false ;
}
return ( expected [ i ] = = NULL & & actual = = NULL ) ;
}
2009-01-18 09:52:20 +01:00
std : : string tokenizeAndStringify ( const char code [ ] )
{
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
{
ostr < < tok - > str ( ) ;
// Append newlines
2009-01-18 12:13:25 +01:00
if ( tok - > next ( ) )
2009-01-18 09:52:20 +01:00
{
2009-01-18 12:13:25 +01:00
if ( tok - > linenr ( ) ! = tok - > next ( ) - > linenr ( ) )
2009-01-18 09:52:20 +01:00
{
2009-01-18 12:14:35 +01:00
for ( unsigned int i = tok - > linenr ( ) ; i < tok - > next ( ) - > linenr ( ) ; + + i )
2009-01-18 09:52:20 +01:00
ostr < < " \n " ;
}
else
{
ostr < < " " ;
}
}
}
return ostr . str ( ) ;
}
2009-03-17 20:50:06 +01:00
void minus ( )
{
ASSERT_EQUALS ( " i = -12 " , tokenizeAndStringify ( " i = -12 " ) ) ;
ASSERT_EQUALS ( " 1 - 2 " , tokenizeAndStringify ( " 1-2 " ) ) ;
ASSERT_EQUALS ( " foo ( -1 ) - 2 " , tokenizeAndStringify ( " foo(-1)-2 " ) ) ;
2009-03-18 19:48:06 +01:00
ASSERT_EQUALS ( " int f ( ) { return -2 ; } " , tokenizeAndStringify ( " int f(){return -2;} " ) ) ;
2009-03-17 20:50:06 +01:00
}
2009-01-18 09:52:20 +01:00
2008-12-18 22:28:57 +01:00
void longtok ( )
{
2009-01-05 16:49:57 +01:00
std : : string filedata ( 10000 , ' a ' ) ;
2008-12-18 22:28:57 +01:00
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( filedata ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Expected result..
2009-05-01 22:41:55 +02:00
ASSERT_EQUALS ( std : : string ( 10000 , ' a ' ) , tokenizer . tokens ( ) - > str ( ) ) ;
2008-12-18 22:28:57 +01:00
}
2009-02-04 20:40:48 +01:00
// Dont remove "(int *)"..
void removeCast1 ( )
{
const char code [ ] = " int *f(int *); " ;
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2009-02-04 20:40:48 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyCasts ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " int * f ( int * ) ; " ) , ostr . str ( ) ) ;
}
2008-12-18 22:28:57 +01:00
void inlineasm ( )
{
2009-05-01 12:39:14 +02:00
{
const char code [ ] = " abc asm { mov ax,bx } def " ;
ASSERT_EQUALS ( " abc def " , tokenizeAndStringify ( code ) ) ;
}
2008-12-18 22:28:57 +01:00
2009-05-01 19:53:08 +02:00
{
const char code [ ] = " abc _asm { mov ax,bx } def " ;
ASSERT_EQUALS ( " abc def " , tokenizeAndStringify ( code ) ) ;
}
2008-12-18 22:28:57 +01:00
{
2009-05-01 12:39:14 +02:00
const char code [ ] = " abc __asm { mov ax,bx } def " ;
ASSERT_EQUALS ( " abc def " , tokenizeAndStringify ( code ) ) ;
}
2008-12-18 22:28:57 +01:00
}
void dupfuncname ( )
{
const char code [ ] = " void a() \n "
" { } \n "
" void a(int i) \n "
" { } \n "
" void b() \n "
" { } \n " ;
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-18 22:28:57 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . fillFunctionList ( ) ;
2009-02-07 21:06:00 +01:00
ASSERT_EQUALS ( 1 , static_cast < unsigned int > ( tokenizer . getFunctionList ( ) . size ( ) ) ) ;
2009-05-03 20:10:59 +02:00
ASSERT_EQUALS ( std : : string ( " b " ) , tokenizer . getFunctionList ( ) [ 0 ] - > str ( ) ) ;
2008-12-18 22:28:57 +01:00
}
void const_and_volatile_functions ( )
{
const char code [ ] = " class B \n \
{ \ n \
public : \ n \
void a ( ) ; \ n \
void b ( ) const ; \ n \
void c ( ) volatile ; \ n \
} ; \ n \
\ n \
void B : : a ( ) \ n \
{ } \ n \
\ n \
void B : : b ( ) const \ n \
{ } \ n \
\ n \
void B : : c ( ) volatile \ n \
{ } \ n " ;
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-18 22:28:57 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . fillFunctionList ( ) ;
2009-02-07 21:06:00 +01:00
ASSERT_EQUALS ( 3 , static_cast < unsigned int > ( tokenizer . getFunctionList ( ) . size ( ) ) ) ;
if ( tokenizer . getFunctionList ( ) . size ( ) = = 3 )
2008-12-18 22:28:57 +01:00
{
2009-02-07 21:06:00 +01:00
ASSERT_EQUALS ( std : : string ( " a " ) , tokenizer . getFunctionList ( ) [ 0 ] - > str ( ) ) ;
ASSERT_EQUALS ( std : : string ( " b " ) , tokenizer . getFunctionList ( ) [ 1 ] - > str ( ) ) ;
ASSERT_EQUALS ( std : : string ( " c " ) , tokenizer . getFunctionList ( ) [ 2 ] - > str ( ) ) ;
2008-12-18 22:28:57 +01:00
}
}
void numeric_true_condition ( )
{
const char code [ ] = " void f() \n "
" { \n "
" if (5==5); \n "
" } \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-18 22:28:57 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { { ; } } " ) , ostr . str ( ) ) ;
2008-12-18 22:28:57 +01:00
}
2008-12-22 19:05:22 +01:00
void ifAddBraces1 ( )
2008-12-22 10:20:46 +01:00
{
2008-12-22 19:05:22 +01:00
const char code [ ] = " void f() \n "
" { \n "
" if (a); \n "
2008-12-23 09:11:33 +01:00
" else ; \n "
2008-12-22 19:05:22 +01:00
" } \n " ;
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:05:22 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-22 10:20:46 +01:00
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , tokenizer . simplifyIfAddBraces ( ) ) ;
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:05:22 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { if ( a ) { ; } else { ; } } " ) , ostr . str ( ) ) ;
2008-12-22 19:05:22 +01:00
}
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
void ifAddBraces2 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" if (a) if (b) { } \n "
" } \n " ;
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:05:22 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-22 10:20:46 +01:00
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , tokenizer . simplifyIfAddBraces ( ) ) ;
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:05:22 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { if ( a ) { if ( b ) { } } } " ) , ostr . str ( ) ) ;
2008-12-22 19:05:22 +01:00
}
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
void ifAddBraces3 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" if (a) for (;;) { } \n "
" } \n " ;
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:05:22 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-22 10:20:46 +01:00
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , tokenizer . simplifyIfAddBraces ( ) ) ;
2008-12-22 10:20:46 +01:00
2008-12-22 19:05:22 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:05:22 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { if ( a ) { for ( ; ; ) { } } } " ) , ostr . str ( ) ) ;
2008-12-22 10:20:46 +01:00
}
2008-12-22 19:32:04 +01:00
void ifAddBraces4 ( )
{
const char code [ ] = " char * foo () \n "
" { \n "
" char *str = malloc(10); \n "
" if (somecondition) \n "
" for ( ; ; ) \n "
" { } \n "
" return str; \n "
" } \n " ;
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:32:04 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , tokenizer . simplifyIfAddBraces ( ) ) ;
2008-12-22 19:32:04 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:32:04 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " char * foo ( ) { char * str ; str = malloc ( 10 ) ; if ( somecondition ) { for ( ; ; ) { } } return str ; } " ) , ostr . str ( ) ) ;
2008-12-22 19:32:04 +01:00
}
2009-03-15 13:44:57 +01:00
void ifAddBraces5 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" for(int i = 0; i < 2; i++) \n "
" if(true) \n "
" return; \n "
" \n "
" return; \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
ASSERT_EQUALS ( true , tokenizer . simplifyIfAddBraces ( ) ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void f ( ) { for ( int i = 0 ; i < 2 ; i ++ ) { if ( true ) { return ; } } return ; } " ) , ostr . str ( ) ) ;
}
2009-05-09 22:12:14 +02:00
void ifAddBraces6 ( )
{
const char code [ ] = " if() " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
ASSERT_EQUALS ( false , tokenizer . simplifyIfAddBraces ( ) ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " if ( ) " ) , ostr . str ( ) ) ;
}
2009-03-15 13:44:57 +01:00
2008-12-22 19:08:32 +01:00
void simplifyKnownVariables1 ( )
2008-12-18 22:28:57 +01:00
{
2008-12-22 19:08:32 +01:00
const char code [ ] = " void f() \n "
" { \n "
" int a = 10; \n "
" if (a); \n "
" } \n " ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:08:32 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:08:32 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { int a ; a = 10 ; if ( 10 ) ; } " ) , ostr . str ( ) ) ;
2008-12-22 19:08:32 +01:00
}
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
void simplifyKnownVariables2 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" int a = 10; \n "
" a = g(); \n "
" if (a); \n "
" } \n " ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:08:32 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:08:32 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { int a ; a = 10 ; a = g ( ) ; if ( a ) ; } " ) , ostr . str ( ) ) ;
2008-12-22 19:08:32 +01:00
}
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
void simplifyKnownVariables3 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" int a = 4; \n "
" while(true){ \n "
" break; \n "
" a = 10; \n "
" } \n "
" if (a); \n "
" } \n " ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:08:32 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:08:32 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { int a ; a = 4 ; while ( true ) { break ; a = 10 ; } if ( a ) ; } " ) , ostr . str ( ) ) ;
2008-12-22 19:08:32 +01:00
}
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
void simplifyKnownVariables4 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" int a = 4; \n "
" if ( g(a)); \n "
" } \n " ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:08:32 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:08:32 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-03-25 07:10:17 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { int a ; a = 4 ; if ( g ( 4 ) ) ; } " ) , ostr . str ( ) ) ;
2008-12-22 19:08:32 +01:00
}
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
void simplifyKnownVariables5 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" int a = 4; \n "
" if ( a = 5 ); \n "
" } \n " ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
// tokenize..
2009-02-07 21:06:00 +01:00
OurTokenizer tokenizer ;
2008-12-22 19:08:32 +01:00
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
2008-12-18 22:28:57 +01:00
2008-12-22 19:08:32 +01:00
std : : ostringstream ostr ;
2009-01-03 21:29:20 +01:00
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
2008-12-22 19:08:32 +01:00
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { int a ; a = 4 ; if ( a = 5 ) ; } " ) , ostr . str ( ) ) ;
2008-12-18 22:28:57 +01:00
}
2009-02-20 18:27:57 +01:00
void simplifyKnownVariables6 ( )
{
const char code [ ] = " void f() \n "
" { \n "
" char str[2]; "
" int a = 4; \n "
" str[a] = 0; \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { char str [ 2 ] ; int a ; a = 4 ; str [ 4 ] = 0 ; } " ) , ostr . str ( ) ) ;
2009-02-20 18:27:57 +01:00
}
2009-02-24 17:11:37 +01:00
void simplifyKnownVariables7 ( )
{
const char code [ ] = " void foo() \n "
" { \n "
" int i = 22; \n "
" abc[i++] = 1; \n "
" abc[++i] = 2; \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void foo ( ) { int i ; i = 24 ; abc [ 22 ] = 1 ; abc [ 24 ] = 2 ; } " ) , ostr . str ( ) ) ;
2009-02-24 17:11:37 +01:00
}
2009-02-27 19:25:47 +01:00
void simplifyKnownVariables8 ( )
{
const char code [ ] = " void foo() \n "
" { \n "
" int i = 22; \n "
" i++; \n "
" abc[i] = 0; \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void foo ( ) { int i ; i = 23 ; ; abc [ 23 ] = 0 ; } " ) , ostr . str ( ) ) ;
2009-03-25 07:10:17 +01:00
}
void simplifyKnownVariables9 ( )
{
const char code [ ] = " void foo() \n "
" { \n "
" int a = 1, b = 2; \n "
" if (a < b) \n "
" ; \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void foo ( ) { int a ; a = 1 ; int b ; b = 2 ; if ( 1 < 2 ) ; } " ) , ostr . str ( ) ) ;
2009-02-27 19:25:47 +01:00
}
2009-05-01 20:31:07 +02:00
void simplifyKnownVariables10 ( )
{
{
const char code [ ] = " void f() \n "
" { \n "
" bool b=false; \n "
" \n "
" { \n "
" b = true; \n "
" } \n "
" \n "
" if( b ) \n "
" { \n "
" a(); \n "
" } \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void f ( ) { bool b ; b = false ; { b = true ; } if ( true ) { a ( ) ; } } " ) , ostr . str ( ) ) ;
}
2009-02-24 17:11:37 +01:00
2009-05-01 20:31:07 +02:00
{
const char code [ ] = " void f() \n "
" { \n "
" bool b=false; \n "
" { b = false; } \n "
" { \n "
" b = true; \n "
" } \n "
" \n "
" if( b ) \n "
" { \n "
" a(); \n "
" } \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void f ( ) { bool b ; b = false ; { b = false ; } { b = true ; } if ( true ) { a ( ) ; } } " ) , ostr . str ( ) ) ;
}
2009-05-03 20:57:27 +02:00
{
const char code [ ] = " void f() \n "
" { \n "
" int b=0; \n "
" b = 1; \n "
" for( int i = 0; i < 10; i++ ) "
" { \n "
" } \n "
" \n "
" a(b); \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyKnownVariables ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void f ( ) { int b ; b = 0 ; b = 1 ; for ( int i = 0 ; i < 10 ; i ++ ) { } a ( 1 ) ; } " ) , ostr . str ( ) ) ;
}
2009-05-01 20:31:07 +02:00
}
2009-02-24 17:11:37 +01:00
2008-12-18 22:28:57 +01:00
void match1 ( )
{
// Match "%var% | %var%"
{
const std : : string code ( " abc|def " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , Token : : Match ( tokenizer . tokens ( ) , " %var% | %var% " ) ) ;
2008-12-18 22:28:57 +01:00
}
// Match "%var% || %var%"
{
const std : : string code ( " abc||def " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , Token : : Match ( tokenizer . tokens ( ) , " %var% || %var% " ) ) ;
2008-12-18 22:28:57 +01:00
}
}
void match2 ( )
{
{
const std : : string code ( " " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , Token : : Match ( tokenizer . tokens ( ) , " !!else " ) ) ;
2008-12-18 22:28:57 +01:00
}
2009-01-10 01:33:48 +01:00
{
const std : : string code ( " " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
ASSERT_EQUALS ( false , Token : : Match ( tokenizer . tokens ( ) , " !!else something " ) ) ;
}
2009-01-10 22:13:10 +01:00
{
const std : : string code ( " if ; " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
ASSERT_EQUALS ( true , Token : : Match ( tokenizer . tokens ( ) , " !!return if " ) ) ;
}
2008-12-18 22:28:57 +01:00
{
const std : : string code ( " if ; " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , Token : : Match ( tokenizer . tokens ( ) , " if ; !!else " ) ) ;
2008-12-18 22:28:57 +01:00
}
{
const std : : string code ( " if ; something " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( true , Token : : Match ( tokenizer . tokens ( ) , " if ; !!else " ) ) ;
2008-12-18 22:28:57 +01:00
}
{
const std : : string code ( " else " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( false , Token : : Match ( tokenizer . tokens ( ) , " !!else " ) ) ;
2008-12-18 22:28:57 +01:00
}
{
const std : : string code ( " if ; else " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
// Match..
2009-01-05 16:49:57 +01:00
ASSERT_EQUALS ( false , Token : : Match ( tokenizer . tokens ( ) , " if ; !!else " ) ) ;
2008-12-18 22:28:57 +01:00
}
}
void varid1 ( )
{
2009-02-13 07:25:29 +01:00
const std : : string code ( " static int i = 1; \n "
2008-12-18 22:28:57 +01:00
" void f() \n "
" { \n "
" int i = 2; \n "
" for (int i = 0; i < 10; ++i) \n "
" i = 3; \n "
" i = 4; \n "
2009-01-05 16:49:57 +01:00
" } \n " ) ;
2008-12-18 22:28:57 +01:00
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
2009-02-13 07:25:29 +01:00
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-03-18 20:32:05 +01:00
" 1: static int i@1 ; i@1 = 1 ; \n "
2009-02-13 07:25:29 +01:00
" 2: void f ( ) \n "
" 3: { \n "
2009-03-18 20:32:05 +01:00
" 4: int i@2 ; i@2 = 2 ; \n "
2009-02-14 11:13:50 +01:00
" 5: for ( int i@3 = 0 ; i@3 < 10 ; ++ i@3 ) \n "
2009-02-13 07:25:29 +01:00
" 6: i@3 = 3 ; \n "
" 7: i@2 = 4 ; \n "
" 8: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
2008-12-18 22:28:57 +01:00
}
void varid2 ( )
{
const std : : string code ( " void f() \n "
" { \n "
" struct ABC abc; \n "
" abc.a = 3; \n "
" i = abc.a; \n "
2009-01-05 16:49:57 +01:00
" } \n " ) ;
2008-12-18 22:28:57 +01:00
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
2009-02-13 07:25:29 +01:00
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-02-13 07:25:29 +01:00
" 1: void f ( ) \n "
" 2: { \n "
" 3: struct ABC abc@1 ; \n "
" 4: abc@1 . a@2 = 3 ; \n "
" 5: i = abc@1 . a@2 ; \n "
" 6: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
2008-12-18 22:28:57 +01:00
}
2009-01-19 19:40:24 +01:00
2009-02-02 18:27:34 +01:00
void varid3 ( )
{
const std : : string code ( " static char str[4]; \n "
" void f() \n "
" { \n "
" char str[10]; \n "
" str[0] = 0; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
2009-02-13 07:25:29 +01:00
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-02-13 07:25:29 +01:00
" 1: static char str@1 [ 4 ] ; \n "
" 2: void f ( ) \n "
" 3: { \n "
" 4: char str@2 [ 10 ] ; \n "
" 5: str@2 [ 0 ] = 0 ; \n "
" 6: } \n " ) ;
2009-02-13 17:23:02 +01:00
ASSERT_EQUALS ( expected , actual ) ;
}
void varid4 ( )
{
const std : : string code ( " void f(const unsigned int a[]) \n "
" { \n "
" int i = *(a+10); \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-02-13 17:23:02 +01:00
" 1: void f ( const int a@1 [ ] ) \n "
" 2: { \n "
" 3: int i@2 ; i@2 = a@1 [ 10 ] ; \n "
" 4: } \n " ) ;
2009-02-13 18:25:23 +01:00
ASSERT_EQUALS ( expected , actual ) ;
}
void varid5 ( )
{
const std : : string code ( " void f() \n "
" { \n "
" int a,b; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyTokenList ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-02-13 18:25:23 +01:00
" 1: void f ( ) \n "
" 2: { \n "
" 3: int a@1 ; int b@2 ; \n "
" 4: } \n " ) ;
2009-02-13 07:25:29 +01:00
ASSERT_EQUALS ( expected , actual ) ;
2009-02-02 18:27:34 +01:00
}
2009-01-19 19:40:24 +01:00
2009-02-16 21:46:24 +01:00
void varid6 ( )
{
const std : : string code ( " int f(int a, int b) \n "
" { \n "
" return a+b; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-03-25 18:15:49 +01:00
" 1: int f ( int a@1 , int b@2 ) \n "
2009-02-16 21:46:24 +01:00
" 2: { \n "
" 3: return a@1 + b@2 ; \n "
" 4: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
}
2009-03-01 17:37:02 +01:00
void varid7 ( )
{
const std : : string code ( " void func() \n "
" { \n "
2009-03-15 22:09:27 +01:00
" char a[256] = \" test \" ; \n "
" { \n "
" char b[256] = \" test \" ; \n "
" } \n "
2009-03-01 17:37:02 +01:00
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-03-01 17:37:02 +01:00
" 1: void func ( ) \n "
" 2: { \n "
" 3: char a@1 [ 256 ] = \" test \" ; \n "
" 4: { \n "
" 5: char b@2 [ 256 ] = \" test \" ; \n "
" 6: } \n "
" 7: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
}
2009-02-28 21:21:48 +01:00
void varidReturn ( )
{
const std : : string code ( " int f() \n "
" { \n "
" int a; \n "
" return a; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
2009-03-03 21:17:23 +01:00
const std : : string expected ( " \n \n ##file 0 \n "
2009-02-28 21:21:48 +01:00
" 1: int f ( ) \n "
" 2: { \n "
" 3: int a@1 ; \n "
" 4: return a@1 ; \n "
" 5: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
}
2009-03-25 18:10:03 +01:00
void varid8 ( )
{
const std : : string code ( " void func() \n "
" { \n "
" std::string str( \" test \" ); \n "
" str.clear(); \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: void func ( ) \n "
" 2: { \n "
" 3: std :: string str@1 ( \" test \" ) ; \n "
" 4: str@1 . clear@2 ( ) ; \n "
" 5: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
}
2009-02-16 21:46:24 +01:00
2009-03-28 21:07:33 +01:00
void varid9 ( )
{
const std : : string code ( " typedef int INT32; \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: typedef int INT32 ; \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
2009-04-25 16:55:00 +02:00
}
void varidStl ( )
{
const std : : string code ( " list<int> ints; \n "
" list<int>::iterator it; \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: list < int > ints@1 ; \n "
" 2: list < int > :: iterator it@2 ; \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
2009-03-28 21:07:33 +01:00
}
2009-04-29 21:22:56 +02:00
void varid_delete ( )
{
const std : : string code ( " void f() \n "
" { \n "
" int *a; \n "
" delete a; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
2009-03-28 21:07:33 +01:00
2009-04-29 21:22:56 +02:00
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: void f ( ) \n "
" 2: { \n "
" 3: int * a@1 ; \n "
" 4: delete a@1 ; \n "
" 5: } \n " ) ;
2009-04-29 21:45:57 +02:00
ASSERT_EQUALS ( expected , actual ) ;
2009-05-02 22:57:18 +02:00
}
2009-05-03 13:50:26 +02:00
void varidclass1 ( )
2009-05-02 22:57:18 +02:00
{
const std : : string code ( " class Fred \n "
" { \n "
" private: \n "
" int i; \n "
" \n "
" void foo1(); \n "
" void foo2() \n "
" { \n "
" ++i; \n "
" } \n "
" } \n "
" \n "
" Fred::foo1() \n "
" { \n "
" i = 0; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: class Fred \n "
" 2: { \n "
" 3: private: \n "
" 4: int i@1 ; \n "
" 5: \n "
" 6: void foo1@2 ( ) ; \n "
" 7: void foo2 ( ) \n "
" 8: { \n "
" 9: ++ i@1 ; \n "
" 10: } \n "
" 11: } \n "
" 12: \n "
" 13: Fred :: foo1 ( ) \n "
" 14: { \n "
" 15: i@1 = 0 ; \n "
" 16: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
2009-05-03 13:50:26 +02:00
}
void varidclass2 ( )
{
const std : : string code ( " class Fred \n "
" { void f(); }; \n "
" \n "
" void A::foo1() \n "
" { \n "
" int i = 0; \n "
" } \n "
" \n "
" void Fred::f() \n "
" { \n "
" i = 0; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: class Fred \n "
" 2: { void f@1 ( ) ; } ; \n "
" 3: \n "
" 4: void A :: foo1 ( ) \n "
" 5: { \n "
" 6: int i@2 ; i@2 = 0 ; \n "
" 7: } \n "
" 8: \n "
" 9: void Fred :: f ( ) \n "
" 10: { \n "
" 11: i = 0 ; \n "
" 12: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
}
void varidclass3 ( )
{
const std : : string code ( " class Fred \n "
" { int i; void f(); }; \n "
" \n "
" void Fred::f() \n "
" { \n "
" i = 0; \n "
" } \n "
" \n "
" void A::f() \n "
" { \n "
" i = 0; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: class Fred \n "
" 2: { int i@1 ; void f@2 ( ) ; } ; \n "
" 3: \n "
" 4: void Fred :: f ( ) \n "
" 5: { \n "
" 6: i@1 = 0 ; \n "
" 7: } \n "
" 8: \n "
" 9: void A :: f ( ) \n "
" 10: { \n "
" 11: i = 0 ; \n "
" 12: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
}
void varidclass4 ( )
{
const std : : string code ( " class Fred \n "
" { int i; void f(); }; \n "
" \n "
" void Fred::f() \n "
" { \n "
" if (i) { } \n "
" i = 0; \n "
" } \n " ) ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
// result..
const std : : string actual ( tokenizer . tokens ( ) - > stringifyList ( true ) ) ;
const std : : string expected ( " \n \n ##file 0 \n "
" 1: class Fred \n "
" 2: { int i@1 ; void f@2 ( ) ; } ; \n "
" 3: \n "
" 4: void Fred :: f ( ) \n "
" 5: { \n "
" 6: if ( i@1 ) { } \n "
" 7: i@1 = 0 ; \n "
" 8: } \n " ) ;
ASSERT_EQUALS ( expected , actual ) ;
2009-04-29 21:22:56 +02:00
}
2009-02-16 21:46:24 +01:00
2009-01-19 19:40:24 +01:00
void file1 ( )
{
const char code [ ] = " a1 \n "
" #file \" b \" \n "
" b1 \n "
" b2 \n "
" #endfile \n "
" a3 \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " a " ) ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
{
std : : ostringstream ostr ;
ostr < < char ( ' a ' + tok - > fileIndex ( ) ) < < tok - > linenr ( ) ;
ASSERT_EQUALS ( tok - > str ( ) , ostr . str ( ) ) ;
}
}
2009-01-20 18:05:42 +01:00
void file2 ( )
{
const char code [ ] = " a1 \n "
" #file \" b \" \n "
" b1 \n "
" b2 \n "
" #file \" c \" \n "
" c1 \n "
" c2 \n "
" #endfile \n "
" b4 \n "
" #endfile \n "
" a3 \n "
" #file \" d \" \n "
" d1 \n "
" #endfile \n "
" a5 \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " a " ) ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
{
std : : ostringstream ostr ;
ostr < < char ( ' a ' + tok - > fileIndex ( ) ) < < tok - > linenr ( ) ;
ASSERT_EQUALS ( tok - > str ( ) , ostr . str ( ) ) ;
}
}
2009-01-20 18:26:16 +01:00
2009-02-15 12:42:04 +01:00
void file3 ( )
{
const char code [ ] = " #file \" c: \\ a.h \" \n "
" 123 \n "
" #endfile \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " a.cpp " ) ;
ASSERT_EQUALS ( " [c: \\ a.h:1] " , tokenizer . fileLine ( tokenizer . tokens ( ) ) ) ;
}
2009-01-20 18:26:16 +01:00
void doublesharp ( )
{
const char code [ ] = " TEST(var,val) var##_##val = val \n " ;
// Tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " " ) ;
// Stringify the tokens..
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < tok - > str ( ) < < " " ;
ASSERT_EQUALS ( " TEST ( var , val ) var ## _ ## val = val " , ostr . str ( ) ) ;
}
2009-01-24 08:56:47 +01:00
2009-02-13 14:33:12 +01:00
void macrodoublesharp ( )
{
const char code [ ] = " DBG(fmt,args...) printf(fmt, ## args) \n " ;
// Tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " " ) ;
// Stringify the tokens..
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < tok - > str ( ) < < " " ;
ASSERT_EQUALS ( " DBG ( fmt , args . . . ) printf ( fmt , ## args ) " , ostr . str ( ) ) ;
}
2009-01-24 08:56:47 +01:00
void simplify_function_parameters ( )
{
{
const char code [ ] = " void f(x) int x; \n "
" { \n "
" } \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void f ( int x ) { } " ) , ostr . str ( ) ) ;
}
{
const char code [ ] = " void f(x,y) int x; char y; \n "
" { \n "
" } \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-01-26 23:26:50 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( int x , char y ) { } " ) , ostr . str ( ) ) ;
2009-01-24 08:56:47 +01:00
}
2009-01-24 19:21:16 +01:00
{
// This is not a function but the pattern is similar..
const char code [ ] = " void foo() \n "
" { \n "
" if (x) \n "
" int x; \n "
" { } \n "
" } \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-01-26 23:26:50 +01:00
ASSERT_EQUALS ( std : : string ( " void foo ( ) { if ( x ) { int x ; } { } } " ) , ostr . str ( ) ) ;
2009-01-24 19:21:16 +01:00
}
2009-01-24 08:56:47 +01:00
}
2009-01-25 20:39:05 +01:00
// Simplify "((..))" into "(..)"
2009-02-04 20:40:48 +01:00
void reduce_redundant_paranthesis ( )
2009-01-25 20:39:05 +01:00
{
const char code [ ] = " void foo() \n "
" { \n "
" free(((void*)p)); \n "
" } " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void foo ( ) { free ( p ) ; } " ) , ostr . str ( ) ) ;
}
2009-02-04 20:31:25 +01:00
2009-02-02 07:21:48 +01:00
2009-02-07 20:15:10 +01:00
void simplify_numeric_condition ( )
{
const char code [ ] =
" void f() \n "
" { \n "
" int x = 0; \n "
" if( !x || 0 ) \n "
" { \n "
" } \n "
" } " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
ASSERT_EQUALS ( std : : string ( " void f ( ) { int x ; x = 0 ; if ( ! x ) { } } " ) , ostr . str ( ) ) ;
}
2009-02-08 10:51:45 +01:00
void tokenize_double ( )
{
const char code [ ] = " void f() \n "
" { \n "
" double a = 4.2; \n "
" float b = 4.2f; \n "
2009-02-08 11:39:55 +01:00
" double c = 4.2e+10; \n "
" double d = 4.2e-10; \n "
2009-02-08 11:56:20 +01:00
" int e = 4+2; \n "
2009-02-08 10:51:45 +01:00
" } \n " ;
2009-02-07 20:15:10 +01:00
2009-02-08 10:51:45 +01:00
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { double a ; a = 4.2 ; float b ; b = 4.2f ; double c ; c = 4.2e+10 ; double d ; d = 4.2e-10 ; int e ; e = 4 + 2 ; } " ) , ostr . str ( ) ) ;
2009-02-08 10:51:45 +01:00
}
2009-02-08 11:25:33 +01:00
void tokenize_strings ( )
{
const char code [ ] = " void f() \n "
" { \n "
" const char *a = \n "
" { \n "
" \" hello \" \n "
" \" more \" \n "
" \" world \" \n "
" }; \n "
" } \n " ;
// tokenize..
OurTokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { const char * a ; a = { \" hello more world \" } ; } " ) , ostr . str ( ) ) ;
2009-02-08 11:25:33 +01:00
}
2009-02-11 23:15:22 +01:00
void simplify_constants ( )
{
const char code [ ] =
" void f() \n "
" { \n "
" const int a = 45; \n "
2009-02-12 20:26:42 +01:00
" if( a ) \n "
" { int b = a; } \n "
2009-02-11 23:15:22 +01:00
" } \n "
" void g() \n "
" { \n "
" int a = 2; \n "
" } \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
2009-02-12 20:26:42 +01:00
ASSERT_EQUALS ( std : : string ( " void f ( ) { const int a = 45 ; { int b ; b = 45 ; } } void g ( ) { int a ; a = 2 ; } " ) , ostr . str ( ) ) ;
2009-02-11 23:15:22 +01:00
}
2009-02-14 22:33:28 +01:00
void simplify_constants2 ( )
{
const char code [ ] =
" void f( Foo &foo, Foo *foo2 ) \n "
" { \n "
" const int a = 45; \n "
" foo.a=a+a; \n "
" foo2->a=a; \n "
" } \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
tokenizer . setVarId ( ) ;
tokenizer . simplifyTokenList ( ) ;
std : : ostringstream ostr ;
for ( const Token * tok = tokenizer . tokens ( ) ; tok ; tok = tok - > next ( ) )
ostr < < " " < < tok - > str ( ) ;
std : : ostringstream oss ;
oss < < " void f ( Foo & foo , Foo * foo2 ) { const int a = 45 ; foo . a = 90 ; foo2 . a = 45 ; } " ;
ASSERT_EQUALS ( oss . str ( ) , ostr . str ( ) ) ;
}
2009-03-13 22:38:42 +01:00
void findClassFunction1 ( )
{
const char code [ ] =
" class Fred "
" { \n "
" public: \n "
" Fred() \n "
" { } \n "
" }; \n " ;
// tokenize..
Tokenizer tokenizer ;
std : : istringstream istr ( code ) ;
tokenizer . tokenize ( istr , " test.cpp " ) ;
int i ;
i = 0 ;
const Token * tok = Tokenizer : : FindClassFunction ( tokenizer . tokens ( ) , " Fred " , " %var% " , i ) ;
ASSERT_EQUALS ( true , Token : : simpleMatch ( tok , " Fred ( ) { " ) ) ;
tok = Tokenizer : : FindClassFunction ( tok - > next ( ) , " Fred " , " %var% " , i ) ;
2009-03-18 22:13:27 +01:00
ASSERT_EQUALS ( 0 , tok ? 1 : 0 ) ;
2009-03-13 22:38:42 +01:00
}
2009-03-16 19:03:23 +01:00
void vardecl1 ( )
{
const char code [ ] = " unsigned int a, b; " ;
2009-03-18 20:32:05 +01:00
const std : : string actual ( tokenizeAndStringify ( code ) ) ;
2009-03-16 19:03:23 +01:00
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( " unsigned int a ; unsigned int b ; " , actual ) ;
2009-03-16 19:03:23 +01:00
}
void vardecl2 ( )
{
const char code [ ] = " void foo(a,b) unsigned int a, b; { } " ;
2009-03-18 20:32:05 +01:00
const std : : string actual ( tokenizeAndStringify ( code ) ) ;
2009-03-16 19:03:23 +01:00
2009-03-18 20:32:05 +01:00
ASSERT_EQUALS ( " void foo ( a , b ) unsigned int a ; unsigned int b ; { } " , actual ) ;
2009-03-16 19:03:23 +01:00
}
2009-04-20 20:38:05 +02:00
void volatile_variables ( )
{
const char code [ ] = " volatile int a=0; \n "
" volatile int b=0; \n "
" volatile int c=0; \n " ;
const std : : string actual ( tokenizeAndStringify ( code ) ) ;
ASSERT_EQUALS ( " int a ; a = 0 ; \n int b ; b = 0 ; \n int c ; c = 0 ; " , actual ) ;
}
2009-05-07 22:17:29 +02:00
void syntax_error ( )
{
2009-05-11 21:52:04 +02:00
Settings s ;
2009-05-07 22:17:29 +02:00
{
2009-05-11 21:52:04 +02:00
errout . str ( " " ) ;
2009-05-07 22:17:29 +02:00
const char code [ ] = " void f() {} " ;
2009-05-11 21:52:04 +02:00
Tokenizer tokenizer ( s , this ) ;
2009-05-07 22:17:29 +02:00
std : : istringstream istr ( code ) ;
ASSERT_EQUALS ( true , tokenizer . tokenize ( istr , " test.cpp " ) ) ;
ASSERT_EQUALS ( std : : string ( " " ) , errout . str ( ) ) ;
}
{
2009-05-11 21:52:04 +02:00
errout . str ( " " ) ;
2009-05-07 22:17:29 +02:00
const char code [ ] = " void f() {{} " ;
2009-05-11 21:52:04 +02:00
Tokenizer tokenizer ( s , this ) ;
2009-05-07 22:17:29 +02:00
std : : istringstream istr ( code ) ;
ASSERT_EQUALS ( false , tokenizer . tokenize ( istr , " test.cpp " ) ) ;
2009-05-11 21:52:04 +02:00
ASSERT_EQUALS ( std : : string ( " [test.cpp:1]: (error) Invalid number of character ({). Can't process file. \n " ) , errout . str ( ) ) ;
2009-05-07 22:17:29 +02:00
}
{
2009-05-11 21:52:04 +02:00
errout . str ( " " ) ;
2009-05-07 22:17:29 +02:00
const char code [ ] = " void f()) {} " ;
2009-05-11 21:52:04 +02:00
Tokenizer tokenizer ( s , this ) ;
2009-05-07 22:17:29 +02:00
std : : istringstream istr ( code ) ;
ASSERT_EQUALS ( false , tokenizer . tokenize ( istr , " test.cpp " ) ) ;
2009-05-11 21:52:04 +02:00
ASSERT_EQUALS ( std : : string ( " [test.cpp:1]: (error) Invalid number of character ((). Can't process file. \n " ) , errout . str ( ) ) ;
2009-05-07 22:17:29 +02:00
}
}
2008-12-18 22:28:57 +01:00
} ;
2009-01-05 16:49:57 +01:00
REGISTER_TEST ( TestTokenizer )