// Copyright (c) 2014-2018 Dr. Colin Hirsch and Daniel Frey
// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/
#include "test.hpp"
namespace tao
{
namespace TAO_PEGTL_NAMESPACE
{
namespace test1
{
struct state1
{
char c;
template< typename Input >
state1( const Input& /*unused*/, std::string& /*unused*/ )
: c()
{
}
template< typename Input >
void success( const Input& /*unused*/, std::string& s ) const
{
s += c;
}
};
struct fobble : sor< state< state1, alpha >, digit >
{
};
struct fibble : until< eof, fobble >
{
};
template< typename Rule >
struct action1 : nothing< Rule >
{
};
template<>
struct action1< alpha >
{
template< typename Input >
static void apply( const Input& in, state1& s )
{
assert( in.size() == 1 );
s.c = in.begin()[ 0 ];
}
};
void state_test()
{
std::string result;
memory_input<> in( "dk41sk41xk3", __FUNCTION__ );
parse< fibble, action1 >( in, result );
TAO_PEGTL_TEST_ASSERT( result == "dkskxk" );
}
template< typename Rule >
struct action0 : nothing< Rule >
{
};
static int i0 = 0;
template<>
struct action0< alpha >
{
static void apply0()
{
++i0;
}
};
template<>
struct action0< digit >
{
static void apply0( std::string& s )
{
s += '0';
}
};
void apply0_test()
{
memory_input<> ina( "abcdefgh", __FUNCTION__ );
parse< star< alpha >, action0 >( ina );
TAO_PEGTL_TEST_ASSERT( i0 == 8 );
std::string s0;
memory_input<> ind( "12345678", __FUNCTION__ );
parse< star< digit >, action0 >( ind, s0 );
TAO_PEGTL_TEST_ASSERT( s0 == "00000000" );
}
const std::size_t count_byte = 12345;
const std::size_t count_line = 42;
const std::size_t count_byte_in_line = 12;
const char* count_source = "count_source";
template< typename Rule >
struct count_action
{
template< typename Input >
static void apply( const Input& in )
{
TAO_PEGTL_TEST_ASSERT( in.iterator().byte == count_byte );
TAO_PEGTL_TEST_ASSERT( in.iterator().line == count_line );
TAO_PEGTL_TEST_ASSERT( in.iterator().byte_in_line == count_byte_in_line );
TAO_PEGTL_TEST_ASSERT( in.input().source() == count_source );
TAO_PEGTL_TEST_ASSERT( in.size() == 1 );
TAO_PEGTL_TEST_ASSERT( in.begin() + 1 == in.end() );
TAO_PEGTL_TEST_ASSERT( in.peek_char() == 'f' );
TAO_PEGTL_TEST_ASSERT( in.peek_byte() == static_cast< unsigned char >( 'f' ) );
}
};
void count_test()
{
const char* foo = "f";
memory_input<> in( foo, foo + 1, count_source, count_byte, count_line, count_byte_in_line );
const auto result = parse< must< alpha >, count_action >( in );
TAO_PEGTL_TEST_ASSERT( result );
}
} // namespace test1
void unit_test()
{
test1::state_test();
test1::apply0_test();
test1::count_test();
}
} // namespace TAO_PEGTL_NAMESPACE
} // namespace tao
#include "main.hpp"