677 lines
19 KiB
C++
677 lines
19 KiB
C++
|
#include "srd-preproc-cmd-common.hh"
|
||
|
#include "srd-preproc-location.hh"
|
||
|
using namespace lw;
|
||
|
|
||
|
|
||
|
class SRDPreprocTrackingTest : public CppUnit::TestFixture
|
||
|
{
|
||
|
CPPUNIT_TEST_SUITE( SRDPreprocTrackingTest );
|
||
|
|
||
|
CPPUNIT_TEST( testTopLevel );
|
||
|
|
||
|
CPPUNIT_TEST( testVar );
|
||
|
CPPUNIT_TEST( testVarGet );
|
||
|
|
||
|
CPPUNIT_TEST( testCall );
|
||
|
CPPUNIT_TEST( testCalls );
|
||
|
CPPUNIT_TEST( testCallRecursive );
|
||
|
|
||
|
CPPUNIT_TEST( testEval );
|
||
|
CPPUNIT_TEST( testEvalCalls );
|
||
|
|
||
|
CPPUNIT_TEST( testCommandOutput );
|
||
|
|
||
|
#if 0
|
||
|
CPPUNIT_TEST( testMacroBody );
|
||
|
CPPUNIT_TEST( testMacroBodyCall );
|
||
|
CPPUNIT_TEST( testMacroBodyEval );
|
||
|
CPPUNIT_TEST( testCallMacroBody );
|
||
|
CPPUNIT_TEST( testEvalMacroBody );
|
||
|
|
||
|
CPPUNIT_TEST( testMacroOutput );
|
||
|
CPPUNIT_TEST( testMacroOutputCall );
|
||
|
CPPUNIT_TEST( testMacroOutputEval );
|
||
|
CPPUNIT_TEST( testCallMacroOutput );
|
||
|
CPPUNIT_TEST( testEvalMacroOutput );
|
||
|
|
||
|
#endif
|
||
|
// CPPUNIT_TEST( testErrorTopLevel );
|
||
|
#if 0
|
||
|
CPPUNIT_TEST( testErrorCall );
|
||
|
#endif
|
||
|
|
||
|
CPPUNIT_TEST_SUITE_END( );
|
||
|
|
||
|
public:
|
||
|
void testTopLevel( );
|
||
|
|
||
|
void testVar( );
|
||
|
void testVarGet( );
|
||
|
|
||
|
void testCall( );
|
||
|
void testCalls( );
|
||
|
void testCallRecursive( );
|
||
|
|
||
|
void testEval( );
|
||
|
void testEvalCalls( );
|
||
|
|
||
|
void testCommandOutput( );
|
||
|
|
||
|
#if 0
|
||
|
void testMacroBody( );
|
||
|
void testMacroBodyCall( );
|
||
|
void testMacroBodyEval( );
|
||
|
void testCallMacroBody( );
|
||
|
void testEvalMacroBody( );
|
||
|
|
||
|
void testMacroOutput( );
|
||
|
void testMacroOutputCall( );
|
||
|
void testMacroOutputEval( );
|
||
|
void testCallMacroOutput( );
|
||
|
void testEvalMacroOutput( );
|
||
|
|
||
|
#endif
|
||
|
void testErrorTopLevel( );
|
||
|
#if 0
|
||
|
void testErrorCall( );
|
||
|
#endif
|
||
|
};
|
||
|
CPPUNIT_TEST_SUITE_REGISTRATION( SRDPreprocTrackingTest );
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testTopLevel( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"a\n"
|
||
|
"(-scope b)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "a b" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 0 );
|
||
|
M_CKTOKLOC_( 0 , "test" , 1 , 1 );
|
||
|
M_CKTOKDEPTH_( 1 , 0 );
|
||
|
M_CKTOKLOC_( 1 , "test" , 2 , 9 );
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testVar( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set var value)\n"
|
||
|
"$var\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "value" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 1 );
|
||
|
M_CKTOKLOC_( 0 , "$var" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 0 , 0 , SUBSTITUTED , "test" , 2 , 1 , 0 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testVarGet( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set (var vn) value var)\n"
|
||
|
"(-get var $vn)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "value value" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 1 );
|
||
|
M_CKTOKLOC_( 0 , "$var" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 0 , 0 , SUBSTITUTED , "test" , 2 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 1 , 1 );
|
||
|
M_CKTOKLOC_( 1 , "$var" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 1 , 0 , SUBSTITUTED , "test" , 2 , 2 , 0 );
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCall( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( () b )))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"a ($fn)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "a b" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 0 );
|
||
|
M_CKTOKLOC_( 0 , "test" , 3 , 1 );
|
||
|
M_CKTOKDEPTH_( 1 , 1 );
|
||
|
M_CKTOKLOC_( 1 , "test" , 1 , 21 );
|
||
|
M_CKTOKCHAIN_( 1 , 0 , CALLED , "test" , 3 , 4 , 0 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCalls( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set ( fn1 fn2 ) (-raw\n"
|
||
|
"((d)\n"
|
||
|
"I ($fn2 $d) )\n"
|
||
|
"((d)\n"
|
||
|
"got $d)\n"
|
||
|
"))\n"
|
||
|
"(-bless fn1 fn2)\n"
|
||
|
"($fn1 it)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "I got it" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 1 );
|
||
|
M_CKTOKLOC_( 0 , "test" , 3 , 1 );
|
||
|
M_CKTOKCHAIN_( 0 , 0 , CALLED , "test" , 8 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 1 , 2 );
|
||
|
M_CKTOKLOC_( 1 , "test" , 5 , 1 );
|
||
|
M_CKTOKCHAIN_( 1 , 0 , CALLED , "test" , 3 , 4 , 0 );
|
||
|
M_CKTOKCHAIN_( 1 , 1 , CALLED , "test" , 8 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 2 , 3 );
|
||
|
M_CKTOKLOC_( 2 , "$d" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 2 , 0 , SUBSTITUTED , "test" , 5 , 5 , 0 );
|
||
|
M_CKTOKCHAIN_( 2 , 1 , CALLED , "test" , 3 , 4 , 0 );
|
||
|
M_CKTOKCHAIN_( 2 , 2 , CALLED , "test" , 8 , 2 , 0 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCallRecursive( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( (d)\n"
|
||
|
"$d\n"
|
||
|
"(-if (-gt $d 0) (\n"
|
||
|
"($fn (-sub $d 1))\n"
|
||
|
")))))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"($fn 6)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "6 5 4 3 2 1 0" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 2 );
|
||
|
M_CKTOKCHAIN_( 0 , 0 , SUBSTITUTED , "test" , 2 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 0 , 1 , CALLED , "test" , 7 , 2 , 0 );
|
||
|
|
||
|
for ( auto i = 1u ; i < 7 ; i ++ ) {
|
||
|
M_CKTOKDEPTH_( i , 3 );
|
||
|
M_CKTOKCHAIN_( i , 0 , SUBSTITUTED , "test" , 2 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( i , 1 , CALLED , "test" , 4 , 2 , i - 1 );
|
||
|
M_CKTOKCHAIN_( i , 2 , CALLED , "test" , 7 , 2 , 0 );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testEval( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set (x y f)\n"
|
||
|
"(-raw $y)\n"
|
||
|
"x\n"
|
||
|
"(() (-raw a (-raw $y) b))\n"
|
||
|
")\n"
|
||
|
"(-bless f)\n"
|
||
|
"(-eval x $y $x ($f))\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "x x x a x b" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 0 );
|
||
|
M_CKTOKLOC_( 0 , "test" , 7 , 8 );
|
||
|
M_CKTOKDEPTH_( 1 , 1 );
|
||
|
M_CKTOKLOC_( 1 , "$y" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 1 , 0 , SUBSTITUTED , "test" , 7 , 10 , 0 );
|
||
|
M_CKTOKDEPTH_( 2 , 2 );
|
||
|
M_CKTOKLOC_( 2 , "$y" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 2 , 0 , SUBSTITUTED , "$x" , 0 , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 2 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 3 , 1 );
|
||
|
M_CKTOKLOC_( 3 , "test" , 4 , 11 );
|
||
|
M_CKTOKCHAIN_( 3 , 0 , CALLED , "test" , 7 , 17 , 0 );
|
||
|
M_CKTOKDEPTH_( 4 , 2 );
|
||
|
M_CKTOKLOC_( 4 , "$y" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 4 , 0 , SUBSTITUTED , "test" , 4 , 19 , 0 );
|
||
|
M_CKTOKCHAIN_( 4 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 5 , 1 );
|
||
|
M_CKTOKLOC_( 5 , "test" , 4 , 23 );
|
||
|
M_CKTOKCHAIN_( 5 , 0 , CALLED , "test" , 7 , 17 , 0 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testEvalCalls( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set (x y f)\n"
|
||
|
"(-raw ($f 2))\n"
|
||
|
"(-raw $x)\n"
|
||
|
"(-raw ((x) a $x b))\n"
|
||
|
")\n"
|
||
|
"(-bless f)\n"
|
||
|
"(-eval ($f 1) $x $y $x)\n"
|
||
|
, errors ) );
|
||
|
#if 0
|
||
|
printf( "\n\n" );
|
||
|
for ( auto i = 0u ; i < output.size( ) ; i ++ ) {
|
||
|
PrintLoc_( &output[ i ].location( ) );
|
||
|
printf( "\n" );
|
||
|
}
|
||
|
#endif
|
||
|
CPPUNIT_ASSERT( check( "a 1 b a 2 b ($f 2) a 2 b" , output ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 1 );
|
||
|
M_CKTOKLOC_( 0 , "test" , 4 , 12 );
|
||
|
M_CKTOKCHAIN_( 0 , 0 , CALLED , "test" , 7 , 9 , 0 );
|
||
|
M_CKTOKDEPTH_( 1 , 2 );
|
||
|
M_CKTOKLOC_( 1 , "$x" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 1 , 0 , SUBSTITUTED , "test" , 4 , 14 , 0 );
|
||
|
M_CKTOKCHAIN_( 1 , 1 , CALLED , "test" , 7 , 9 , 0 );
|
||
|
M_CKTOKDEPTH_( 2 , 1 );
|
||
|
M_CKTOKLOC_( 2 , "test" , 4 , 17 );
|
||
|
M_CKTOKCHAIN_( 2 , 0 , CALLED , "test" , 7 , 9 , 0 );
|
||
|
|
||
|
M_CKTOKDEPTH_( 3 , 2 );
|
||
|
M_CKTOKLOC_( 3 , "test" , 4 , 12 );
|
||
|
M_CKTOKCHAIN_( 3 , 0 , CALLED , "$x" , 0 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 3 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 4 , 3 );
|
||
|
M_CKTOKLOC_( 4 , "$x" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 4 , 0 , SUBSTITUTED , "test" , 4 , 14 , 0 );
|
||
|
M_CKTOKCHAIN_( 4 , 1 , CALLED , "$x" , 0 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 4 , 2 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 5 , 2 );
|
||
|
M_CKTOKLOC_( 5 , "test" , 4 , 17 );
|
||
|
M_CKTOKCHAIN_( 5 , 0 , CALLED , "$x" , 0 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 5 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
|
||
|
for ( auto i = 0u ; i < 4 ; i ++ ) {
|
||
|
M_CKTOKDEPTH_( i + 6 , 2 );
|
||
|
M_CKTOKLOC_( i + 6 , "$x" , 0 , i );
|
||
|
M_CKTOKCHAIN_( i + 6 , 0 , SUBSTITUTED , "$y" , 0 , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( i + 6 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
}
|
||
|
|
||
|
M_CKTOKDEPTH_( 10 , 2 );
|
||
|
M_CKTOKLOC_( 10 , "test" , 4 , 12 );
|
||
|
M_CKTOKCHAIN_( 10 , 0 , CALLED , "$x" , 0 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 10 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 11 , 3 );
|
||
|
M_CKTOKLOC_( 11 , "$x" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 11 , 0 , SUBSTITUTED , "test" , 4 , 14 , 0 );
|
||
|
M_CKTOKCHAIN_( 11 , 1 , CALLED , "$x" , 0 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 11 , 2 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 12 , 2 );
|
||
|
M_CKTOKLOC_( 12 , "test" , 4 , 17 );
|
||
|
M_CKTOKCHAIN_( 12 , 0 , CALLED , "$x" , 0 , 1 , 0 );
|
||
|
M_CKTOKCHAIN_( 12 , 1 , EVALUATED , "test" , 7 , 2 , 0 );
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCommandOutput( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-add 1 2)\n"
|
||
|
"(-is-set x)\n"
|
||
|
"(-type-of w)\n"
|
||
|
"(-eq a b)\n"
|
||
|
"(-to-string x \"x\")\n"
|
||
|
"(-length abcdef)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "3 0 word 0 \"x\" \"x\" 6" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 0u , errors.size( ) );
|
||
|
|
||
|
M_CKTOKDEPTH_( 0 , 1 );
|
||
|
M_CKTOKLOC_( 0 , "-add" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 0 , 0 , GENERATED , "test" , 1 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 1 , 1 );
|
||
|
M_CKTOKLOC_( 1 , "-is-set" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 1 , 0 , GENERATED , "test" , 2 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 2 , 1 );
|
||
|
M_CKTOKLOC_( 2 , "-type-of" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 2 , 0 , GENERATED , "test" , 3 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 3 , 1 );
|
||
|
M_CKTOKLOC_( 3 , "-eq" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 3 , 0 , GENERATED , "test" , 4 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 4 , 1 );
|
||
|
M_CKTOKLOC_( 4 , "-to-string" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 4 , 0 , GENERATED , "test" , 5 , 2 , 0 );
|
||
|
M_CKTOKDEPTH_( 5 , 0 );
|
||
|
M_CKTOKLOC_( 5 , "test" , 5 , 15 );
|
||
|
M_CKTOKDEPTH_( 6 , 1 );
|
||
|
M_CKTOKLOC_( 6 , "-length" , 0 , 0 );
|
||
|
M_CKTOKCHAIN_( 6 , 0 , GENERATED , "test" , 6 , 2 , 0 );
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
void SRDPreprocTrackingTest::testCallRecursive( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( (d)\n"
|
||
|
"(-if $d (\n"
|
||
|
"($fn (-sub $d 1))\n"
|
||
|
") (\n"
|
||
|
"(-error)\n"
|
||
|
")))))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"($fn 6)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 5 , 1 );
|
||
|
M_CKERRDEPTH_( 0 , 2 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 3 , 1 , 6 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 8 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCalls( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn1 (-raw ( (d)\n"
|
||
|
"(-if $d (\n"
|
||
|
"($fn1 (-sub $d 1))\n"
|
||
|
") (\n"
|
||
|
"($fn2 4)\n"
|
||
|
")))))\n"
|
||
|
"(-set fn2 (-raw ( (d)\n"
|
||
|
"(-if $d (\n"
|
||
|
"($fn2 (-sub $d 1))\n"
|
||
|
") (\n"
|
||
|
"(-error)\n"
|
||
|
")))))\n"
|
||
|
"(-bless fn1 fn2)\n"
|
||
|
"($fn1 6)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 11 , 1 );
|
||
|
M_CKERRDEPTH_( 0 , 4 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 9 , 1 , 4 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 5 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::CALLED , 3 , 1 , 6 );
|
||
|
M_CKERRCHAIN_( 0 , 3 , E_SRDLocationChaining::CALLED , 14 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testEval( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-eval\n"
|
||
|
"( (-raw -error ) )\n"
|
||
|
")\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 2 , 1 );
|
||
|
M_CKERRDEPTH_( 0 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::EVALUATED , 1 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testEvalCall( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( (d)\n"
|
||
|
"(-if $d (\n"
|
||
|
"($fn (-sub $d 1))\n"
|
||
|
") (\n"
|
||
|
"(-error)\n"
|
||
|
")))))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"(-eval (-raw ($fn 6)))\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 5 , 1 );
|
||
|
M_CKERRDEPTH_( 0 , 3 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 3 , 1 , 6 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 8 , 14 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::EVALUATED , 8 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCallEval( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( (d)\n"
|
||
|
"(-if $d (\n"
|
||
|
"($fn (-sub $d 1))\n"
|
||
|
") (\n"
|
||
|
"(-eval (-raw (-error)))\n"
|
||
|
")))))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"($fn 6)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 5 , 14 );
|
||
|
M_CKERRDEPTH_( 0 , 3 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::EVALUATED , 5 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 3 , 1 , 6 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::CALLED , 8 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testMacroBody( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-error) )))\n"
|
||
|
"(m)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 26 );
|
||
|
M_CKERRDEPTH_( 0 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 2 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testMacroBodyCall( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( () (-error) )))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"(-set-macro m (-raw ( () ($fn) )))\n"
|
||
|
"(m)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 21 );
|
||
|
M_CKERRDEPTH_( 0 , 2 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 3 , 26 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 4 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testMacroBodyEval( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-eval (-raw (-error))) )))\n"
|
||
|
"(m)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 39 );
|
||
|
M_CKERRDEPTH_( 0 , 2 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::EVALUATED , 1 , 26 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 2 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCallMacroBody( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-error) )))\n"
|
||
|
"(-set fn (-raw ( () (m))))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"($fn)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 26 );
|
||
|
M_CKERRDEPTH_( 0 , 2 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 2 , 21 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::CALLED , 4 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testEvalMacroBody( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-error) )))\n"
|
||
|
"(-eval (-raw (m)))\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 26 );
|
||
|
M_CKERRDEPTH_( 0 , 2 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 2 , 14 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::EVALUATED , 2 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testMacroOutput( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-raw (-error)) )))\n"
|
||
|
"(m)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 32 );
|
||
|
M_CKERRDEPTH_( 0 , 3 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::EVALUATED , 2 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::GENERATED , 1 , 32 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::CALLED , 2 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testMacroOutputCall( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set fn (-raw ( () (-error) )))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"(-set-macro m (-raw ( () (-raw ($fn)) )))\n"
|
||
|
"(m)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 21 );
|
||
|
M_CKERRDEPTH_( 0 , 4 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::CALLED , 3 , 32 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::EVALUATED , 4 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::GENERATED , 3 , 32 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 3 , E_SRDLocationChaining::CALLED , 4 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testMacroOutputEval( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-raw\n"
|
||
|
"(-eval (-raw (-error)))\n"
|
||
|
") )))\n"
|
||
|
"(m)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 2 , 14 );
|
||
|
M_CKERRDEPTH_( 0 , 4 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::EVALUATED , 2 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::EVALUATED , 4 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::GENERATED , 2 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 3 , E_SRDLocationChaining::CALLED , 4 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testCallMacroOutput( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-raw\n"
|
||
|
"(-error)\n"
|
||
|
") )))\n"
|
||
|
"(-set fn (-raw ( () (m) )))\n"
|
||
|
"(-bless fn)\n"
|
||
|
"($fn)\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 2 , 1 );
|
||
|
M_CKERRDEPTH_( 0 , 4 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , E_SRDLocationChaining::EVALUATED , 4 , 21 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , E_SRDLocationChaining::GENERATED , 2 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , E_SRDLocationChaining::CALLED , 4 , 21 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 3 , E_SRDLocationChaining::CALLED , 6 , 1 , 1 );
|
||
|
}
|
||
|
|
||
|
void SRDPreprocTrackingTest::testEvalMacroOutput( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-set-macro m (-raw ( () (-raw\n"
|
||
|
"(-error)\n"
|
||
|
") )))\n"
|
||
|
"(-eval (-raw (m)))\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 1u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 2 , 1 );
|
||
|
M_CKERRDEPTH_( 0 , 4 );
|
||
|
M_CKERRCHAIN_( 0 , 0 , EVALUATED , 4 , 14 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 1 , GENERATED , 2 , 1 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 2 , CALLED , 4 , 14 , 1 );
|
||
|
M_CKERRCHAIN_( 0 , 3 , EVALUATED , 4 , 1 , 1 );
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
/*----------------------------------------------------------------------------*/
|
||
|
|
||
|
void SRDPreprocTrackingTest::testErrorTopLevel( )
|
||
|
{
|
||
|
T_SRDErrors errors;
|
||
|
T_SRDList output( process(
|
||
|
"(-error)\n"
|
||
|
"(-scope (-error))\n"
|
||
|
, errors ) );
|
||
|
CPPUNIT_ASSERT( check( "" , output ) );
|
||
|
CPPUNIT_ASSERT_EQUAL( 2u , errors.size( ) );
|
||
|
|
||
|
M_CKERR_( 0 , "user error" , 1 , 2 );
|
||
|
M_CKERRDEPTH_( 0 , 0 );
|
||
|
|
||
|
M_CKERR_( 1 , "user error" , 2 , 10 );
|
||
|
M_CKERRDEPTH_( 1 , 0 );
|
||
|
}
|