2005-01-13 17:06:21 +00:00
/*
*
* Copyright (c) 2004
2005-01-21 17:28:42 +00:00
* John Maddock
2005-01-13 17:06:21 +00:00
*
* Use, modification and distribution are subject to the
* Boost Software License, Version 1.0. (See accompanying file
* LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
*
*/
/*
* LOCATION: see http://www.boost.org for most recent version.
* FILE test_deprecated.cpp
* VERSION see <boost/version.hpp>
* DESCRIPTION: Tests for deprecated interfaces.
*/
#include "test.hpp"
#include <boost/cregex.hpp>
#ifdef BOOST_MSVC
#pragma warning(disable:4267)
#endif
2005-12-11 17:34:32 +00:00
#ifdef BOOST_NO_STDC_NAMESPACE
namespace std {
using :: atoi ;
using :: wcstol ;
}
#endif
2005-01-13 17:06:21 +00:00
int get_posix_compile_options ( boost :: regex_constants :: syntax_option_type opts )
{
using namespace boost ;
int result = 0 ;
switch ( opts & regbase :: main_option_type )
{
case regbase :: perl :
result = ( opts & regbase :: no_perl_ex ) ? REG_EXTENDED : REG_PERL ;
if ( opts & ( regbase :: no_bk_refs | regbase :: no_mod_m | regbase :: mod_x | regbase :: mod_s | regbase :: no_mod_s | regbase :: no_escape_in_lists ))
return - 1 ;
break ;
case regbase :: basic :
result = REG_BASIC ;
if ( opts & ( regbase :: no_char_classes | regbase :: no_intervals | regbase :: bk_plus_qm | regbase :: bk_vbar ))
return - 1 ;
if (( opts & regbase :: no_escape_in_lists ) == 0 )
return - 1 ;
break ;
default :
return - 1 ;
}
if ( opts & regbase :: icase )
result |= REG_ICASE ;
if ( opts & regbase :: nosubs )
result |= REG_NOSUB ;
if ( opts & regbase :: newline_alt )
result |= REG_NEWLINE ;
if (( opts & regbase :: collate ) == 0 )
result |= REG_NOCOLLATE ;
return result ;
}
int get_posix_match_flags ( boost :: regex_constants :: match_flag_type f )
{
int result = 0 ;
if ( f & boost :: regex_constants :: match_not_bol )
result |= boost :: REG_NOTBOL ;
if ( f & boost :: regex_constants :: match_not_eol )
result |= boost :: REG_NOTEOL ;
if ( f & ~ ( boost :: regex_constants :: match_not_bol | boost :: regex_constants :: match_not_eol ))
return - 1 ;
return result ;
}
void test_deprecated ( const char & , const test_regex_search_tag & )
{
const std :: string & expression = test_info < char >:: expression ();
if ( expression . find ( '\0' ) != std :: string :: npos )
return ;
const std :: string & search_text = test_info < char >:: search_text ();
if ( search_text . find ( '\0' ) != std :: string :: npos )
return ;
int posix_options = get_posix_compile_options ( test_info < char >:: syntax_options ());
if ( posix_options < 0 )
return ;
int posix_match_options = get_posix_match_flags ( test_info < char >:: match_options ());
if ( posix_match_options < 0 )
return ;
const int * results = test_info < char >:: answer_table ();
// OK try and compile the expression:
boost :: regex_tA re ;
if ( boost :: regcompA ( & re , expression . c_str (), posix_options ) != 0 )
{
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" did not compile with the POSIX C API." , char );
return ;
}
// try and find the first occurance:
2005-12-11 17:34:32 +00:00
static const unsigned max_subs = 100 ;
boost :: regmatch_t matches [ max_subs ];
if ( boost :: regexecA ( & re , search_text . c_str (), max_subs , matches , posix_match_options ) == 0 )
2005-01-13 17:06:21 +00:00
{
int i = 0 ;
while ( results [ 2 * i ] != - 2 )
{
2005-12-11 17:34:32 +00:00
if ( max_subs > i )
2005-01-13 17:06:21 +00:00
{
2005-12-11 17:34:32 +00:00
if ( results [ 2 * i ] != matches [ i ]. rm_so )
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in start of subexpression " << i << " found with the POSIX C API." , char );
}
if ( results [ 2 * i + 1 ] != matches [ i ]. rm_eo )
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in end of subexpression " << i << " found with the POSIX C API." , char );
}
2005-01-13 17:06:21 +00:00
}
++ i ;
}
}
else
{
if ( results [ 0 ] >= 0 )
{
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" was not found with the POSIX C API." , char );
}
}
// clean up whatever:
boost :: regfreeA ( & re );
//
// now try the RegEx class:
//
if ( test_info < char >:: syntax_options () & ~ boost :: regex :: icase )
return ;
try {
boost :: RegEx e ( expression , test_info < char >:: syntax_options () & boost :: regex :: icase );
if ( e . error_code ())
{
BOOST_REGEX_TEST_ERROR ( "Expression did not compile when it should have done, error code = " << e . error_code (), char );
}
if ( e . Search ( search_text , test_info < char >:: match_options ()))
{
int i = 0 ;
while ( results [ i * 2 ] != - 2 )
{
if ( e . Matched ( i ))
{
if ( results [ 2 * i ] != static_cast < int > ( e . Position ( i )))
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in start of subexpression " << i << " found with the RegEx class (found " << e . Position ( i ) << " expected " << results [ 2 * i ] << ")." , char );
}
if ( results [ 2 * i + 1 ] != static_cast < int > ( e . Position ( i ) + e . Length ( i )))
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in end of subexpression " << i << " found with the RegEx class (found " << e . Position ( i ) + e . Length ( i ) << " expected " << results [ 2 * i + 1 ] << ")." , char );
}
}
else
{
if ( results [ 2 * i ] >= 0 )
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in start of subexpression " << i << " found with the RegEx class (found " << e . Position ( i ) << " expected " << results [ 2 * i ] << ")." , char );
}
if ( results [ 2 * i + 1 ] >= 0 )
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in end of subexpression " << i << " found with the RegEx class (found " << e . Position ( i ) + e . Length ( i ) << " expected " << results [ 2 * i + 1 ] << ")." , char );
}
}
++ i ;
}
}
else
{
if ( results [ 0 ] >= 0 )
{
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" was not found with class RegEx." , char );
}
}
}
catch ( const boost :: bad_expression & r )
{
BOOST_REGEX_TEST_ERROR ( "Expression did not compile with RegEx class: " << r . what (), char );
}
catch ( const std :: runtime_error & r )
{
BOOST_REGEX_TEST_ERROR ( "Unexpected std::runtime_error : " << r . what (), char );
}
catch ( const std :: exception & r )
{
BOOST_REGEX_TEST_ERROR ( "Unexpected std::exception: " << r . what (), char );
}
catch (...)
{
BOOST_REGEX_TEST_ERROR ( "Unexpected exception of unknown type" , char );
}
}
void test_deprecated ( const wchar_t & , const test_regex_search_tag & )
{
#ifndef BOOST_NO_WREGEX
const std :: wstring & expression = test_info < wchar_t >:: expression ();
if ( expression . find ( L '\0' ) != std :: wstring :: npos )
return ;
const std :: wstring & search_text = test_info < wchar_t >:: search_text ();
if ( search_text . find ( L '\0' ) != std :: wstring :: npos )
return ;
int posix_options = get_posix_compile_options ( test_info < wchar_t >:: syntax_options ());
if ( posix_options < 0 )
return ;
int posix_match_options = get_posix_match_flags ( test_info < wchar_t >:: match_options ());
if ( posix_match_options < 0 )
return ;
const int * results = test_info < wchar_t >:: answer_table ();
// OK try and compile the expression:
boost :: regex_tW re ;
if ( boost :: regcompW ( & re , expression . c_str (), posix_options ) != 0 )
{
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" did not compile with the POSIX C API." , wchar_t );
return ;
}
// try and find the first occurance:
2005-12-11 17:34:32 +00:00
static const unsigned max_subs = 100 ;
boost :: regmatch_t matches [ max_subs ];
if ( boost :: regexecW ( & re , search_text . c_str (), max_subs , matches , posix_match_options ) == 0 )
2005-01-13 17:06:21 +00:00
{
int i = 0 ;
while ( results [ 2 * i ] != - 2 )
{
2005-12-11 17:34:32 +00:00
if ( max_subs > i )
2005-01-13 17:06:21 +00:00
{
2005-12-11 17:34:32 +00:00
if ( results [ 2 * i ] != matches [ i ]. rm_so )
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in start of subexpression " << i << " found with the POSIX C API." , wchar_t );
}
if ( results [ 2 * i + 1 ] != matches [ i ]. rm_eo )
{
BOOST_REGEX_TEST_ERROR ( "Mismatch in end of subexpression " << i << " found with the POSIX C API." , wchar_t );
}
2005-01-13 17:06:21 +00:00
}
++ i ;
}
}
else
{
if ( results [ 0 ] >= 0 )
{
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" was not found with the POSIX C API." , wchar_t );
}
}
// clean up whatever:
boost :: regfreeW ( & re );
#endif
}
void test_deprecated ( const char & , const test_invalid_regex_tag & )
{
const std :: string & expression = test_info < char >:: expression ();
if ( expression . find ( '\0' ) != std :: string :: npos )
return ;
int posix_options = get_posix_compile_options ( test_info < char >:: syntax_options ());
if ( posix_options < 0 )
return ;
// OK try and compile the expression:
boost :: regex_tA re ;
2005-12-11 17:34:32 +00:00
int code = boost :: regcompA ( & re , expression . c_str (), posix_options );
if ( code == 0 )
2005-01-13 17:06:21 +00:00
{
boost :: regfreeA ( & re );
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" unexpectedly compiled with the POSIX C API." , char );
}
2005-12-11 17:34:32 +00:00
else
{
char buf [ 100 ];
int s = boost :: regerrorA ( code , & re , 0 , 0 );
if ( s < 100 )
s = boost :: regerrorA ( code , & re , buf , 100 );
s = boost :: regerrorA ( code | boost :: REG_ITOA , & re , 0 , 0 );
if ( s < 100 )
{
s = boost :: regerrorA ( code | boost :: REG_ITOA , & re , buf , 100 );
re . re_endp = buf ;
s = boost :: regerrorA ( code | boost :: REG_ATOI , & re , buf , 100 );
if ( s )
{
int code2 = std :: atoi ( buf );
if ( code2 != code )
{
BOOST_REGEX_TEST_ERROR ( "Got a bad error code from regerrA with REG_ATOI set: " , char );
}
}
}
}
2005-01-13 17:06:21 +00:00
//
// now try the RegEx class:
//
if ( test_info < char >:: syntax_options () & ~ boost :: regex :: icase )
return ;
bool have_catch = false ;
try {
boost :: RegEx e ( expression , test_info < char >:: syntax_options () & boost :: regex :: icase );
if ( e . error_code ())
have_catch = true ;
}
catch ( const boost :: bad_expression & )
{
have_catch = true ;
}
catch ( const std :: runtime_error & r )
{
have_catch = true ;
BOOST_REGEX_TEST_ERROR ( "Expected a bad_expression exception, but a std::runtime_error instead: " << r . what (), char );
}
catch ( const std :: exception & r )
{
have_catch = true ;
BOOST_REGEX_TEST_ERROR ( "Expected a bad_expression exception, but a std::exception instead: " << r . what (), char );
}
catch (...)
{
have_catch = true ;
BOOST_REGEX_TEST_ERROR ( "Expected a bad_expression exception, but got an exception of unknown type instead" , char );
}
if ( ! have_catch )
{
// oops expected exception was not thrown:
BOOST_REGEX_TEST_ERROR ( "Expected an exception, but didn't find one." , char );
}
}
void test_deprecated ( const wchar_t & , const test_invalid_regex_tag & )
{
#ifndef BOOST_NO_WREGEX
const std :: wstring & expression = test_info < wchar_t >:: expression ();
if ( expression . find ( L '\0' ) != std :: string :: npos )
return ;
int posix_options = get_posix_compile_options ( test_info < wchar_t >:: syntax_options ());
if ( posix_options < 0 )
return ;
// OK try and compile the expression:
boost :: regex_tW re ;
2005-12-11 17:34:32 +00:00
int code = boost :: regcompW ( & re , expression . c_str (), posix_options );
if ( code == 0 )
2005-01-13 17:06:21 +00:00
{
boost :: regfreeW ( & re );
BOOST_REGEX_TEST_ERROR ( "Expression : \" " << expression . c_str () << " \" unexpectedly compiled with the POSIX C API." , wchar_t );
}
2005-12-11 17:34:32 +00:00
else
{
wchar_t buf [ 100 ];
int s = boost :: regerrorW ( code , & re , 0 , 0 );
if ( s < 100 )
s = boost :: regerrorW ( code , & re , buf , 100 );
s = boost :: regerrorW ( code | boost :: REG_ITOA , & re , 0 , 0 );
if ( s < 100 )
{
s = boost :: regerrorW ( code | boost :: REG_ITOA , & re , buf , 100 );
re . re_endp = buf ;
s = boost :: regerrorW ( code | boost :: REG_ATOI , & re , buf , 100 );
if ( s )
{
long code2 = std :: wcstol ( buf , 0 , 10 );
if ( code2 != code )
{
BOOST_REGEX_TEST_ERROR ( "Got a bad error code from regerrW with REG_ATOI set: " , char );
}
}
}
}
2005-01-13 17:06:21 +00:00
#endif
}