|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r67494 - in trunk/libs/spirit/test: . karma lex qi support
From: admin_at_[hidden]
Date: 2010-12-29 16:17:11
Author: wash
Date: 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
New Revision: 67494
URL: http://svn.boost.org/trac/boost/changeset/67494
Log:
Reorganized Spirit tests, broke down larger tests so they won't time out on
ICC.
Added:
trunk/libs/spirit/test/karma/alternative1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/alternative.cpp
trunk/libs/spirit/test/karma/alternative2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/auto.hpp (contents, props changed)
trunk/libs/spirit/test/karma/auto1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/auto.cpp
trunk/libs/spirit/test/karma/auto2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/auto3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/binary1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/binary.cpp
trunk/libs/spirit/test/karma/binary2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/binary3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/case_handling1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/case_handling.cpp
trunk/libs/spirit/test/karma/case_handling2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/case_handling3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/char1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/char.cpp
trunk/libs/spirit/test/karma/char2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/int_numerics1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/int_numerics.cpp
trunk/libs/spirit/test/karma/int_numerics2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/int_numerics3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/pattern1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/pattern.cpp
trunk/libs/spirit/test/karma/pattern2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/pattern3.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/karma/pattern2.cpp
trunk/libs/spirit/test/karma/pattern4.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/karma/pattern3.cpp
trunk/libs/spirit/test/karma/real_numerics.hpp (contents, props changed)
trunk/libs/spirit/test/karma/real_numerics1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/real_numerics.cpp
trunk/libs/spirit/test/karma/real_numerics2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/real_numerics3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/regression_optional_double.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/karma/karma_optional_double.cpp
trunk/libs/spirit/test/karma/regression_real_scientific.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/karma/real_scientific.cpp
trunk/libs/spirit/test/karma/regression_semantic_action_attribute.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/karma/semantic_action_attribute.cpp
trunk/libs/spirit/test/karma/repeat1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/repeat.cpp
trunk/libs/spirit/test/karma/repeat2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/sequence1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/sequence.cpp
trunk/libs/spirit/test/karma/sequence2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/symbols1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/symbols.cpp
trunk/libs/spirit/test/karma/symbols2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/symbols3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/utree1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/karma/utree.cpp
trunk/libs/spirit/test/karma/utree2.cpp (contents, props changed)
trunk/libs/spirit/test/karma/utree3.cpp (contents, props changed)
trunk/libs/spirit/test/karma/wstream.cpp (contents, props changed)
trunk/libs/spirit/test/lex/regression_basic_lexer.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression001.cpp
trunk/libs/spirit/test/lex/regression_file_iterator1.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression007.cpp
trunk/libs/spirit/test/lex/regression_file_iterator2.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression008.cpp
trunk/libs/spirit/test/lex/regression_file_iterator3.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression009.cpp
trunk/libs/spirit/test/lex/regression_file_iterator4.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression010.cpp
trunk/libs/spirit/test/lex/regression_matlib_dynamic.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression002.cpp
trunk/libs/spirit/test/lex/regression_matlib_generate.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression003_generate.cpp
trunk/libs/spirit/test/lex/regression_matlib_generate_switch.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression003_generate_switch.cpp
trunk/libs/spirit/test/lex/regression_matlib_static.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression003.cpp
trunk/libs/spirit/test/lex/regression_matlib_switch.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression003_switch.cpp
trunk/libs/spirit/test/lex/regression_syntax_error.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression005.cpp
trunk/libs/spirit/test/lex/regression_wide.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression006.cpp
trunk/libs/spirit/test/lex/regression_word_count.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/regression004.cpp
trunk/libs/spirit/test/lex/state_switcher.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/lex/state_switcher_test.cpp
trunk/libs/spirit/test/qi/attribute1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/qi/attribute.cpp
trunk/libs/spirit/test/qi/attribute2.cpp (contents, props changed)
trunk/libs/spirit/test/qi/match_manip.hpp (contents, props changed)
trunk/libs/spirit/test/qi/match_manip1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/qi/match_manip.cpp
trunk/libs/spirit/test/qi/match_manip2.cpp (contents, props changed)
trunk/libs/spirit/test/qi/match_manip3.cpp (contents, props changed)
trunk/libs/spirit/test/qi/real.hpp (contents, props changed)
trunk/libs/spirit/test/qi/real1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/qi/real.cpp
trunk/libs/spirit/test/qi/real2.cpp (contents, props changed)
trunk/libs/spirit/test/qi/real3.cpp (contents, props changed)
trunk/libs/spirit/test/qi/real4.cpp (contents, props changed)
trunk/libs/spirit/test/qi/regression_attr_with_action.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/attr_with_action.cpp
trunk/libs/spirit/test/qi/regression_clear.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/clear_test.cpp
trunk/libs/spirit/test/qi/regression_debug_optional.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/debug_optional.cpp
trunk/libs/spirit/test/qi/regression_one_element_fusion_sequence.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/one_element_fusion_sequence.cpp
trunk/libs/spirit/test/qi/regression_one_element_sequence_attribute.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/single_element_sequence_attribute.cpp
trunk/libs/spirit/test/qi/regression_reorder.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/reorder_test.cpp
trunk/libs/spirit/test/qi/regression_repeat.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/qi/repeat_regression.cpp
trunk/libs/spirit/test/qi/rule1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/qi/rule.cpp
trunk/libs/spirit/test/qi/rule2.cpp (contents, props changed)
trunk/libs/spirit/test/qi/rule3.cpp (contents, props changed)
trunk/libs/spirit/test/qi/rule4.cpp (contents, props changed)
trunk/libs/spirit/test/qi/symbols1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/qi/symbols.cpp
trunk/libs/spirit/test/qi/symbols2.cpp (contents, props changed)
trunk/libs/spirit/test/qi/utree1.cpp
- copied, changed from r67483, /trunk/libs/spirit/test/qi/utree.cpp
trunk/libs/spirit/test/qi/utree2.cpp (contents, props changed)
trunk/libs/spirit/test/qi/utree3.cpp (contents, props changed)
trunk/libs/spirit/test/qi/utree4.cpp (contents, props changed)
trunk/libs/spirit/test/support/regression_multi_pass_functor.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/support/multi_pass_regression002.cpp
trunk/libs/spirit/test/support/regression_multi_pass_parse.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/support/multi_pass_regression003.cpp
trunk/libs/spirit/test/support/regression_multi_pass_position_iterator.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/support/multi_pass_regression001.cpp
trunk/libs/spirit/test/support/utree.cpp
- copied unchanged from r67483, /trunk/libs/spirit/test/support/utree_test.cpp
Removed:
trunk/libs/spirit/test/karma/alternative.cpp
trunk/libs/spirit/test/karma/auto.cpp
trunk/libs/spirit/test/karma/binary.cpp
trunk/libs/spirit/test/karma/case_handling.cpp
trunk/libs/spirit/test/karma/char.cpp
trunk/libs/spirit/test/karma/int_numerics.cpp
trunk/libs/spirit/test/karma/karma_optional_double.cpp
trunk/libs/spirit/test/karma/pattern.cpp
trunk/libs/spirit/test/karma/real_numerics.cpp
trunk/libs/spirit/test/karma/real_scientific.cpp
trunk/libs/spirit/test/karma/repeat.cpp
trunk/libs/spirit/test/karma/semantic_action_attribute.cpp
trunk/libs/spirit/test/karma/sequence.cpp
trunk/libs/spirit/test/karma/symbols.cpp
trunk/libs/spirit/test/karma/utree.cpp
trunk/libs/spirit/test/lex/regression001.cpp
trunk/libs/spirit/test/lex/regression002.cpp
trunk/libs/spirit/test/lex/regression003.cpp
trunk/libs/spirit/test/lex/regression003_generate.cpp
trunk/libs/spirit/test/lex/regression003_generate_switch.cpp
trunk/libs/spirit/test/lex/regression003_switch.cpp
trunk/libs/spirit/test/lex/regression004.cpp
trunk/libs/spirit/test/lex/regression005.cpp
trunk/libs/spirit/test/lex/regression006.cpp
trunk/libs/spirit/test/lex/regression007.cpp
trunk/libs/spirit/test/lex/regression008.cpp
trunk/libs/spirit/test/lex/regression009.cpp
trunk/libs/spirit/test/lex/regression010.cpp
trunk/libs/spirit/test/lex/state_switcher_test.cpp
trunk/libs/spirit/test/qi/attr_with_action.cpp
trunk/libs/spirit/test/qi/attribute.cpp
trunk/libs/spirit/test/qi/clear_test.cpp
trunk/libs/spirit/test/qi/debug_optional.cpp
trunk/libs/spirit/test/qi/match_manip.cpp
trunk/libs/spirit/test/qi/one_element_fusion_sequence.cpp
trunk/libs/spirit/test/qi/real.cpp
trunk/libs/spirit/test/qi/reorder_test.cpp
trunk/libs/spirit/test/qi/repeat_regression.cpp
trunk/libs/spirit/test/qi/rule.cpp
trunk/libs/spirit/test/qi/single_element_sequence_attribute.cpp
trunk/libs/spirit/test/qi/symbols.cpp
trunk/libs/spirit/test/qi/utree.cpp
trunk/libs/spirit/test/support/multi_pass_regression001.cpp
trunk/libs/spirit/test/support/multi_pass_regression002.cpp
trunk/libs/spirit/test/support/multi_pass_regression003.cpp
trunk/libs/spirit/test/support/utree_test.cpp
Text files modified:
trunk/libs/spirit/test/Jamfile | 340 +++++++++++++++++++---------------
trunk/libs/spirit/test/karma/alternative1.cpp | 108 ----------
trunk/libs/spirit/test/karma/auto1.cpp | 232 -----------------------
trunk/libs/spirit/test/karma/binary1.cpp | 179 ------------------
trunk/libs/spirit/test/karma/case_handling1.cpp | 186 ------------------
trunk/libs/spirit/test/karma/char1.cpp | 128 -------------
trunk/libs/spirit/test/karma/int_numerics1.cpp | 223 ----------------------
trunk/libs/spirit/test/karma/pattern1.cpp | 102 ----------
trunk/libs/spirit/test/karma/real_numerics1.cpp | 393 ---------------------------------------
trunk/libs/spirit/test/karma/repeat1.cpp | 135 ++-----------
trunk/libs/spirit/test/karma/sequence1.cpp | 344 ++++++++++------------------------
trunk/libs/spirit/test/karma/stream.cpp | 42 ---
trunk/libs/spirit/test/karma/symbols1.cpp | 204 --------------------
trunk/libs/spirit/test/karma/utree1.cpp | 207 ---------------------
trunk/libs/spirit/test/qi/attribute1.cpp | 92 ---------
trunk/libs/spirit/test/qi/match_manip1.cpp | 214 ---------------------
trunk/libs/spirit/test/qi/real1.cpp | 317 --------------------------------
trunk/libs/spirit/test/qi/rule1.cpp | 325 ---------------------------------
trunk/libs/spirit/test/qi/symbols1.cpp | 163 ----------------
trunk/libs/spirit/test/qi/utree1.cpp | 261 --------------------------
20 files changed, 327 insertions(+), 3868 deletions(-)
Modified: trunk/libs/spirit/test/Jamfile
==============================================================================
--- trunk/libs/spirit/test/Jamfile (original)
+++ trunk/libs/spirit/test/Jamfile 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -1,6 +1,7 @@
#==============================================================================
-# Copyright (c) 2001-2010 Joel de Guzman
-# Copyright (c) 2001-2010 Hartmut Kaiser
+# Copyright (c) 2001-2011 Joel de Guzman
+# Copyright (c) 2001-2011 Hartmut Kaiser
+# Copyright (c) 2011 Bryce Lelbach
#
# Use, modification and distribution is subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@@ -11,8 +12,6 @@
<include>.
<toolset>gcc:<cxxflags>-ftemplate-depth-300
<toolset>darwin:<cxxflags>-ftemplate-depth-300
-# <toolset>gcc:<linkflags>-Wl,--enable-auto-import
-# <toolset>darwin:<linkflags>-Wl,--enable-auto-import
:
:
;
@@ -23,177 +22,220 @@
import testing ;
{
+ ###########################################################################
test-suite spirit_v2/qi :
- # run Qi tests
- [ run qi/actions.cpp : : : : ]
- [ run qi/alternative.cpp : : : : ]
- [ run qi/attr.cpp : : : : ]
- [ run qi/attribute.cpp : : : : ]
- [ run qi/and_predicate.cpp : : : : ]
- [ run qi/auto.cpp : : : : ]
- [ run qi/binary.cpp : : : : ]
- [ run qi/bool.cpp : : : : ]
- [ run qi/char.cpp : : : : ]
- [ run qi/char_class.cpp : : : : ]
- [ run qi/debug.cpp : : : : ]
- [ run qi/difference.cpp : : : : ]
- [ run qi/encoding.cpp : : : : ]
- [ run qi/end.cpp : : : : ]
- [ run qi/eps.cpp : : : : ]
- [ run qi/expect.cpp : : : : ]
- [ run qi/grammar.cpp : : : : ]
- [ run qi/int.cpp : : : : ]
- [ run qi/kleene.cpp : : : : ]
- [ run qi/lazy.cpp : : : : ]
- [ run qi/lexeme.cpp : : : : ]
- [ run qi/lit.cpp : : : : ]
- [ run qi/list.cpp : : : : ]
- [ run qi/hold.cpp : : : : ]
- [ run qi/match_manip.cpp : : : : ]
- [ run qi/match_manip_attr.cpp : : : : ]
- [ run qi/matches.cpp : : : : ]
- [ run qi/no_case.cpp : : : : ]
- [ run qi/no_skip.cpp : : : : ]
- [ run qi/not_predicate.cpp : : : : ]
- [ run qi/optional.cpp : : : : ]
- [ run qi/parse_attr.cpp : : : : ]
- [ run qi/permutation.cpp : : : : ]
- [ run qi/plus.cpp : : : : ]
- [ run qi/range_run.cpp : : : : ]
- [ run qi/raw.cpp : : : : ]
- [ run qi/real.cpp : : : : ]
- [ run qi/repeat.cpp : : : : ]
- [ run qi/rule.cpp : : : : ]
- [ run qi/sequence.cpp : : : : ]
- [ run qi/sequential_or.cpp : : : : ]
- [ run qi/skip.cpp : : : : ]
- [ run qi/symbols.cpp : : : : ]
- [ run qi/terminal_ex.cpp : : : : ]
- [ run qi/tst.cpp : : : : ]
- [ run qi/uint.cpp : : : : ]
- [ run qi/utree.cpp : : : : ]
+ [ run qi/actions.cpp : : : : qi_actions ]
+ [ run qi/alternative.cpp : : : : qi_alternative ]
+ [ run qi/attr.cpp : : : : qi_attr ]
+ [ run qi/attribute1.cpp : : : : qi_attribute1 ]
+ [ run qi/attribute2.cpp : : : : qi_attribute2 ]
+ [ run qi/and_predicate.cpp : : : : qi_and_predicate ]
+ [ run qi/auto.cpp : : : : qi_auto ]
+ [ run qi/binary.cpp : : : : qi_binary ]
+ [ run qi/bool.cpp : : : : qi_bool ]
+ [ run qi/char.cpp : : : : qi_char ]
+ [ run qi/char_class.cpp : : : : qi_char_class ]
+ [ run qi/debug.cpp : : : : qi_debug ]
+ [ run qi/difference.cpp : : : : qi_difference ]
+ [ run qi/encoding.cpp : : : : qi_encoding ]
+ [ run qi/end.cpp : : : : qi_end ]
+ [ run qi/eps.cpp : : : : qi_eps ]
+ [ run qi/expect.cpp : : : : qi_expect ]
+ [ run qi/grammar.cpp : : : : qi_grammar ]
+ [ run qi/int.cpp : : : : qi_int ]
+ [ run qi/kleene.cpp : : : : qi_kleene ]
+ [ run qi/lazy.cpp : : : : qi_lazy ]
+ [ run qi/lexeme.cpp : : : : qi_lexeme ]
+ [ run qi/lit.cpp : : : : qi_lit ]
+ [ run qi/list.cpp : : : : qi_list ]
+ [ run qi/hold.cpp : : : : qi_hold ]
+ [ run qi/match_manip1.cpp : : : : qi_match_manip1 ]
+ [ run qi/match_manip2.cpp : : : : qi_match_manip2 ]
+ [ run qi/match_manip3.cpp : : : : qi_match_manip3 ]
+ [ run qi/match_manip_attr.cpp : : : : qi_match_manip_attr ]
+ [ run qi/matches.cpp : : : : qi_matches ]
+ [ run qi/no_case.cpp : : : : qi_no_case ]
+ [ run qi/no_skip.cpp : : : : qi_no_skip ]
+ [ run qi/not_predicate.cpp : : : : qi_not_predicate ]
+ [ run qi/optional.cpp : : : : qi_optional ]
+ [ run qi/parse_attr.cpp : : : : qi_parse_attr ]
+ [ run qi/permutation.cpp : : : : qi_permutation ]
+ [ run qi/plus.cpp : : : : qi_plus ]
+ [ run qi/range_run.cpp : : : : qi_range_run ]
+ [ run qi/raw.cpp : : : : qi_raw ]
+ [ run qi/real1.cpp : : : : qi_real1 ]
+ [ run qi/real2.cpp : : : : qi_real2 ]
+ [ run qi/real3.cpp : : : : qi_real3 ]
+ [ run qi/real4.cpp : : : : qi_real4 ]
+ [ run qi/repeat.cpp : : : : qi_repeat ]
+ [ run qi/rule1.cpp : : : : qi_rule1 ]
+ [ run qi/rule2.cpp : : : : qi_rule2 ]
+ [ run qi/rule3.cpp : : : : qi_rule3 ]
+ [ run qi/rule4.cpp : : : : qi_rule4 ]
+ [ run qi/sequence.cpp : : : : qi_sequence ]
+ [ run qi/sequential_or.cpp : : : : qi_sequential_or ]
+ [ run qi/skip.cpp : : : : qi_skip ]
+ [ run qi/symbols1.cpp : : : : qi_symbols1 ]
+ [ run qi/symbols2.cpp : : : : qi_symbols2 ]
+ [ run qi/terminal_ex.cpp : : : : qi_terminal_ex ]
+ [ run qi/tst.cpp : : : : qi_tst ]
+ [ run qi/uint.cpp : : : : qi_uint ]
+ [ run qi/utree1.cpp : : : : qi_utree1 ]
+ [ run qi/utree2.cpp : : : : qi_utree2 ]
+ [ run qi/utree3.cpp : : : : qi_utree3 ]
+ [ run qi/utree4.cpp : : : : qi_utree4 ]
;
+
+ ###########################################################################
+ test-suite spirit_v2/qi_regressions :
- test-suite spirit_v2/karma :
+ [ compile qi/regression_attr_with_action.cpp : : qi_regression_attr_with_action ]
+ [ run qi/regression_clear.cpp : : : : qi_regression_clear ]
+ [ compile qi/regression_debug_optional.cpp : : qi_regression_debug_optional ]
+ [ compile qi/regression_one_element_fusion_sequence.cpp : : qi_regression_one_element_fusion_sequence ]
+ [ compile qi/regression_one_element_sequence_attribute.cpp : : qi_regression_one_element_sequence_attribute ]
+ [ run qi/regression_reorder.cpp : : : : qi_regression_reorder ]
+ [ run qi/regression_repeat.cpp : : : : qi_regression_repeat ]
- # run Karma tests
- [ run karma/actions.cpp : : : : karma_actions ]
- [ run karma/and_predicate.cpp : : : : karma_and_predicate ]
- [ run karma/alternative.cpp : : : : karma_alternative ]
- [ run karma/attribute.cpp : : : : karma_attribute ]
- [ run karma/auto.cpp : : : : karma_auto ]
- [ run karma/binary.cpp : : : : karma_binary ]
- [ run karma/bool.cpp : : : : karma_bool ]
- [ run karma/buffer.cpp : : : : karma_buffer ]
- [ run karma/case_handling.cpp : : : : ]
- [ run karma/center_alignment.cpp : : : : ]
- [ run karma/char.cpp : : : : karma_char ]
- [ run karma/char_class.cpp : : : : karma_char_class ]
- [ run karma/columns.cpp : : : : ]
- [ run karma/debug.cpp : : : : karma_debug ]
- [ run karma/delimiter.cpp : : : : ]
- [ run karma/duplicate.cpp : : : : ]
- [ run karma/encoding.cpp : : : : karma_encoding ]
- [ run karma/eol.cpp : : : : karma_eol ]
- [ run karma/eps.cpp : : : : karma_eps ]
- [ run karma/format_manip.cpp : : : : ]
- [ run karma/format_manip_attr.cpp : : : : ]
- [ run karma/format_pointer_container.cpp : : : : ]
- [ run karma/generate_attr.cpp : : : : ]
- [ run karma/grammar.cpp : : : : karma_grammar ]
- [ run karma/int_numerics.cpp : : : : ]
- [ run karma/kleene.cpp : : : : karma_kleene ]
- [ run karma/lazy.cpp : : : : karma_lazy ]
- [ run karma/left_alignment.cpp : : : : ]
- [ run karma/list.cpp : : : : karma_list ]
- [ run karma/lit.cpp : : : : karma_lit ]
- [ run karma/maxwidth.cpp : : : : ]
- [ run karma/not_predicate.cpp : : : : karma_not_predicate ]
- [ run karma/omit.cpp : : : : karma_omit ]
- [ run karma/optional.cpp : : : : karma_optional ]
- [ run karma/pattern.cpp : : : : karma_pattern ]
- [ run karma/pattern2.cpp : : : : karma_pattern2 ]
- [ run karma/pattern3.cpp : : : : karma_pattern3 ]
- [ run karma/plus.cpp : : : : karma_plus ]
- [ run karma/real_numerics.cpp : : : : ]
- [ run karma/repeat.cpp : : : : karma_repeat ]
- [ run karma/right_alignment.cpp : : : : ]
- [ run karma/sequence.cpp : : : : karma_sequence ]
- [ run karma/stream.cpp : : : : karma_stream ]
- [ run karma/symbols.cpp : : : : karma_symbols ]
- [ run karma/tricky_alignment.cpp : : : : ]
- [ run karma/utree.cpp : : : : karma_utree ]
+ ;
- [ compile-fail karma/grammar_fail.cpp : : karma_grammar_fail ]
- [ compile-fail karma/rule_fail.cpp : : karma_rule_fail ]
+ ###########################################################################
+ test-suite spirit_v2/karma :
+
+ [ compile-fail karma/grammar_fail.cpp : : karma_grammar_fail ]
+ [ compile-fail karma/rule_fail.cpp : : karma_rule_fail ]
+ [ run karma/actions.cpp : : : : karma_actions ]
+ [ run karma/alternative1.cpp : : : : karma_alternative1 ]
+ [ run karma/alternative2.cpp : : : : karma_alternative2 ]
+ [ run karma/and_predicate.cpp : : : : karma_and_predicate ]
+ [ run karma/attribute.cpp : : : : karma_attribute ]
+ [ run karma/auto1.cpp : : : : karma_auto1 ]
+ [ run karma/auto2.cpp : : : : karma_auto2 ]
+ [ run karma/auto3.cpp : : : : karma_auto3 ]
+ [ run karma/binary1.cpp : : : : karma_binary1 ]
+ [ run karma/binary2.cpp : : : : karma_binary2 ]
+ [ run karma/binary3.cpp : : : : karma_binary3 ]
+ [ run karma/bool.cpp : : : : karma_bool ]
+ [ run karma/buffer.cpp : : : : karma_buffer ]
+ [ run karma/case_handling1.cpp : : : : karma_case_handling1 ]
+ [ run karma/case_handling2.cpp : : : : karma_case_handling2 ]
+ [ run karma/case_handling3.cpp : : : : karma_case_handling3 ]
+ [ run karma/center_alignment.cpp : : : : karma_center_alignment ]
+ [ run karma/char1.cpp : : : : karma_char1 ]
+ [ run karma/char2.cpp : : : : karma_char2 ]
+ [ run karma/char_class.cpp : : : : karma_char_class ]
+ [ run karma/columns.cpp : : : : karma_columns ]
+ [ run karma/debug.cpp : : : : karma_debug ]
+ [ run karma/delimiter.cpp : : : : karma_delimiter ]
+ [ run karma/duplicate.cpp : : : : karma_duplicate ]
+ [ run karma/encoding.cpp : : : : karma_encoding ]
+ [ run karma/eol.cpp : : : : karma_eol ]
+ [ run karma/eps.cpp : : : : karma_eps ]
+ [ run karma/format_manip.cpp : : : : karma_format_manip ]
+ [ run karma/format_manip_attr.cpp : : : : karma_format_manip_attr ]
+ [ run karma/format_pointer_container.cpp : : : : karma_format_pointer_container ]
+ [ run karma/generate_attr.cpp : : : : karma_generate_attr ]
+ [ run karma/grammar.cpp : : : : karma_grammar ]
+ [ run karma/int_numerics1.cpp : : : : karma_int_numerics1 ]
+ [ run karma/int_numerics2.cpp : : : : karma_int_numerics2 ]
+ [ run karma/int_numerics3.cpp : : : : karma_int_numerics3 ]
+ [ run karma/kleene.cpp : : : : karma_kleene ]
+ [ run karma/lazy.cpp : : : : karma_lazy ]
+ [ run karma/left_alignment.cpp : : : : karma_left_alignment ]
+ [ run karma/list.cpp : : : : karma_list ]
+ [ run karma/lit.cpp : : : : karma_lit ]
+ [ run karma/maxwidth.cpp : : : : karma_maxwidth ]
+ [ run karma/not_predicate.cpp : : : : karma_not_predicate ]
+ [ run karma/omit.cpp : : : : karma_omit ]
+ [ run karma/optional.cpp : : : : karma_optional ]
+ [ run karma/pattern1.cpp : : : : karma_pattern1 ]
+ [ run karma/pattern2.cpp : : : : karma_pattern2 ]
+ [ run karma/pattern3.cpp : : : : karma_pattern3 ]
+ [ run karma/pattern4.cpp : : : : karma_pattern4 ]
+ [ run karma/plus.cpp : : : : karma_plus ]
+ [ run karma/real_numerics1.cpp : : : : karma_real_numerics1 ]
+ [ run karma/real_numerics2.cpp : : : : karma_real_numerics2 ]
+ [ run karma/real_numerics3.cpp : : : : karma_real_numerics3 ]
+ [ run karma/repeat1.cpp : : : : karma_repeat1 ]
+ [ run karma/repeat2.cpp : : : : karma_repeat2 ]
+ [ run karma/right_alignment.cpp : : : : karma_right_alignment ]
+ [ run karma/sequence1.cpp : : : : karma_sequence1 ]
+ [ run karma/sequence2.cpp : : : : karma_sequence2 ]
+ [ run karma/stream.cpp : : : : karma_stream ]
+ [ run karma/symbols1.cpp : : : : karma_symbols1 ]
+ [ run karma/symbols2.cpp : : : : karma_symbols2 ]
+ [ run karma/symbols3.cpp : : : : karma_symbols3 ]
+ [ run karma/tricky_alignment.cpp : : : : karma_tricky_alignment ]
+ [ run karma/utree1.cpp : : : : karma_utree1 ]
+ [ run karma/utree2.cpp : : : : karma_utree2 ]
+ [ run karma/utree3.cpp : : : : karma_utree3 ]
+ [ run karma/wstream.cpp : : : : karma_wstream ]
+
+ ;
+
+ ###########################################################################
+ test-suite spirit_v2/karma_regressions :
+
+ [ run karma/regression_optional_double.cpp : : : : karma_regression_optional_double ]
+ [ run karma/regression_semantic_action_attribute.cpp : : : : karma_regression_semantic_action_attribute ]
+ [ run karma/regression_real_scientific.cpp : : : : karma_regression_real_scientific ]
;
+ ###########################################################################
test-suite spirit_v2/lex :
- # run Lex tests
- [ run lex/lexertl1.cpp : : : : ]
- [ run lex/lexertl2.cpp : : : : ]
- [ run lex/lexertl3.cpp : : : : ]
- [ run lex/lexertl4.cpp : : : : ]
- [ run lex/lexertl5.cpp : : : : ]
- [ run lex/state_switcher_test.cpp : : : : ]
- [ run lex/lexer_state_switcher.cpp : : : : ]
- [ run lex/set_token_value.cpp : : : : ]
- [ run lex/dedent_handling_phoenix.cpp : : : : ]
- [ run lex/set_token_value_phoenix.cpp : : : : ]
- [ run lex/semantic_actions.cpp : : : : ]
- [ run lex/auto_switch_lexerstate.cpp : : : : ]
- [ run lex/id_type_enum.cpp : : : : ]
+ [ run lex/lexertl1.cpp : : : : lex_lexertl1 ]
+ [ run lex/lexertl2.cpp : : : : lex_lexertl2 ]
+ [ run lex/lexertl3.cpp : : : : lex_lexertl3 ]
+ [ run lex/lexertl4.cpp : : : : lex_lexertl4 ]
+ [ run lex/lexertl5.cpp : : : : lex_lexertl5 ]
+ [ run lex/state_switcher.cpp : : : : lex_state_switcher ]
+ [ run lex/lexer_state_switcher.cpp : : : : lex_lexer_state_switcher ]
+ [ run lex/set_token_value.cpp : : : : lex_set_token_value ]
+ [ run lex/dedent_handling_phoenix.cpp : : : : lex_dedent_handling_phoenix ]
+ [ run lex/set_token_value_phoenix.cpp : : : : lex_set_token_value_phoenix ]
+ [ run lex/semantic_actions.cpp : : : : lex_semantic_actions ]
+ [ run lex/auto_switch_lexerstate.cpp : : : : lex_auto_switch_lexerstate ]
+ [ run lex/id_type_enum.cpp : : : : lex_id_type_enum ]
;
+ ###########################################################################
test-suite spirit_v2/lex_regressions :
- # run Lex regression tests
- [ run lex/regression001.cpp : : : : lex_regression001 ]
- [ run lex/regression002.cpp : : : : lex_regression002 ]
- [ run lex/regression003_generate.cpp : $(LEX_DIR)/matlib_static.h : : : lex_regression003_generate ]
- [ run lex/regression003.cpp : : : <dependency>.//lex_regression003_generate : lex_regression003 ]
- [ run lex/regression003_generate_switch.cpp : $(LEX_DIR)/matlib_static_switch.h : : : lex_regression003_generate_switch ]
- [ run lex/regression003_switch.cpp : : : <dependency>.//lex_regression003_generate_switch : lex_regression003_switch ]
- [ run lex/regression004.cpp : : : : lex_regression004 ]
- [ run lex/regression005.cpp : : : : lex_regression005 ]
- [ run lex/regression006.cpp : : : : lex_regression006 ]
- [ run lex/regression007.cpp : : : : lex_regression007 ]
- [ run lex/regression008.cpp : : : : lex_regression008 ]
- [ run lex/regression009.cpp : : : : lex_regression009 ]
- [ run lex/regression010.cpp : : : : lex_regression010 ]
+ [ run lex/regression_basic_lexer.cpp : : : : lex_regression_basic_lexer ]
+ [ run lex/regression_matlib_dynamic.cpp : : : : lex_regression_matlib_dynamic ]
+ [ run lex/regression_matlib_generate.cpp : $(LEX_DIR)/matlib_static.h : : : lex_regression_matlib_generate ]
+ [ run lex/regression_matlib_static.cpp : : : <dependency>.//lex_regression_matlib_generate : lex_regression_matlib_static ]
+ [ run lex/regression_matlib_generate_switch.cpp : $(LEX_DIR)/matlib_static_switch.h : : : lex_regression_matlib_generate_switch ]
+ [ run lex/regression_matlib_switch.cpp : : : <dependency>.//lex_regression_matlib_generate_switch : lex_regression_matlib_switch ]
+ [ run lex/regression_word_count.cpp : : : : lex_regression_word_count ]
+ [ run lex/regression_syntax_error.cpp : : : : lex_regression_syntax_error ]
+ [ run lex/regression_wide.cpp : : : : lex_regression_wide ]
+ [ run lex/regression_file_iterator1.cpp : : : : lex_regression_file_iterator1 ]
+ [ run lex/regression_file_iterator2.cpp : : : : lex_regression_file_iterator2 ]
+ [ run lex/regression_file_iterator3.cpp : : : : lex_regression_file_iterator3 ]
+ [ run lex/regression_file_iterator4.cpp : : : : lex_regression_file_iterator4 ]
;
+ ###########################################################################
test-suite spirit_v2/support :
- # support tests
- [ compile support/multi_pass_regression001.cpp : : support_multi_pass_regression001 ]
- [ compile support/multi_pass_regression002.cpp : : support_multi_pass_regression002 ]
- [ compile support/multi_pass_regression003.cpp : : support_multi_pass_regression003 ]
- [ run support/utree_test.cpp : : : : support_utree_test ]
+ [ run support/utree.cpp : : : : support_utree ]
;
- test-suite spirit_v2/regressions :
-
- # regression tests
- [ compile qi/attr_with_action.cpp : : qi_attr_with_action ]
- [ run qi/clear_test.cpp : : : : ]
- [ run qi/reorder_test.cpp : : : : ]
- [ run karma/karma_optional_double.cpp : : : : ]
- [ run karma/semantic_action_attribute.cpp : : : : ]
- [ compile qi/single_element_sequence_attribute.cpp : : qi_single_element_sequence_attribute ]
- [ compile qi/debug_optional.cpp : : qi_debug_optional ]
- [ run karma/real_scientific.cpp : : : : ]
- [ run qi/repeat_regression.cpp : : : : ]
- [ compile qi/one_element_fusion_sequence.cpp : : qi_one_element_fusion_sequence ]
+ ###########################################################################
+ test-suite spirit_v2/support_regressions :
- ;
+ [ compile support/regression_multi_pass_position_iterator.cpp : : support_regression_multi_pass_position_iterator ]
+ [ compile support/regression_multi_pass_functor.cpp : : support_regression_multi_pass_functor ]
+ [ compile support/regression_multi_pass_parse.cpp : : support_regression_multi_pass_parse ]
+ ;
}
Deleted: trunk/libs/spirit/test/karma/alternative.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/alternative.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,262 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-// #define KARMA_TEST_COMPILE_FAIL
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/karma_auxiliary.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_auxiliary.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using namespace boost;
- using namespace boost::spirit;
- using namespace boost::spirit::ascii;
-
- {
- BOOST_TEST(test("x", char_('x') | char_('i')));
- BOOST_TEST(test("xi", char_('x') << char_('i') | char_('i')));
- BOOST_TEST(test("i", char_('i') | char_('x') << char_('i')));
-
- BOOST_TEST(test("x", buffer[char_('x')] | char_('i')));
-
- variant<int, char> v (10);
- BOOST_TEST(test("10", char_ | int_, v));
- BOOST_TEST(test("10", int_ | char_, v));
- BOOST_TEST(test("a", lit('a') | char_ | int_, v));
- BOOST_TEST(test("a", char_ | lit('a') | int_, v));
- BOOST_TEST(test("10", int_ | lit('a') | char_, v));
-
- v = 'c';
- BOOST_TEST(test("c", char_ | int_, v));
- BOOST_TEST(test("a", lit('a') | char_ | int_, v));
- BOOST_TEST(test("c", char_ | lit('a') | int_, v));
- BOOST_TEST(test("a", int_ | lit('a') | char_, v));
- BOOST_TEST(test("c", int_ | char_ | lit('a'), v));
- }
-
- // testing for alignment/truncation problems on little endian systems
- // (big endian systems will fail one of the other tests below)
- {
- // test optional attribute
- optional<variant<int, char> > v;
- BOOST_TEST(!test("", char_ | int_, v));
- BOOST_TEST(!test("", int_ | char_, v));
- BOOST_TEST(test("a", lit('a') | char_ | int_, v));
- BOOST_TEST(test("a", char_ | lit('a') | int_, v));
- BOOST_TEST(test("a", int_ | lit('a') | char_, v));
-
- v = 10;
- BOOST_TEST(test("10", char_ | int_, v));
- BOOST_TEST(test("10", int_ | char_, v));
- BOOST_TEST(test("a", lit('a') | char_ | int_, v));
- BOOST_TEST(test("a", char_ | lit('a') | int_, v));
- BOOST_TEST(test("10", int_ | lit('a') | char_, v));
-
- v = 'c';
- BOOST_TEST(test("c", char_ | int_, v));
- BOOST_TEST(test("a", lit('a') | char_ | int_, v));
- BOOST_TEST(test("c", char_ | lit('a') | int_, v));
- BOOST_TEST(test("a", int_ | lit('a') | char_, v));
- BOOST_TEST(test("c", int_ | char_ | lit('a'), v));
- }
-
- {
- // more tests for optional attribute
- optional<int> o;
- BOOST_TEST(test("a", lit('a') | int_, o));
- BOOST_TEST(test("a", int_ | lit('a'), o));
-
- o = 10;
- BOOST_TEST(test("a", lit('a') | int_, o));
- BOOST_TEST(test("10", int_ | lit('a'), o));
- }
-
- {
- int i = 10;
- BOOST_TEST(test("a", lit('a') | int_, i));
- BOOST_TEST(test("10", int_ | lit('a'), i));
- }
-
- {
- BOOST_TEST(test("abc", string | int_, std::string("abc")));
- BOOST_TEST(test("1234", string | int_, 1234));
- BOOST_TEST(test("abc", int_ | string, std::string("abc")));
- BOOST_TEST(test("1234", int_ | string, 1234));
- }
-
- {
- // testing for alignment/truncation problems on little endian systems
- // (big endian systems will fail one of the other tests below)
- std::basic_string<wchar_t> generated;
- std::back_insert_iterator<std::basic_string<wchar_t> > outit(generated);
- boost::variant<int, char> v(10);
- bool result = karma::generate_delimited(outit
- , karma::int_ | karma::char_, karma::char_(' '), v);
- BOOST_TEST(result && generated == L"10 ");
- }
-
- {
- // test if alternatives with all components having unused
- // attribute generate first alternative
- fusion::vector<char, char> v('a', 'b');
- BOOST_TEST(test("axb", char_ << (lit('x') | lit('i')) << char_, v));
- BOOST_TEST(test("axib",
- char_ << (lit('x') << lit('i') | lit('i')) << char_, v));
- }
-
- {
- BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
- BOOST_TEST(test_delimited("x i ",
- char_('x') << char_('i') | char_('i'), char_(' ')));
- BOOST_TEST(test_delimited("i ",
- char_('i') | char_('x') << char_('i'), char_(' ')));
-
- variant<int, char> v (10);
- BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("10 ", int_ | char_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", char_ | lit('a') | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("10 ", int_ | lit('a') | char_, v, char_(' ')));
-
- v = 'c';
- BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("c ", char_ | lit('a') | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", int_ | lit('a') | char_, v, char_(' ')));
- BOOST_TEST(test_delimited("c ", int_ | char_ | lit('a'), v, char_(' ')));
- }
-
-// this leads to infinite loops
-// {
-// variant<int, std::string> v(10);
-// BOOST_TEST(test("10", int_ | +char_, v));
-//
-// v = "abc";
-// BOOST_TEST(test("abc", int_ | +char_, v));
-// }
-
- {
- // if nothing matches, the first explicit alternative will be chosen
- variant<double, char const*> v (10.0);
- BOOST_TEST(test("11", char_ | lit(11), v));
- BOOST_TEST(test("11", lit(11) | char_ , v));
- BOOST_TEST(test("10.0", double_ | lit(11), v));
- BOOST_TEST(test("11", lit(11) | double_, v));
- BOOST_TEST(!test("", char_ | int_, v));
-
- v = "c";
- BOOST_TEST(test("11", char_ | lit(11), v));
- BOOST_TEST(test("11", double_ | lit(11), v));
- BOOST_TEST(!test("", char_ | int_, v));
- }
-
- {
- // in strict mode if nothing matches, the alternative will fail
- variant<double, char const*> v (10.0);
- BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
- BOOST_TEST(test("11", strict[lit(11) | char_] , v));
-
- v = "c";
- BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
- }
-
- {
- // if nothing matches, the first explicit alternative will be chosen
- variant<double, char const*> v (10.0);
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
- BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
-
- v = "c";
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
- }
-
- {
- // if nothing matches, the first explicit alternative will be chosen,
- // optionals need to be accepted
- optional<variant<double, char const*> > v (10.0);
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
- BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
-
- v = "c";
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
- }
-
- {
- std::vector<int> v;
- BOOST_TEST(test("[]", '[' << (int_ % ", ") << ']' | "[]", v));
- BOOST_TEST(test("[]", '[' << -(int_ % ", ") << ']', v));
- BOOST_TEST(test("[]", '[' << ((int_ % ", ") | eps) << ']', v));
-
- v.push_back(5);
- v.push_back(5);
- v.push_back(5);
- BOOST_TEST(test("[5, 5, 5]", '[' << (int_ % ", ") << ']' | "[]", v));
- }
-
- {
- boost::optional<int> v;
- BOOST_TEST(test("error", int_ | "error" << omit[-int_], v));
- BOOST_TEST(test("error", int_ | "error" << omit[int_], v));
- v = 1;
- BOOST_TEST(test("1", int_ | "error" << omit[-int_], v));
- BOOST_TEST(test("1", int_ | "error" << omit[int_], v));
- }
-
- {
- typedef spirit_test::output_iterator<char>::type outiter_type;
- namespace karma = boost::spirit::karma;
-
- karma::rule<outiter_type, int()> r = int_;
- std::vector<int> v;
- BOOST_TEST(test("", '>' << r % ',' | karma::eps, v));
-
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
- BOOST_TEST(test(">1,2,3,4", '>' << r % ',' | karma::eps, v));
- }
-
- {
- typedef spirit_test::output_iterator<char>::type outiter_type;
- namespace karma = boost::spirit::karma;
-
- karma::rule<outiter_type, boost::optional<int>()> r = int_;
- boost::optional<int> o;
- BOOST_TEST(test("error", r | "error", o));
-
- o = 10;
- BOOST_TEST(test("10", r | "error", o));
- }
-
- return boost::report_errors();
-}
-
Copied: trunk/libs/spirit/test/karma/alternative1.cpp (from r67483, /trunk/libs/spirit/test/karma/alternative.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/alternative.cpp (original)
+++ trunk/libs/spirit/test/karma/alternative1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -114,114 +114,6 @@
}
{
- // test if alternatives with all components having unused
- // attribute generate first alternative
- fusion::vector<char, char> v('a', 'b');
- BOOST_TEST(test("axb", char_ << (lit('x') | lit('i')) << char_, v));
- BOOST_TEST(test("axib",
- char_ << (lit('x') << lit('i') | lit('i')) << char_, v));
- }
-
- {
- BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
- BOOST_TEST(test_delimited("x i ",
- char_('x') << char_('i') | char_('i'), char_(' ')));
- BOOST_TEST(test_delimited("i ",
- char_('i') | char_('x') << char_('i'), char_(' ')));
-
- variant<int, char> v (10);
- BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("10 ", int_ | char_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", char_ | lit('a') | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("10 ", int_ | lit('a') | char_, v, char_(' ')));
-
- v = 'c';
- BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("c ", char_ | lit('a') | int_, v, char_(' ')));
- BOOST_TEST(test_delimited("a ", int_ | lit('a') | char_, v, char_(' ')));
- BOOST_TEST(test_delimited("c ", int_ | char_ | lit('a'), v, char_(' ')));
- }
-
-// this leads to infinite loops
-// {
-// variant<int, std::string> v(10);
-// BOOST_TEST(test("10", int_ | +char_, v));
-//
-// v = "abc";
-// BOOST_TEST(test("abc", int_ | +char_, v));
-// }
-
- {
- // if nothing matches, the first explicit alternative will be chosen
- variant<double, char const*> v (10.0);
- BOOST_TEST(test("11", char_ | lit(11), v));
- BOOST_TEST(test("11", lit(11) | char_ , v));
- BOOST_TEST(test("10.0", double_ | lit(11), v));
- BOOST_TEST(test("11", lit(11) | double_, v));
- BOOST_TEST(!test("", char_ | int_, v));
-
- v = "c";
- BOOST_TEST(test("11", char_ | lit(11), v));
- BOOST_TEST(test("11", double_ | lit(11), v));
- BOOST_TEST(!test("", char_ | int_, v));
- }
-
- {
- // in strict mode if nothing matches, the alternative will fail
- variant<double, char const*> v (10.0);
- BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
- BOOST_TEST(test("11", strict[lit(11) | char_] , v));
-
- v = "c";
- BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
- }
-
- {
- // if nothing matches, the first explicit alternative will be chosen
- variant<double, char const*> v (10.0);
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
- BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
-
- v = "c";
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
- }
-
- {
- // if nothing matches, the first explicit alternative will be chosen,
- // optionals need to be accepted
- optional<variant<double, char const*> > v (10.0);
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
- BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
-
- v = "c";
- BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
- BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
- BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
- }
-
- {
- std::vector<int> v;
- BOOST_TEST(test("[]", '[' << (int_ % ", ") << ']' | "[]", v));
- BOOST_TEST(test("[]", '[' << -(int_ % ", ") << ']', v));
- BOOST_TEST(test("[]", '[' << ((int_ % ", ") | eps) << ']', v));
-
- v.push_back(5);
- v.push_back(5);
- v.push_back(5);
- BOOST_TEST(test("[5, 5, 5]", '[' << (int_ % ", ") << ']' | "[]", v));
- }
-
- {
boost::optional<int> v;
BOOST_TEST(test("error", int_ | "error" << omit[-int_], v));
BOOST_TEST(test("error", int_ | "error" << omit[int_], v));
Added: trunk/libs/spirit/test/karma/alternative2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/alternative2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,143 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+// #define KARMA_TEST_COMPILE_FAIL
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+#include <boost/spirit/include/karma_auxiliary.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost;
+ using namespace boost::spirit;
+ using namespace boost::spirit::ascii;
+
+ {
+ // test if alternatives with all components having unused
+ // attribute generate first alternative
+ fusion::vector<char, char> v('a', 'b');
+ BOOST_TEST(test("axb", char_ << (lit('x') | lit('i')) << char_, v));
+ BOOST_TEST(test("axib",
+ char_ << (lit('x') << lit('i') | lit('i')) << char_, v));
+ }
+
+ {
+ BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
+ BOOST_TEST(test_delimited("x i ",
+ char_('x') << char_('i') | char_('i'), char_(' ')));
+ BOOST_TEST(test_delimited("i ",
+ char_('i') | char_('x') << char_('i'), char_(' ')));
+
+ variant<int, char> v (10);
+ BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
+ BOOST_TEST(test_delimited("10 ", int_ | char_, v, char_(' ')));
+ BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
+ BOOST_TEST(test_delimited("a ", char_ | lit('a') | int_, v, char_(' ')));
+ BOOST_TEST(test_delimited("10 ", int_ | lit('a') | char_, v, char_(' ')));
+
+ v = 'c';
+ BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
+ BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
+ BOOST_TEST(test_delimited("c ", char_ | lit('a') | int_, v, char_(' ')));
+ BOOST_TEST(test_delimited("a ", int_ | lit('a') | char_, v, char_(' ')));
+ BOOST_TEST(test_delimited("c ", int_ | char_ | lit('a'), v, char_(' ')));
+ }
+
+// this leads to infinite loops
+// {
+// variant<int, std::string> v(10);
+// BOOST_TEST(test("10", int_ | +char_, v));
+//
+// v = "abc";
+// BOOST_TEST(test("abc", int_ | +char_, v));
+// }
+
+ {
+ // if nothing matches, the first explicit alternative will be chosen
+ variant<double, char const*> v (10.0);
+ BOOST_TEST(test("11", char_ | lit(11), v));
+ BOOST_TEST(test("11", lit(11) | char_ , v));
+ BOOST_TEST(test("10.0", double_ | lit(11), v));
+ BOOST_TEST(test("11", lit(11) | double_, v));
+ BOOST_TEST(!test("", char_ | int_, v));
+
+ v = "c";
+ BOOST_TEST(test("11", char_ | lit(11), v));
+ BOOST_TEST(test("11", double_ | lit(11), v));
+ BOOST_TEST(!test("", char_ | int_, v));
+ }
+
+ {
+ // in strict mode if nothing matches, the alternative will fail
+ variant<double, char const*> v (10.0);
+ BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
+ BOOST_TEST(test("11", strict[lit(11) | char_] , v));
+
+ v = "c";
+ BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
+ }
+
+ {
+ // if nothing matches, the first explicit alternative will be chosen
+ variant<double, char const*> v (10.0);
+ BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
+ BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
+ BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
+ BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
+ BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
+
+ v = "c";
+ BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
+ BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
+ BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
+ }
+
+ {
+ // if nothing matches, the first explicit alternative will be chosen,
+ // optionals need to be accepted
+ optional<variant<double, char const*> > v (10.0);
+ BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
+ BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
+ BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
+ BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
+ BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
+
+ v = "c";
+ BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
+ BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
+ BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
+ }
+
+ {
+ std::vector<int> v;
+ BOOST_TEST(test("[]", '[' << (int_ % ", ") << ']' | "[]", v));
+ BOOST_TEST(test("[]", '[' << -(int_ % ", ") << ']', v));
+ BOOST_TEST(test("[]", '[' << ((int_ % ", ") | eps) << ']', v));
+
+ v.push_back(5);
+ v.push_back(5);
+ v.push_back(5);
+ BOOST_TEST(test("[5, 5, 5]", '[' << (int_ % ", ") << ']' | "[]", v));
+ }
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/karma/auto.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/auto.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,334 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/fusion/include/std_pair.hpp>
-#include <boost/spirit/include/karma_bool.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_auto.hpp>
-
-#include "test.hpp"
-
-namespace karma = boost::spirit::karma;
-namespace traits = boost::spirit::traits;
-
-///////////////////////////////////////////////////////////////////////////////
-template <typename Char, typename T>
-bool test_create_generator(Char const *expected, T const& t)
-{
- std::basic_string<Char> generated;
- std::back_insert_iterator<std::basic_string<Char> > sink(generated);
-
- BOOST_TEST((traits::meta_create_exists<karma::domain, T>::value));
- bool result = karma::generate(sink, karma::create_generator<T>(), t);
-
- spirit_test::print_if_failed("test_create_generator", result, generated, expected);
- return result && generated == expected;
-}
-
-template <typename Char, typename T>
-bool test_create_generator_auto(Char const *expected, T const& t)
-{
- std::basic_string<Char> generated;
- std::back_insert_iterator<std::basic_string<Char> > sink(generated);
-
- BOOST_TEST((traits::meta_create_exists<karma::domain, T>::value));
- bool result = karma::generate(sink, t);
-
- spirit_test::print_if_failed("test_create_generator (auto)", result, generated, expected);
- return result && generated == expected;
-}
-
-template <typename Char, typename Attribute>
-bool test_rule(Char const *expected, Attribute const& attr)
-{
- BOOST_TEST((traits::meta_create_exists<karma::domain, Attribute>::value));
-
- typedef typename spirit_test::output_iterator<Char>::type sink_type;
- karma::rule<sink_type, Attribute()> r =
- karma::create_generator<Attribute>();
- return spirit_test::test(expected, r, attr);
-}
-
-template <typename Char, typename Attribute, typename Delimiter>
-bool test_rule_delimited(Char const *expected, Attribute const& attr
- , Delimiter const& d)
-{
- BOOST_TEST((traits::meta_create_exists<karma::domain, Attribute>::value));
-
- typedef typename spirit_test::output_iterator<Char>::type sink_type;
- karma::rule<sink_type, Attribute(), Delimiter> r =
- karma::create_generator<Attribute>();
- return spirit_test::test_delimited(expected, r, attr, d);
-}
-
-struct my_type {};
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- {
- BOOST_TEST((!traits::meta_create_exists<karma::domain, my_type>::value));
- }
-
- {
- // test primitive types
- BOOST_TEST(test_create_generator("true", true));
- BOOST_TEST(test_create_generator("1", 1));
- BOOST_TEST(test_create_generator("1.1", 1.1));
- BOOST_TEST(test_create_generator("test", std::string("test")));
- BOOST_TEST(test_create_generator("a", 'a'));
- BOOST_TEST(test_create_generator(L"a", L'a'));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test_create_generator("012", v));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test_create_generator("012", l));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test_create_generator("", o));
- o = 1;
- BOOST_TEST(test_create_generator("1", o));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test_create_generator("1", vv));
- vv = 1.0;
- BOOST_TEST(test_create_generator("1.0", vv));
- vv = 1.0f;
- BOOST_TEST(test_create_generator("1.0", vv));
- vv = "some string";
- BOOST_TEST(test_create_generator("some string", vv));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test_create_generator("12.0", p));
- }
-
- {
- // test primitive types
-// BOOST_TEST(test_create_generator_auto("true", true));
-// BOOST_TEST(test_create_generator_auto("1", 1));
-// BOOST_TEST(test_create_generator_auto("1.1", 1.1));
-// BOOST_TEST(test_create_generator_auto("test", std::string("test")));
-// BOOST_TEST(test_create_generator_auto("a", 'a'));
-// BOOST_TEST(test_create_generator_auto(L"a", L'a'));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test_create_generator_auto("012", v));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test_create_generator_auto("012", l));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test_create_generator_auto("", o));
- o = 1;
- BOOST_TEST(test_create_generator_auto("1", o));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test_create_generator_auto("1", vv));
- vv = 1.0;
- BOOST_TEST(test_create_generator_auto("1.0", vv));
- vv = 1.0f;
- BOOST_TEST(test_create_generator_auto("1.0", vv));
- vv = "some string";
- BOOST_TEST(test_create_generator_auto("some string", vv));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test_create_generator_auto("12.0", p));
- }
-
- {
- using karma::auto_;
- using karma::upper;
- using spirit_test::test;
- using spirit_test::test_delimited;
-
- // test primitive types
- BOOST_TEST(test("true", auto_, true));
- BOOST_TEST(test("1", auto_, 1));
- BOOST_TEST(test("1.1", auto_, 1.1));
- BOOST_TEST(test("test", auto_, "test"));
- BOOST_TEST(test(L"test", auto_, L"test"));
- BOOST_TEST(test("a", auto_, 'a'));
- BOOST_TEST(test(L"a", auto_, L'a'));
-
- BOOST_TEST(test("TRUE", upper[auto_], true));
- BOOST_TEST(test("TEST", upper[auto_], "test"));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test("012", auto_, v));
- BOOST_TEST(test("0,1,2", auto_ % ',', v));
- BOOST_TEST(test_delimited("0,1,2,", auto_, v, ','));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test("012", auto_, l));
- BOOST_TEST(test("0,1,2", auto_ % ',', l));
- BOOST_TEST(test_delimited("0,1,2,", auto_, l, ','));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test("", auto_, o));
- o = 1;
- BOOST_TEST(test("1", auto_, o));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test("1", auto_, vv));
- vv = 1.0;
- BOOST_TEST(test("1.0", auto_, vv));
- vv = 1.0f;
- BOOST_TEST(test("1.0", auto_, vv));
- vv = "some string";
- BOOST_TEST(test("some string", auto_, vv));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test("12.0", auto_, p));
- BOOST_TEST(test_delimited("1,2.0,", auto_, p, ','));
- }
-
- {
- using karma::auto_;
- using karma::upper;
- using spirit_test::test;
- using spirit_test::test_delimited;
-
- // test primitive types
- BOOST_TEST(test("true", auto_(true)));
- BOOST_TEST(test("1", auto_(1)));
- BOOST_TEST(test("1.1", auto_(1.1)));
- BOOST_TEST(test("test", auto_("test")));
- BOOST_TEST(test(L"test", auto_(L"test")));
- BOOST_TEST(test("a", auto_('a')));
- BOOST_TEST(test(L"a", auto_(L'a')));
-
- BOOST_TEST(test("TRUE", upper[auto_(true)]));
- BOOST_TEST(test("TEST", upper[auto_("test")]));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test("012", auto_(v)));
- BOOST_TEST(test_delimited("0,1,2,", auto_(v), ','));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test("012", auto_(l)));
- BOOST_TEST(test_delimited("0,1,2,", auto_(l), ','));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test("", auto_(o)));
- o = 1;
- BOOST_TEST(test("1", auto_(o)));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test("1", auto_(vv)));
- vv = 1.0;
- BOOST_TEST(test("1.0", auto_(vv)));
- vv = 1.0f;
- BOOST_TEST(test("1.0", auto_(vv)));
- vv = "some string";
- BOOST_TEST(test("some string", auto_(vv)));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test("12.0", auto_, p));
- BOOST_TEST(test_delimited("1,2.0,", auto_(p), ','));
- }
-
- {
- using spirit_test::test;
- using spirit_test::test_delimited;
-
- // test primitive types
- BOOST_TEST(test_rule("true", true));
- BOOST_TEST(test_rule("1", 1));
- BOOST_TEST(test_rule("1.1", 1.1));
- BOOST_TEST(test_rule("test", std::string("test")));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test_rule("012", v));
- BOOST_TEST(test_rule_delimited("0,1,2,", v, ','));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test_rule("012", l));
- BOOST_TEST(test_rule_delimited("0,1,2,", l, ','));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test_rule("", o));
- o = 1;
- BOOST_TEST(test_rule("1", o));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test_rule("1", vv));
- vv = 1.0;
- BOOST_TEST(test_rule("1.0", vv));
- vv = 1.0f;
- BOOST_TEST(test_rule("1.0", vv));
- vv = "some string";
- BOOST_TEST(test_rule("some string", vv));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test_rule("12.0", p));
- BOOST_TEST(test_rule_delimited("1,2.0,", p, ','));
- }
-
- return boost::report_errors();
-}
Added: trunk/libs/spirit/test/karma/auto.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/auto.hpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,79 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#if !defined(BOOST_SPIRIT_TEST_AUTO_HPP)
+#define BOOST_SPIRIT_TEST_AUTO_HPP
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/fusion/include/std_pair.hpp>
+#include <boost/spirit/include/karma_bool.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_auto.hpp>
+
+#include "test.hpp"
+
+namespace karma = boost::spirit::karma;
+namespace traits = boost::spirit::traits;
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename Char, typename T>
+bool test_create_generator(Char const *expected, T const& t)
+{
+ std::basic_string<Char> generated;
+ std::back_insert_iterator<std::basic_string<Char> > sink(generated);
+
+ BOOST_TEST((traits::meta_create_exists<karma::domain, T>::value));
+ bool result = karma::generate(sink, karma::create_generator<T>(), t);
+
+ spirit_test::print_if_failed("test_create_generator", result, generated, expected);
+ return result && generated == expected;
+}
+
+template <typename Char, typename T>
+bool test_create_generator_auto(Char const *expected, T const& t)
+{
+ std::basic_string<Char> generated;
+ std::back_insert_iterator<std::basic_string<Char> > sink(generated);
+
+ BOOST_TEST((traits::meta_create_exists<karma::domain, T>::value));
+ bool result = karma::generate(sink, t);
+
+ spirit_test::print_if_failed("test_create_generator (auto)", result, generated, expected);
+ return result && generated == expected;
+}
+
+template <typename Char, typename Attribute>
+bool test_rule(Char const *expected, Attribute const& attr)
+{
+ BOOST_TEST((traits::meta_create_exists<karma::domain, Attribute>::value));
+
+ typedef typename spirit_test::output_iterator<Char>::type sink_type;
+ karma::rule<sink_type, Attribute()> r =
+ karma::create_generator<Attribute>();
+ return spirit_test::test(expected, r, attr);
+}
+
+template <typename Char, typename Attribute, typename Delimiter>
+bool test_rule_delimited(Char const *expected, Attribute const& attr
+ , Delimiter const& d)
+{
+ BOOST_TEST((traits::meta_create_exists<karma::domain, Attribute>::value));
+
+ typedef typename spirit_test::output_iterator<Char>::type sink_type;
+ karma::rule<sink_type, Attribute(), Delimiter> r =
+ karma::create_generator<Attribute>();
+ return spirit_test::test_delimited(expected, r, attr, d);
+}
+
+struct my_type {};
+
+#endif
Copied: trunk/libs/spirit/test/karma/auto1.cpp (from r67483, /trunk/libs/spirit/test/karma/auto.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/auto.cpp (original)
+++ trunk/libs/spirit/test/karma/auto1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -3,75 +3,7 @@
// Distributed under 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)
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/fusion/include/std_pair.hpp>
-#include <boost/spirit/include/karma_bool.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_auto.hpp>
-
-#include "test.hpp"
-
-namespace karma = boost::spirit::karma;
-namespace traits = boost::spirit::traits;
-
-///////////////////////////////////////////////////////////////////////////////
-template <typename Char, typename T>
-bool test_create_generator(Char const *expected, T const& t)
-{
- std::basic_string<Char> generated;
- std::back_insert_iterator<std::basic_string<Char> > sink(generated);
-
- BOOST_TEST((traits::meta_create_exists<karma::domain, T>::value));
- bool result = karma::generate(sink, karma::create_generator<T>(), t);
-
- spirit_test::print_if_failed("test_create_generator", result, generated, expected);
- return result && generated == expected;
-}
-
-template <typename Char, typename T>
-bool test_create_generator_auto(Char const *expected, T const& t)
-{
- std::basic_string<Char> generated;
- std::back_insert_iterator<std::basic_string<Char> > sink(generated);
-
- BOOST_TEST((traits::meta_create_exists<karma::domain, T>::value));
- bool result = karma::generate(sink, t);
-
- spirit_test::print_if_failed("test_create_generator (auto)", result, generated, expected);
- return result && generated == expected;
-}
-
-template <typename Char, typename Attribute>
-bool test_rule(Char const *expected, Attribute const& attr)
-{
- BOOST_TEST((traits::meta_create_exists<karma::domain, Attribute>::value));
-
- typedef typename spirit_test::output_iterator<Char>::type sink_type;
- karma::rule<sink_type, Attribute()> r =
- karma::create_generator<Attribute>();
- return spirit_test::test(expected, r, attr);
-}
-
-template <typename Char, typename Attribute, typename Delimiter>
-bool test_rule_delimited(Char const *expected, Attribute const& attr
- , Delimiter const& d)
-{
- BOOST_TEST((traits::meta_create_exists<karma::domain, Attribute>::value));
-
- typedef typename spirit_test::output_iterator<Char>::type sink_type;
- karma::rule<sink_type, Attribute(), Delimiter> r =
- karma::create_generator<Attribute>();
- return spirit_test::test_delimited(expected, r, attr, d);
-}
-
-struct my_type {};
+#include "auto.hpp"
///////////////////////////////////////////////////////////////////////////////
int main()
@@ -168,167 +100,5 @@
BOOST_TEST(test_create_generator_auto("12.0", p));
}
- {
- using karma::auto_;
- using karma::upper;
- using spirit_test::test;
- using spirit_test::test_delimited;
-
- // test primitive types
- BOOST_TEST(test("true", auto_, true));
- BOOST_TEST(test("1", auto_, 1));
- BOOST_TEST(test("1.1", auto_, 1.1));
- BOOST_TEST(test("test", auto_, "test"));
- BOOST_TEST(test(L"test", auto_, L"test"));
- BOOST_TEST(test("a", auto_, 'a'));
- BOOST_TEST(test(L"a", auto_, L'a'));
-
- BOOST_TEST(test("TRUE", upper[auto_], true));
- BOOST_TEST(test("TEST", upper[auto_], "test"));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test("012", auto_, v));
- BOOST_TEST(test("0,1,2", auto_ % ',', v));
- BOOST_TEST(test_delimited("0,1,2,", auto_, v, ','));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test("012", auto_, l));
- BOOST_TEST(test("0,1,2", auto_ % ',', l));
- BOOST_TEST(test_delimited("0,1,2,", auto_, l, ','));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test("", auto_, o));
- o = 1;
- BOOST_TEST(test("1", auto_, o));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test("1", auto_, vv));
- vv = 1.0;
- BOOST_TEST(test("1.0", auto_, vv));
- vv = 1.0f;
- BOOST_TEST(test("1.0", auto_, vv));
- vv = "some string";
- BOOST_TEST(test("some string", auto_, vv));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test("12.0", auto_, p));
- BOOST_TEST(test_delimited("1,2.0,", auto_, p, ','));
- }
-
- {
- using karma::auto_;
- using karma::upper;
- using spirit_test::test;
- using spirit_test::test_delimited;
-
- // test primitive types
- BOOST_TEST(test("true", auto_(true)));
- BOOST_TEST(test("1", auto_(1)));
- BOOST_TEST(test("1.1", auto_(1.1)));
- BOOST_TEST(test("test", auto_("test")));
- BOOST_TEST(test(L"test", auto_(L"test")));
- BOOST_TEST(test("a", auto_('a')));
- BOOST_TEST(test(L"a", auto_(L'a')));
-
- BOOST_TEST(test("TRUE", upper[auto_(true)]));
- BOOST_TEST(test("TEST", upper[auto_("test")]));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test("012", auto_(v)));
- BOOST_TEST(test_delimited("0,1,2,", auto_(v), ','));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test("012", auto_(l)));
- BOOST_TEST(test_delimited("0,1,2,", auto_(l), ','));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test("", auto_(o)));
- o = 1;
- BOOST_TEST(test("1", auto_(o)));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test("1", auto_(vv)));
- vv = 1.0;
- BOOST_TEST(test("1.0", auto_(vv)));
- vv = 1.0f;
- BOOST_TEST(test("1.0", auto_(vv)));
- vv = "some string";
- BOOST_TEST(test("some string", auto_(vv)));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test("12.0", auto_, p));
- BOOST_TEST(test_delimited("1,2.0,", auto_(p), ','));
- }
-
- {
- using spirit_test::test;
- using spirit_test::test_delimited;
-
- // test primitive types
- BOOST_TEST(test_rule("true", true));
- BOOST_TEST(test_rule("1", 1));
- BOOST_TEST(test_rule("1.1", 1.1));
- BOOST_TEST(test_rule("test", std::string("test")));
-
- // test containers
- std::vector<int> v;
- v.push_back(0);
- v.push_back(1);
- v.push_back(2);
- BOOST_TEST(test_rule("012", v));
- BOOST_TEST(test_rule_delimited("0,1,2,", v, ','));
-
- std::list<int> l;
- l.push_back(0);
- l.push_back(1);
- l.push_back(2);
- BOOST_TEST(test_rule("012", l));
- BOOST_TEST(test_rule_delimited("0,1,2,", l, ','));
-
- // test optional
- boost::optional<int> o;
- BOOST_TEST(test_rule("", o));
- o = 1;
- BOOST_TEST(test_rule("1", o));
-
- // test alternative
- boost::variant<int, double, float, std::string> vv;
- vv = 1;
- BOOST_TEST(test_rule("1", vv));
- vv = 1.0;
- BOOST_TEST(test_rule("1.0", vv));
- vv = 1.0f;
- BOOST_TEST(test_rule("1.0", vv));
- vv = "some string";
- BOOST_TEST(test_rule("some string", vv));
-
- // test fusion sequence
- std::pair<int, double> p (1, 2.0);
- BOOST_TEST(test_rule("12.0", p));
- BOOST_TEST(test_rule_delimited("1,2.0,", p, ','));
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/auto2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/auto2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,126 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include "auto.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ {
+ using karma::auto_;
+ using karma::upper;
+ using spirit_test::test;
+ using spirit_test::test_delimited;
+
+ // test primitive types
+ BOOST_TEST(test("true", auto_, true));
+ BOOST_TEST(test("1", auto_, 1));
+ BOOST_TEST(test("1.1", auto_, 1.1));
+ BOOST_TEST(test("test", auto_, "test"));
+ BOOST_TEST(test(L"test", auto_, L"test"));
+ BOOST_TEST(test("a", auto_, 'a'));
+ BOOST_TEST(test(L"a", auto_, L'a'));
+
+ BOOST_TEST(test("TRUE", upper[auto_], true));
+ BOOST_TEST(test("TEST", upper[auto_], "test"));
+
+ // test containers
+ std::vector<int> v;
+ v.push_back(0);
+ v.push_back(1);
+ v.push_back(2);
+ BOOST_TEST(test("012", auto_, v));
+ BOOST_TEST(test("0,1,2", auto_ % ',', v));
+ BOOST_TEST(test_delimited("0,1,2,", auto_, v, ','));
+
+ std::list<int> l;
+ l.push_back(0);
+ l.push_back(1);
+ l.push_back(2);
+ BOOST_TEST(test("012", auto_, l));
+ BOOST_TEST(test("0,1,2", auto_ % ',', l));
+ BOOST_TEST(test_delimited("0,1,2,", auto_, l, ','));
+
+ // test optional
+ boost::optional<int> o;
+ BOOST_TEST(test("", auto_, o));
+ o = 1;
+ BOOST_TEST(test("1", auto_, o));
+
+ // test alternative
+ boost::variant<int, double, float, std::string> vv;
+ vv = 1;
+ BOOST_TEST(test("1", auto_, vv));
+ vv = 1.0;
+ BOOST_TEST(test("1.0", auto_, vv));
+ vv = 1.0f;
+ BOOST_TEST(test("1.0", auto_, vv));
+ vv = "some string";
+ BOOST_TEST(test("some string", auto_, vv));
+
+ // test fusion sequence
+ std::pair<int, double> p (1, 2.0);
+ BOOST_TEST(test("12.0", auto_, p));
+ BOOST_TEST(test_delimited("1,2.0,", auto_, p, ','));
+ }
+
+ {
+ using karma::auto_;
+ using karma::upper;
+ using spirit_test::test;
+ using spirit_test::test_delimited;
+
+ // test primitive types
+ BOOST_TEST(test("true", auto_(true)));
+ BOOST_TEST(test("1", auto_(1)));
+ BOOST_TEST(test("1.1", auto_(1.1)));
+ BOOST_TEST(test("test", auto_("test")));
+ BOOST_TEST(test(L"test", auto_(L"test")));
+ BOOST_TEST(test("a", auto_('a')));
+ BOOST_TEST(test(L"a", auto_(L'a')));
+
+ BOOST_TEST(test("TRUE", upper[auto_(true)]));
+ BOOST_TEST(test("TEST", upper[auto_("test")]));
+
+ // test containers
+ std::vector<int> v;
+ v.push_back(0);
+ v.push_back(1);
+ v.push_back(2);
+ BOOST_TEST(test("012", auto_(v)));
+ BOOST_TEST(test_delimited("0,1,2,", auto_(v), ','));
+
+ std::list<int> l;
+ l.push_back(0);
+ l.push_back(1);
+ l.push_back(2);
+ BOOST_TEST(test("012", auto_(l)));
+ BOOST_TEST(test_delimited("0,1,2,", auto_(l), ','));
+
+ // test optional
+ boost::optional<int> o;
+ BOOST_TEST(test("", auto_(o)));
+ o = 1;
+ BOOST_TEST(test("1", auto_(o)));
+
+ // test alternative
+ boost::variant<int, double, float, std::string> vv;
+ vv = 1;
+ BOOST_TEST(test("1", auto_(vv)));
+ vv = 1.0;
+ BOOST_TEST(test("1.0", auto_(vv)));
+ vv = 1.0f;
+ BOOST_TEST(test("1.0", auto_(vv)));
+ vv = "some string";
+ BOOST_TEST(test("some string", auto_(vv)));
+
+ // test fusion sequence
+ std::pair<int, double> p (1, 2.0);
+ BOOST_TEST(test("12.0", auto_, p));
+ BOOST_TEST(test_delimited("1,2.0,", auto_(p), ','));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/karma/auto3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/auto3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,60 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include "auto.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ {
+ using spirit_test::test;
+ using spirit_test::test_delimited;
+
+ // test primitive types
+ BOOST_TEST(test_rule("true", true));
+ BOOST_TEST(test_rule("1", 1));
+ BOOST_TEST(test_rule("1.1", 1.1));
+ BOOST_TEST(test_rule("test", std::string("test")));
+
+ // test containers
+ std::vector<int> v;
+ v.push_back(0);
+ v.push_back(1);
+ v.push_back(2);
+ BOOST_TEST(test_rule("012", v));
+ BOOST_TEST(test_rule_delimited("0,1,2,", v, ','));
+
+ std::list<int> l;
+ l.push_back(0);
+ l.push_back(1);
+ l.push_back(2);
+ BOOST_TEST(test_rule("012", l));
+ BOOST_TEST(test_rule_delimited("0,1,2,", l, ','));
+
+ // test optional
+ boost::optional<int> o;
+ BOOST_TEST(test_rule("", o));
+ o = 1;
+ BOOST_TEST(test_rule("1", o));
+
+ // test alternative
+ boost::variant<int, double, float, std::string> vv;
+ vv = 1;
+ BOOST_TEST(test_rule("1", vv));
+ vv = 1.0;
+ BOOST_TEST(test_rule("1.0", vv));
+ vv = 1.0f;
+ BOOST_TEST(test_rule("1.0", vv));
+ vv = "some string";
+ BOOST_TEST(test_rule("some string", vv));
+
+ // test fusion sequence
+ std::pair<int, double> p (1, 2.0);
+ BOOST_TEST(test_rule("12.0", p));
+ BOOST_TEST(test_rule_delimited("1,2.0,", p, ','));
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/karma/binary.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/binary.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,276 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/karma_binary.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_phoenix_attributes.hpp>
-
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using namespace boost::spirit;
- using namespace boost::phoenix;
-
- { // test native endian binaries
-#ifdef BOOST_LITTLE_ENDIAN
- BOOST_TEST(binary_test("\x01", 1, byte_, 0x01));
- BOOST_TEST(binary_test("\x80", 1, byte_, 0x80));
- BOOST_TEST(binary_test("\x01\x82", 2, word, 0x8201));
- BOOST_TEST(binary_test("\x81\x02", 2, word, 0x0281));
- BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, dword, 0x84030201));
- BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, dword, 0x04030281));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, qword,
- 0x8807060504030201LL));
- BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- 0x0807060504030281LL));
-#endif
-
- BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte_, 0x01, pad(4)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x00\x00", 4, word, 0x0201, pad(4)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04", 4, dword, 0x04030201, pad(4)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 10,
- qword, 0x0807060504030201LL, pad(10)));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(binary_test("\x01", 1, byte_, 0x01));
- BOOST_TEST(binary_test("\x80", 1, byte_, 0x80));
- BOOST_TEST(binary_test("\x01\x82", 2, word, 0x0182));
- BOOST_TEST(binary_test("\x81\x02", 2, word, 0x8102));
- BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, dword, 0x01020384));
- BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, dword, 0x81020304));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, qword,
- 0x0102030405060788LL));
- BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- 0x8102030405060708LL));
-#endif
-
- BOOST_TEST(binary_test_delimited("\x01\x00\x00\x00", 4, byte_, 0x01, pad(4)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x00\x00", 4, word, 0x0102, pad(4)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04", 4, dword, 0x01020304, pad(4)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00", 10,
- qword, 0x0102030405060708LL, pad(10)));
-#endif
-#endif
- }
-
- { // test native endian binaries
-#ifdef BOOST_LITTLE_ENDIAN
- BOOST_TEST(binary_test("\x01", 1, byte_(0x01)));
- BOOST_TEST(binary_test("\x01\x02", 2, word(0x0201)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword(0x04030201)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
- qword(0x0807060504030201LL)));
-#endif
-#else
- BOOST_TEST(binary_test("\x01", 1, byte_(0x01)));
- BOOST_TEST(binary_test("\x01\x02", 2, word(0x0102)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword(0x01020304)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
- qword(0x0102030405060708LL)));
-#endif
-#endif
- }
-
- { // test big endian binaries
- BOOST_TEST(binary_test("\x01\x82", 2, big_word, 0x0182));
- BOOST_TEST(binary_test("\x81\x02", 2, big_word, 0x8102));
- BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, big_dword, 0x01020384));
- BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, big_dword, 0x81020304));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, big_qword,
- 0x0102030405060788LL));
- BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, big_qword,
- 0x8102030405060708LL));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, big_qword, 0x0102030405060708LL, pad(10)));
-#endif
- }
-
- {
- BOOST_TEST(binary_test("\x01\x02", 2, big_word(0x0102)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, big_dword(0x01020304)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
- big_qword(0x0102030405060708LL)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, big_qword(0x0102030405060708LL), pad(10)));
-#endif
- }
-
- { // test little endian binaries
- BOOST_TEST(binary_test("\x01\x82", 2, little_word, 0x8201));
- BOOST_TEST(binary_test("\x81\x02", 2, little_word, 0x0281));
- BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, little_dword, 0x84030201));
- BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, little_dword, 0x04030281));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, little_qword,
- 0x8807060504030201LL));
- BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, little_qword,
- 0x0807060504030281LL));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, little_qword, 0x0807060504030201LL, pad(10)));
-#endif
- }
-
- {
- BOOST_TEST(binary_test("\x01\x02", 2, little_word(0x0201)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, little_dword(0x04030201)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
- little_qword(0x0807060504030201LL)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, little_qword(0x0807060504030201LL), pad(10)));
-#endif
- }
-
- { // test native endian binaries
- boost::optional<boost::uint8_t> v8;
- boost::optional<boost::uint16_t> v16;
- boost::optional<boost::uint32_t> v32;
-
-#ifdef BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(!binary_test("", 1, byte_, v8));
- BOOST_TEST(!binary_test("", 2, word, v16));
- BOOST_TEST(!binary_test("", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64;
- BOOST_TEST(!binary_test("", 8, qword, v64));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(!binary_test("", 1, byte_, v8));
- BOOST_TEST(!binary_test("", 2, word, v16));
- BOOST_TEST(!binary_test("", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64;
- BOOST_TEST(!binary_test("", 8, qword, v64));
-#endif
-
-#endif
- }
-
- { // test optional attributes
-
-#ifdef BOOST_LITTLE_ENDIAN
- boost::optional<boost::uint8_t> v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, v8));
- boost::optional<boost::uint16_t> v16 (0x0201);
- BOOST_TEST(binary_test("\x01\x02", 2, word, v16));
- boost::optional<boost::uint32_t> v32 (0x04030201);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64 (0x0807060504030201LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword, v64));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- boost::optional<boost::uint8_t> v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, v8));
- boost::optional<boost::uint16_t> v16 (0x0102);
- BOOST_TEST(binary_test("\x01\x02", 2, word, v16));
- boost::optional<boost::uint32_t> v32 (0x01020304);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64 (0x0102030405060708LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword, v64));
-#endif
-
-#endif
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- { // test Phoenix expression attributes, only supported if
- // karma_phoenix_attributes.hpp is included
- namespace phoenix = boost::phoenix;
-
-#ifdef BOOST_LITTLE_ENDIAN
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::val(0x01)));
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::val(0x0201)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword,
- phoenix::val(0x04030201)));
-
- boost::uint8_t v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::ref(v8)));
- BOOST_TEST(binary_test("\x02", 1, byte_, ++phoenix::ref(v8)));
-
- boost::uint16_t v16 (0x0201);
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::ref(v16)));
- BOOST_TEST(binary_test("\x02\x02", 2, word, ++phoenix::ref(v16)));
-
- boost::uint32_t v32 (0x04030201);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, phoenix::ref(v32)));
- BOOST_TEST(binary_test("\x02\x02\x03\x04", 4, dword, ++phoenix::ref(v32)));
-
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::val(0x0807060504030201LL)));
-
- boost::uint64_t v64 (0x0807060504030201LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::ref(v64)));
- BOOST_TEST(binary_test("\x02\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- ++phoenix::ref(v64)));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::val(0x01)));
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::val(0x0102)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword,
- phoenix::val(0x01020304)));
-
- boost::uint8_t v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::ref(v8)));
- BOOST_TEST(binary_test("\x02", 1, byte_, ++phoenix::ref(v8)));
-
- boost::uint16_t v16 (0x0102);
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::ref(v16)));
- BOOST_TEST(binary_test("\x01\x03", 2, word, ++phoenix::ref(v16)));
-
- boost::uint32_t v32 (0x01020304);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, phoenix::ref(v32)));
- BOOST_TEST(binary_test("\x01\x02\x03\x05", 4, dword, ++phoenix::ref(v32)));
-
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::val(0x0102030405060708LL)));
-
- boost::uint64_t v64 (0x0102030405060708LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::ref(v64)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x09", 8, qword,
- ++phoenix::ref(v64)));
-#endif
-
-#endif
- }
-#endif
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/karma/binary1.cpp (from r67483, /trunk/libs/spirit/test/karma/binary.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/binary.cpp (original)
+++ trunk/libs/spirit/test/karma/binary1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -93,184 +93,5 @@
#endif
}
- { // test big endian binaries
- BOOST_TEST(binary_test("\x01\x82", 2, big_word, 0x0182));
- BOOST_TEST(binary_test("\x81\x02", 2, big_word, 0x8102));
- BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, big_dword, 0x01020384));
- BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, big_dword, 0x81020304));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, big_qword,
- 0x0102030405060788LL));
- BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, big_qword,
- 0x8102030405060708LL));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, big_qword, 0x0102030405060708LL, pad(10)));
-#endif
- }
-
- {
- BOOST_TEST(binary_test("\x01\x02", 2, big_word(0x0102)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, big_dword(0x01020304)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
- big_qword(0x0102030405060708LL)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, big_qword(0x0102030405060708LL), pad(10)));
-#endif
- }
-
- { // test little endian binaries
- BOOST_TEST(binary_test("\x01\x82", 2, little_word, 0x8201));
- BOOST_TEST(binary_test("\x81\x02", 2, little_word, 0x0281));
- BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, little_dword, 0x84030201));
- BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, little_dword, 0x04030281));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, little_qword,
- 0x8807060504030201LL));
- BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, little_qword,
- 0x0807060504030281LL));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, little_qword, 0x0807060504030201LL, pad(10)));
-#endif
- }
-
- {
- BOOST_TEST(binary_test("\x01\x02", 2, little_word(0x0201)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, little_dword(0x04030201)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
- little_qword(0x0807060504030201LL)));
- BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
- 10, little_qword(0x0807060504030201LL), pad(10)));
-#endif
- }
-
- { // test native endian binaries
- boost::optional<boost::uint8_t> v8;
- boost::optional<boost::uint16_t> v16;
- boost::optional<boost::uint32_t> v32;
-
-#ifdef BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(!binary_test("", 1, byte_, v8));
- BOOST_TEST(!binary_test("", 2, word, v16));
- BOOST_TEST(!binary_test("", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64;
- BOOST_TEST(!binary_test("", 8, qword, v64));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(!binary_test("", 1, byte_, v8));
- BOOST_TEST(!binary_test("", 2, word, v16));
- BOOST_TEST(!binary_test("", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64;
- BOOST_TEST(!binary_test("", 8, qword, v64));
-#endif
-
-#endif
- }
-
- { // test optional attributes
-
-#ifdef BOOST_LITTLE_ENDIAN
- boost::optional<boost::uint8_t> v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, v8));
- boost::optional<boost::uint16_t> v16 (0x0201);
- BOOST_TEST(binary_test("\x01\x02", 2, word, v16));
- boost::optional<boost::uint32_t> v32 (0x04030201);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64 (0x0807060504030201LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword, v64));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- boost::optional<boost::uint8_t> v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, v8));
- boost::optional<boost::uint16_t> v16 (0x0102);
- BOOST_TEST(binary_test("\x01\x02", 2, word, v16));
- boost::optional<boost::uint32_t> v32 (0x01020304);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, v32));
-#ifdef BOOST_HAS_LONG_LONG
- boost::optional<boost::uint64_t> v64 (0x0102030405060708LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword, v64));
-#endif
-
-#endif
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- { // test Phoenix expression attributes, only supported if
- // karma_phoenix_attributes.hpp is included
- namespace phoenix = boost::phoenix;
-
-#ifdef BOOST_LITTLE_ENDIAN
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::val(0x01)));
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::val(0x0201)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword,
- phoenix::val(0x04030201)));
-
- boost::uint8_t v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::ref(v8)));
- BOOST_TEST(binary_test("\x02", 1, byte_, ++phoenix::ref(v8)));
-
- boost::uint16_t v16 (0x0201);
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::ref(v16)));
- BOOST_TEST(binary_test("\x02\x02", 2, word, ++phoenix::ref(v16)));
-
- boost::uint32_t v32 (0x04030201);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, phoenix::ref(v32)));
- BOOST_TEST(binary_test("\x02\x02\x03\x04", 4, dword, ++phoenix::ref(v32)));
-
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::val(0x0807060504030201LL)));
-
- boost::uint64_t v64 (0x0807060504030201LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::ref(v64)));
- BOOST_TEST(binary_test("\x02\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- ++phoenix::ref(v64)));
-#endif
-
-#else // BOOST_LITTLE_ENDIAN
-
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::val(0x01)));
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::val(0x0102)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword,
- phoenix::val(0x01020304)));
-
- boost::uint8_t v8 (0x01);
- BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::ref(v8)));
- BOOST_TEST(binary_test("\x02", 1, byte_, ++phoenix::ref(v8)));
-
- boost::uint16_t v16 (0x0102);
- BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::ref(v16)));
- BOOST_TEST(binary_test("\x01\x03", 2, word, ++phoenix::ref(v16)));
-
- boost::uint32_t v32 (0x01020304);
- BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, phoenix::ref(v32)));
- BOOST_TEST(binary_test("\x01\x02\x03\x05", 4, dword, ++phoenix::ref(v32)));
-
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::val(0x0102030405060708LL)));
-
- boost::uint64_t v64 (0x0102030405060708LL);
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
- phoenix::ref(v64)));
- BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x09", 8, qword,
- ++phoenix::ref(v64)));
-#endif
-
-#endif
- }
-#endif
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/binary2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/binary2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,109 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_binary.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+ using namespace boost::phoenix;
+
+ { // test big endian binaries
+ BOOST_TEST(binary_test("\x01\x82", 2, big_word, 0x0182));
+ BOOST_TEST(binary_test("\x81\x02", 2, big_word, 0x8102));
+ BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, big_dword, 0x01020384));
+ BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, big_dword, 0x81020304));
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, big_qword,
+ 0x0102030405060788LL));
+ BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, big_qword,
+ 0x8102030405060708LL));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
+ 10, big_qword, 0x0102030405060708LL, pad(10)));
+#endif
+ }
+
+ {
+ BOOST_TEST(binary_test("\x01\x02", 2, big_word(0x0102)));
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, big_dword(0x01020304)));
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
+ big_qword(0x0102030405060708LL)));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
+ 10, big_qword(0x0102030405060708LL), pad(10)));
+#endif
+ }
+
+ { // test little endian binaries
+ BOOST_TEST(binary_test("\x01\x82", 2, little_word, 0x8201));
+ BOOST_TEST(binary_test("\x81\x02", 2, little_word, 0x0281));
+ BOOST_TEST(binary_test("\x01\x02\x03\x84", 4, little_dword, 0x84030201));
+ BOOST_TEST(binary_test("\x81\x02\x03\x04", 4, little_dword, 0x04030281));
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x88", 8, little_qword,
+ 0x8807060504030201LL));
+ BOOST_TEST(binary_test("\x81\x02\x03\x04\x05\x06\x07\x08", 8, little_qword,
+ 0x0807060504030281LL));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
+ 10, little_qword, 0x0807060504030201LL, pad(10)));
+#endif
+ }
+
+ {
+ BOOST_TEST(binary_test("\x01\x02", 2, little_word(0x0201)));
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, little_dword(0x04030201)));
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8,
+ little_qword(0x0807060504030201LL)));
+ BOOST_TEST(binary_test_delimited("\x01\x02\x03\x04\x05\x06\x07\x08\x00\x00",
+ 10, little_qword(0x0807060504030201LL), pad(10)));
+#endif
+ }
+
+ { // test native endian binaries
+ boost::optional<boost::uint8_t> v8;
+ boost::optional<boost::uint16_t> v16;
+ boost::optional<boost::uint32_t> v32;
+
+#ifdef BOOST_LITTLE_ENDIAN
+
+ BOOST_TEST(!binary_test("", 1, byte_, v8));
+ BOOST_TEST(!binary_test("", 2, word, v16));
+ BOOST_TEST(!binary_test("", 4, dword, v32));
+#ifdef BOOST_HAS_LONG_LONG
+ boost::optional<boost::uint64_t> v64;
+ BOOST_TEST(!binary_test("", 8, qword, v64));
+#endif
+
+#else // BOOST_LITTLE_ENDIAN
+
+ BOOST_TEST(!binary_test("", 1, byte_, v8));
+ BOOST_TEST(!binary_test("", 2, word, v16));
+ BOOST_TEST(!binary_test("", 4, dword, v32));
+#ifdef BOOST_HAS_LONG_LONG
+ boost::optional<boost::uint64_t> v64;
+ BOOST_TEST(!binary_test("", 8, qword, v64));
+#endif
+
+#endif
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/karma/binary3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/binary3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,128 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_binary.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+ using namespace boost::phoenix;
+
+ { // test optional attributes
+
+#ifdef BOOST_LITTLE_ENDIAN
+ boost::optional<boost::uint8_t> v8 (0x01);
+ BOOST_TEST(binary_test("\x01", 1, byte_, v8));
+ boost::optional<boost::uint16_t> v16 (0x0201);
+ BOOST_TEST(binary_test("\x01\x02", 2, word, v16));
+ boost::optional<boost::uint32_t> v32 (0x04030201);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, v32));
+#ifdef BOOST_HAS_LONG_LONG
+ boost::optional<boost::uint64_t> v64 (0x0807060504030201LL);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword, v64));
+#endif
+
+#else // BOOST_LITTLE_ENDIAN
+
+ boost::optional<boost::uint8_t> v8 (0x01);
+ BOOST_TEST(binary_test("\x01", 1, byte_, v8));
+ boost::optional<boost::uint16_t> v16 (0x0102);
+ BOOST_TEST(binary_test("\x01\x02", 2, word, v16));
+ boost::optional<boost::uint32_t> v32 (0x01020304);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, v32));
+#ifdef BOOST_HAS_LONG_LONG
+ boost::optional<boost::uint64_t> v64 (0x0102030405060708LL);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword, v64));
+#endif
+
+#endif
+ }
+
+// we support Phoenix attributes only starting with V2.2
+#if SPIRIT_VERSION >= 0x2020
+ { // test Phoenix expression attributes, only supported if
+ // karma_phoenix_attributes.hpp is included
+ namespace phoenix = boost::phoenix;
+
+#ifdef BOOST_LITTLE_ENDIAN
+ BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::val(0x01)));
+ BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::val(0x0201)));
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword,
+ phoenix::val(0x04030201)));
+
+ boost::uint8_t v8 (0x01);
+ BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::ref(v8)));
+ BOOST_TEST(binary_test("\x02", 1, byte_, ++phoenix::ref(v8)));
+
+ boost::uint16_t v16 (0x0201);
+ BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::ref(v16)));
+ BOOST_TEST(binary_test("\x02\x02", 2, word, ++phoenix::ref(v16)));
+
+ boost::uint32_t v32 (0x04030201);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, phoenix::ref(v32)));
+ BOOST_TEST(binary_test("\x02\x02\x03\x04", 4, dword, ++phoenix::ref(v32)));
+
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
+ phoenix::val(0x0807060504030201LL)));
+
+ boost::uint64_t v64 (0x0807060504030201LL);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
+ phoenix::ref(v64)));
+ BOOST_TEST(binary_test("\x02\x02\x03\x04\x05\x06\x07\x08", 8, qword,
+ ++phoenix::ref(v64)));
+#endif
+
+#else // BOOST_LITTLE_ENDIAN
+
+ BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::val(0x01)));
+ BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::val(0x0102)));
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword,
+ phoenix::val(0x01020304)));
+
+ boost::uint8_t v8 (0x01);
+ BOOST_TEST(binary_test("\x01", 1, byte_, phoenix::ref(v8)));
+ BOOST_TEST(binary_test("\x02", 1, byte_, ++phoenix::ref(v8)));
+
+ boost::uint16_t v16 (0x0102);
+ BOOST_TEST(binary_test("\x01\x02", 2, word, phoenix::ref(v16)));
+ BOOST_TEST(binary_test("\x01\x03", 2, word, ++phoenix::ref(v16)));
+
+ boost::uint32_t v32 (0x01020304);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04", 4, dword, phoenix::ref(v32)));
+ BOOST_TEST(binary_test("\x01\x02\x03\x05", 4, dword, ++phoenix::ref(v32)));
+
+#ifdef BOOST_HAS_LONG_LONG
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
+ phoenix::val(0x0102030405060708LL)));
+
+ boost::uint64_t v64 (0x0102030405060708LL);
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x08", 8, qword,
+ phoenix::ref(v64)));
+ BOOST_TEST(binary_test("\x01\x02\x03\x04\x05\x06\x07\x09", 8, qword,
+ ++phoenix::ref(v64)));
+#endif
+
+#endif
+ }
+#endif
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/karma/case_handling.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/case_handling.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,285 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-// this file intentionally contains non-ascii characters
-// boostinspect:noascii
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/detail/workaround.hpp>
-
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using namespace boost::spirit;
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("x", lower['X']));
- BOOST_TEST(test("x", lower['x']));
-
- BOOST_TEST(test("x", lower[char_], 'X'));
- BOOST_TEST(test("x", lower[char_], 'x'));
- BOOST_TEST(test("x", lower[char_('X')]));
- BOOST_TEST(test("x", lower[char_('x')]));
-
- BOOST_TEST(test(" ", lower[space]));
- BOOST_TEST(test("\t", lower[space], '\t'));
-
- BOOST_TEST(test("x", lower[lower['X']]));
- BOOST_TEST(test("x", lower[lower['x']]));
-
- BOOST_TEST(test("x", lower[lower[char_]], 'X'));
- BOOST_TEST(test("x", lower[lower[char_]], 'x'));
- BOOST_TEST(test("x", lower[lower[char_('X')]]));
- BOOST_TEST(test("x", lower[lower[char_('x')]]));
-
- BOOST_TEST(test(" ", lower[lower[space]]));
- BOOST_TEST(test("\t", lower[lower[space]], '\t'));
-
- BOOST_TEST(test("X", upper[lower['X']]));
- BOOST_TEST(test("X", upper[lower['x']]));
-
- BOOST_TEST(test("X", upper[lower[char_]], 'X'));
- BOOST_TEST(test("X", upper[lower[char_]], 'x'));
- BOOST_TEST(test("X", upper[lower[char_('X')]]));
- BOOST_TEST(test("X", upper[lower[char_('x')]]));
-
- BOOST_TEST(test(" ", upper[lower[space]]));
- BOOST_TEST(test("\t", upper[lower[space]], '\t'));
-
- BOOST_TEST(test("X", upper['X']));
- BOOST_TEST(test("X", upper['x']));
-
- BOOST_TEST(test("X", upper[char_], 'X'));
- BOOST_TEST(test("X", upper[char_], 'x'));
- BOOST_TEST(test("X", upper[char_('X')]));
- BOOST_TEST(test("X", upper[char_('x')]));
-
- BOOST_TEST(test(" ", upper[space]));
- BOOST_TEST(test("\t", upper[space], '\t'));
-
- BOOST_TEST(test("x", lower[upper['X']]));
- BOOST_TEST(test("x", lower[upper['x']]));
-
- BOOST_TEST(test("x", lower[upper[char_]], 'X'));
- BOOST_TEST(test("x", lower[upper[char_]], 'x'));
- BOOST_TEST(test("x", lower[upper[char_('X')]]));
- BOOST_TEST(test("x", lower[upper[char_('x')]]));
-
- BOOST_TEST(test(" ", lower[upper[space]]));
- BOOST_TEST(test("\t", lower[upper[space]], '\t'));
-
- BOOST_TEST(test("X", upper[upper['X']]));
- BOOST_TEST(test("X", upper[upper['x']]));
-
- BOOST_TEST(test("X", upper[upper[char_]], 'X'));
- BOOST_TEST(test("X", upper[upper[char_]], 'x'));
- BOOST_TEST(test("X", upper[upper[char_('X')]]));
- BOOST_TEST(test("X", upper[upper[char_('x')]]));
-
- BOOST_TEST(test(" ", upper[upper[space]]));
- BOOST_TEST(test("\t", upper[upper[space]], '\t'));
- }
-
- {
- using namespace boost::spirit::standard_wide;
-
- BOOST_TEST(test(L"x", lower[L'X']));
- BOOST_TEST(test(L"x", lower[L'x']));
-
- BOOST_TEST(test(L"x", lower[char_], L'X'));
- BOOST_TEST(test(L"x", lower[char_], L'x'));
- BOOST_TEST(test(L"x", lower[char_(L'X')]));
- BOOST_TEST(test(L"x", lower[char_(L'x')]));
-
- BOOST_TEST(test(L" ", lower[space]));
- BOOST_TEST(test(L"\t", lower[space], L'\t'));
-
- BOOST_TEST(test(L"x", lower[lower[L'X']]));
- BOOST_TEST(test(L"x", lower[lower[L'x']]));
-
- BOOST_TEST(test(L"x", lower[lower[char_]], L'X'));
- BOOST_TEST(test(L"x", lower[lower[char_]], L'x'));
- BOOST_TEST(test(L"x", lower[lower[char_(L'X')]]));
- BOOST_TEST(test(L"x", lower[lower[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", lower[lower[space]]));
- BOOST_TEST(test(L"\t", lower[lower[space]], L'\t'));
-
- BOOST_TEST(test(L"X", upper[lower[L'X']]));
- BOOST_TEST(test(L"X", upper[lower[L'x']]));
-
- BOOST_TEST(test(L"X", upper[lower[char_]], L'X'));
- BOOST_TEST(test(L"X", upper[lower[char_]], L'x'));
- BOOST_TEST(test(L"X", upper[lower[char_(L'X')]]));
- BOOST_TEST(test(L"X", upper[lower[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", upper[lower[space]]));
- BOOST_TEST(test(L"\t", upper[lower[space]], L'\t'));
-
- BOOST_TEST(test(L"X", upper[L'X']));
- BOOST_TEST(test(L"X", upper[L'x']));
-
- BOOST_TEST(test(L"X", upper[char_], L'X'));
- BOOST_TEST(test(L"X", upper[char_], L'x'));
- BOOST_TEST(test(L"X", upper[char_(L'X')]));
- BOOST_TEST(test(L"X", upper[char_(L'x')]));
-
- BOOST_TEST(test(L" ", upper[space]));
- BOOST_TEST(test(L"\t", upper[space], L'\t'));
-
- BOOST_TEST(test(L"x", lower[upper[L'X']]));
- BOOST_TEST(test(L"x", lower[upper[L'x']]));
-
- BOOST_TEST(test(L"x", lower[upper[char_]], L'X'));
- BOOST_TEST(test(L"x", lower[upper[char_]], L'x'));
- BOOST_TEST(test(L"x", lower[upper[char_(L'X')]]));
- BOOST_TEST(test(L"x", lower[upper[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", lower[upper[space]]));
- BOOST_TEST(test(L"\t", lower[upper[space]], L'\t'));
-
- BOOST_TEST(test(L"X", upper[upper[L'X']]));
- BOOST_TEST(test(L"X", upper[upper[L'x']]));
-
- BOOST_TEST(test(L"X", upper[upper[char_]], L'X'));
- BOOST_TEST(test(L"X", upper[upper[char_]], L'x'));
- BOOST_TEST(test(L"X", upper[upper[char_(L'X')]]));
- BOOST_TEST(test(L"X", upper[upper[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", upper[upper[space]]));
- BOOST_TEST(test(L"\t", upper[upper[space]], L'\t'));
- }
-
-// needed for VC7.1 only
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("german")
-#endif
- {
- using namespace boost::spirit::iso8859_1;
-
- BOOST_TEST(test("ä", lower['Ä']));
- BOOST_TEST(test("ä", lower['ä']));
-
- BOOST_TEST(test("Ä", upper['Ä']));
- BOOST_TEST(test("Ä", upper['ä']));
- }
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("")
-#endif
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("a1- ", lower["a1- "]));
- BOOST_TEST(test("a1- ", lower["a1- "]));
- BOOST_TEST(test("a1- ", lower["a1- "]));
- BOOST_TEST(test("a1- ", lower["A1- "]));
-
- BOOST_TEST(test("a1- ", lower[string], "a1- "));
- BOOST_TEST(test("a1- ", lower[string], "A1- "));
- BOOST_TEST(test("a1- ", lower[lit("a1- ")]));
- BOOST_TEST(test("a1- ", lower[lit("A1- ")]));
- BOOST_TEST(test("a1- ", lower[string("a1- ")]));
- BOOST_TEST(test("a1- ", lower[string("A1- ")]));
-
- BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
- BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
- BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
- BOOST_TEST(test("a1- ", lower[lower["A1- "]]));
-
- BOOST_TEST(test("a1- ", lower[lower[string]], "a1- "));
- BOOST_TEST(test("a1- ", lower[lower[string]], "A1- "));
- BOOST_TEST(test("a1- ", lower[lower[lit("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[lower[lit("A1- ")]]));
- BOOST_TEST(test("a1- ", lower[lower[string("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[lower[string("A1- ")]]));
-
- BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
- BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
- BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
- BOOST_TEST(test("A1- ", upper[lower["A1- "]]));
-
- BOOST_TEST(test("A1- ", upper[lower[string]], "a1- "));
- BOOST_TEST(test("A1- ", upper[lower[string]], "A1- "));
- BOOST_TEST(test("A1- ", upper[lower[lit("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[lower[lit("A1- ")]]));
- BOOST_TEST(test("A1- ", upper[lower[string("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[lower[string("A1- ")]]));
-
- BOOST_TEST(test("A1- ", upper["a1- "]));
- BOOST_TEST(test("A1- ", upper["a1- "]));
- BOOST_TEST(test("A1- ", upper["a1- "]));
- BOOST_TEST(test("A1- ", upper["A1- "]));
-
- BOOST_TEST(test("A1- ", upper[string], "a1- "));
- BOOST_TEST(test("A1- ", upper[string], "A1- "));
- BOOST_TEST(test("A1- ", upper[lit("a1- ")]));
- BOOST_TEST(test("A1- ", upper[lit("A1- ")]));
-
- BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
- BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
- BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
- BOOST_TEST(test("a1- ", lower[upper["A1- "]]));
-
- BOOST_TEST(test("a1- ", lower[upper[string]], "a1- "));
- BOOST_TEST(test("a1- ", lower[upper[string]], "A1- "));
- BOOST_TEST(test("a1- ", lower[upper[lit("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[upper[lit("A1- ")]]));
- BOOST_TEST(test("a1- ", lower[upper[string("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[upper[string("A1- ")]]));
-
- BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
- BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
- BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
- BOOST_TEST(test("A1- ", upper[upper["A1- "]]));
-
- BOOST_TEST(test("A1- ", upper[upper[string]], "a1- "));
- BOOST_TEST(test("A1- ", upper[upper[string]], "A1- "));
- BOOST_TEST(test("A1- ", upper[upper[lit("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[upper[lit("A1- ")]]));
- BOOST_TEST(test("A1- ", upper[upper[string("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[upper[string("A1- ")]]));
- }
-
-// needed for VC7.1 only
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("german")
-#endif
- {
- using namespace boost::spirit::iso8859_1;
-
- BOOST_TEST(test("ää", lower["Ää"]));
- BOOST_TEST(test("ää", lower["Ää"]));
-
- BOOST_TEST(test("ÄÄ", upper["Ää"]));
- BOOST_TEST(test("ÄÄ", upper["Ää"]));
- }
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("")
-#endif
-
- {
- using namespace boost::spirit::ascii;
- using boost::phoenix::val;
-
- BOOST_TEST(test("x", lower[val('X')]));
- BOOST_TEST(test("x", lower[val('x')]));
- }
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/karma/case_handling1.cpp (from r67483, /trunk/libs/spirit/test/karma/case_handling.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/case_handling.cpp (original)
+++ trunk/libs/spirit/test/karma/case_handling1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -95,191 +95,5 @@
BOOST_TEST(test("\t", upper[upper[space]], '\t'));
}
- {
- using namespace boost::spirit::standard_wide;
-
- BOOST_TEST(test(L"x", lower[L'X']));
- BOOST_TEST(test(L"x", lower[L'x']));
-
- BOOST_TEST(test(L"x", lower[char_], L'X'));
- BOOST_TEST(test(L"x", lower[char_], L'x'));
- BOOST_TEST(test(L"x", lower[char_(L'X')]));
- BOOST_TEST(test(L"x", lower[char_(L'x')]));
-
- BOOST_TEST(test(L" ", lower[space]));
- BOOST_TEST(test(L"\t", lower[space], L'\t'));
-
- BOOST_TEST(test(L"x", lower[lower[L'X']]));
- BOOST_TEST(test(L"x", lower[lower[L'x']]));
-
- BOOST_TEST(test(L"x", lower[lower[char_]], L'X'));
- BOOST_TEST(test(L"x", lower[lower[char_]], L'x'));
- BOOST_TEST(test(L"x", lower[lower[char_(L'X')]]));
- BOOST_TEST(test(L"x", lower[lower[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", lower[lower[space]]));
- BOOST_TEST(test(L"\t", lower[lower[space]], L'\t'));
-
- BOOST_TEST(test(L"X", upper[lower[L'X']]));
- BOOST_TEST(test(L"X", upper[lower[L'x']]));
-
- BOOST_TEST(test(L"X", upper[lower[char_]], L'X'));
- BOOST_TEST(test(L"X", upper[lower[char_]], L'x'));
- BOOST_TEST(test(L"X", upper[lower[char_(L'X')]]));
- BOOST_TEST(test(L"X", upper[lower[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", upper[lower[space]]));
- BOOST_TEST(test(L"\t", upper[lower[space]], L'\t'));
-
- BOOST_TEST(test(L"X", upper[L'X']));
- BOOST_TEST(test(L"X", upper[L'x']));
-
- BOOST_TEST(test(L"X", upper[char_], L'X'));
- BOOST_TEST(test(L"X", upper[char_], L'x'));
- BOOST_TEST(test(L"X", upper[char_(L'X')]));
- BOOST_TEST(test(L"X", upper[char_(L'x')]));
-
- BOOST_TEST(test(L" ", upper[space]));
- BOOST_TEST(test(L"\t", upper[space], L'\t'));
-
- BOOST_TEST(test(L"x", lower[upper[L'X']]));
- BOOST_TEST(test(L"x", lower[upper[L'x']]));
-
- BOOST_TEST(test(L"x", lower[upper[char_]], L'X'));
- BOOST_TEST(test(L"x", lower[upper[char_]], L'x'));
- BOOST_TEST(test(L"x", lower[upper[char_(L'X')]]));
- BOOST_TEST(test(L"x", lower[upper[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", lower[upper[space]]));
- BOOST_TEST(test(L"\t", lower[upper[space]], L'\t'));
-
- BOOST_TEST(test(L"X", upper[upper[L'X']]));
- BOOST_TEST(test(L"X", upper[upper[L'x']]));
-
- BOOST_TEST(test(L"X", upper[upper[char_]], L'X'));
- BOOST_TEST(test(L"X", upper[upper[char_]], L'x'));
- BOOST_TEST(test(L"X", upper[upper[char_(L'X')]]));
- BOOST_TEST(test(L"X", upper[upper[char_(L'x')]]));
-
- BOOST_TEST(test(L" ", upper[upper[space]]));
- BOOST_TEST(test(L"\t", upper[upper[space]], L'\t'));
- }
-
-// needed for VC7.1 only
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("german")
-#endif
- {
- using namespace boost::spirit::iso8859_1;
-
- BOOST_TEST(test("ä", lower['Ä']));
- BOOST_TEST(test("ä", lower['ä']));
-
- BOOST_TEST(test("Ä", upper['Ä']));
- BOOST_TEST(test("Ä", upper['ä']));
- }
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("")
-#endif
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("a1- ", lower["a1- "]));
- BOOST_TEST(test("a1- ", lower["a1- "]));
- BOOST_TEST(test("a1- ", lower["a1- "]));
- BOOST_TEST(test("a1- ", lower["A1- "]));
-
- BOOST_TEST(test("a1- ", lower[string], "a1- "));
- BOOST_TEST(test("a1- ", lower[string], "A1- "));
- BOOST_TEST(test("a1- ", lower[lit("a1- ")]));
- BOOST_TEST(test("a1- ", lower[lit("A1- ")]));
- BOOST_TEST(test("a1- ", lower[string("a1- ")]));
- BOOST_TEST(test("a1- ", lower[string("A1- ")]));
-
- BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
- BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
- BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
- BOOST_TEST(test("a1- ", lower[lower["A1- "]]));
-
- BOOST_TEST(test("a1- ", lower[lower[string]], "a1- "));
- BOOST_TEST(test("a1- ", lower[lower[string]], "A1- "));
- BOOST_TEST(test("a1- ", lower[lower[lit("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[lower[lit("A1- ")]]));
- BOOST_TEST(test("a1- ", lower[lower[string("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[lower[string("A1- ")]]));
-
- BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
- BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
- BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
- BOOST_TEST(test("A1- ", upper[lower["A1- "]]));
-
- BOOST_TEST(test("A1- ", upper[lower[string]], "a1- "));
- BOOST_TEST(test("A1- ", upper[lower[string]], "A1- "));
- BOOST_TEST(test("A1- ", upper[lower[lit("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[lower[lit("A1- ")]]));
- BOOST_TEST(test("A1- ", upper[lower[string("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[lower[string("A1- ")]]));
-
- BOOST_TEST(test("A1- ", upper["a1- "]));
- BOOST_TEST(test("A1- ", upper["a1- "]));
- BOOST_TEST(test("A1- ", upper["a1- "]));
- BOOST_TEST(test("A1- ", upper["A1- "]));
-
- BOOST_TEST(test("A1- ", upper[string], "a1- "));
- BOOST_TEST(test("A1- ", upper[string], "A1- "));
- BOOST_TEST(test("A1- ", upper[lit("a1- ")]));
- BOOST_TEST(test("A1- ", upper[lit("A1- ")]));
-
- BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
- BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
- BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
- BOOST_TEST(test("a1- ", lower[upper["A1- "]]));
-
- BOOST_TEST(test("a1- ", lower[upper[string]], "a1- "));
- BOOST_TEST(test("a1- ", lower[upper[string]], "A1- "));
- BOOST_TEST(test("a1- ", lower[upper[lit("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[upper[lit("A1- ")]]));
- BOOST_TEST(test("a1- ", lower[upper[string("a1- ")]]));
- BOOST_TEST(test("a1- ", lower[upper[string("A1- ")]]));
-
- BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
- BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
- BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
- BOOST_TEST(test("A1- ", upper[upper["A1- "]]));
-
- BOOST_TEST(test("A1- ", upper[upper[string]], "a1- "));
- BOOST_TEST(test("A1- ", upper[upper[string]], "A1- "));
- BOOST_TEST(test("A1- ", upper[upper[lit("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[upper[lit("A1- ")]]));
- BOOST_TEST(test("A1- ", upper[upper[string("a1- ")]]));
- BOOST_TEST(test("A1- ", upper[upper[string("A1- ")]]));
- }
-
-// needed for VC7.1 only
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("german")
-#endif
- {
- using namespace boost::spirit::iso8859_1;
-
- BOOST_TEST(test("ää", lower["Ää"]));
- BOOST_TEST(test("ää", lower["Ää"]));
-
- BOOST_TEST(test("ÄÄ", upper["Ää"]));
- BOOST_TEST(test("ÄÄ", upper["Ää"]));
- }
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("")
-#endif
-
- {
- using namespace boost::spirit::ascii;
- using boost::phoenix::val;
-
- BOOST_TEST(test("x", lower[val('X')]));
- BOOST_TEST(test("x", lower[val('x')]));
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/case_handling2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/case_handling2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,124 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+// this file intentionally contains non-ascii characters
+// boostinspect:noascii
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+
+ {
+ using namespace boost::spirit::standard_wide;
+
+ BOOST_TEST(test(L"x", lower[L'X']));
+ BOOST_TEST(test(L"x", lower[L'x']));
+
+ BOOST_TEST(test(L"x", lower[char_], L'X'));
+ BOOST_TEST(test(L"x", lower[char_], L'x'));
+ BOOST_TEST(test(L"x", lower[char_(L'X')]));
+ BOOST_TEST(test(L"x", lower[char_(L'x')]));
+
+ BOOST_TEST(test(L" ", lower[space]));
+ BOOST_TEST(test(L"\t", lower[space], L'\t'));
+
+ BOOST_TEST(test(L"x", lower[lower[L'X']]));
+ BOOST_TEST(test(L"x", lower[lower[L'x']]));
+
+ BOOST_TEST(test(L"x", lower[lower[char_]], L'X'));
+ BOOST_TEST(test(L"x", lower[lower[char_]], L'x'));
+ BOOST_TEST(test(L"x", lower[lower[char_(L'X')]]));
+ BOOST_TEST(test(L"x", lower[lower[char_(L'x')]]));
+
+ BOOST_TEST(test(L" ", lower[lower[space]]));
+ BOOST_TEST(test(L"\t", lower[lower[space]], L'\t'));
+
+ BOOST_TEST(test(L"X", upper[lower[L'X']]));
+ BOOST_TEST(test(L"X", upper[lower[L'x']]));
+
+ BOOST_TEST(test(L"X", upper[lower[char_]], L'X'));
+ BOOST_TEST(test(L"X", upper[lower[char_]], L'x'));
+ BOOST_TEST(test(L"X", upper[lower[char_(L'X')]]));
+ BOOST_TEST(test(L"X", upper[lower[char_(L'x')]]));
+
+ BOOST_TEST(test(L" ", upper[lower[space]]));
+ BOOST_TEST(test(L"\t", upper[lower[space]], L'\t'));
+
+ BOOST_TEST(test(L"X", upper[L'X']));
+ BOOST_TEST(test(L"X", upper[L'x']));
+
+ BOOST_TEST(test(L"X", upper[char_], L'X'));
+ BOOST_TEST(test(L"X", upper[char_], L'x'));
+ BOOST_TEST(test(L"X", upper[char_(L'X')]));
+ BOOST_TEST(test(L"X", upper[char_(L'x')]));
+
+ BOOST_TEST(test(L" ", upper[space]));
+ BOOST_TEST(test(L"\t", upper[space], L'\t'));
+
+ BOOST_TEST(test(L"x", lower[upper[L'X']]));
+ BOOST_TEST(test(L"x", lower[upper[L'x']]));
+
+ BOOST_TEST(test(L"x", lower[upper[char_]], L'X'));
+ BOOST_TEST(test(L"x", lower[upper[char_]], L'x'));
+ BOOST_TEST(test(L"x", lower[upper[char_(L'X')]]));
+ BOOST_TEST(test(L"x", lower[upper[char_(L'x')]]));
+
+ BOOST_TEST(test(L" ", lower[upper[space]]));
+ BOOST_TEST(test(L"\t", lower[upper[space]], L'\t'));
+
+ BOOST_TEST(test(L"X", upper[upper[L'X']]));
+ BOOST_TEST(test(L"X", upper[upper[L'x']]));
+
+ BOOST_TEST(test(L"X", upper[upper[char_]], L'X'));
+ BOOST_TEST(test(L"X", upper[upper[char_]], L'x'));
+ BOOST_TEST(test(L"X", upper[upper[char_(L'X')]]));
+ BOOST_TEST(test(L"X", upper[upper[char_(L'x')]]));
+
+ BOOST_TEST(test(L" ", upper[upper[space]]));
+ BOOST_TEST(test(L"\t", upper[upper[space]], L'\t'));
+ }
+
+// needed for VC7.1 only
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+#pragma setlocale("german")
+#endif
+ {
+ using namespace boost::spirit::iso8859_1;
+
+ BOOST_TEST(test("ää", lower["Ää"]));
+ BOOST_TEST(test("ää", lower["Ää"]));
+
+ BOOST_TEST(test("ÄÄ", upper["Ää"]));
+ BOOST_TEST(test("ÄÄ", upper["Ää"]));
+ }
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+#pragma setlocale("")
+#endif
+
+ {
+ using namespace boost::spirit::ascii;
+ using boost::phoenix::val;
+
+ BOOST_TEST(test("x", lower[val('X')]));
+ BOOST_TEST(test("x", lower[val('x')]));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/karma/case_handling3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/case_handling3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,120 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+// this file intentionally contains non-ascii characters
+// boostinspect:noascii
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+
+// needed for VC7.1 only
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+#pragma setlocale("german")
+#endif
+ {
+ using namespace boost::spirit::iso8859_1;
+
+ BOOST_TEST(test("ä", lower['Ä']));
+ BOOST_TEST(test("ä", lower['ä']));
+
+ BOOST_TEST(test("Ä", upper['Ä']));
+ BOOST_TEST(test("Ä", upper['ä']));
+ }
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+#pragma setlocale("")
+#endif
+
+ {
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test("a1- ", lower["a1- "]));
+ BOOST_TEST(test("a1- ", lower["a1- "]));
+ BOOST_TEST(test("a1- ", lower["a1- "]));
+ BOOST_TEST(test("a1- ", lower["A1- "]));
+
+ BOOST_TEST(test("a1- ", lower[string], "a1- "));
+ BOOST_TEST(test("a1- ", lower[string], "A1- "));
+ BOOST_TEST(test("a1- ", lower[lit("a1- ")]));
+ BOOST_TEST(test("a1- ", lower[lit("A1- ")]));
+ BOOST_TEST(test("a1- ", lower[string("a1- ")]));
+ BOOST_TEST(test("a1- ", lower[string("A1- ")]));
+
+ BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
+ BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
+ BOOST_TEST(test("a1- ", lower[lower["a1- "]]));
+ BOOST_TEST(test("a1- ", lower[lower["A1- "]]));
+
+ BOOST_TEST(test("a1- ", lower[lower[string]], "a1- "));
+ BOOST_TEST(test("a1- ", lower[lower[string]], "A1- "));
+ BOOST_TEST(test("a1- ", lower[lower[lit("a1- ")]]));
+ BOOST_TEST(test("a1- ", lower[lower[lit("A1- ")]]));
+ BOOST_TEST(test("a1- ", lower[lower[string("a1- ")]]));
+ BOOST_TEST(test("a1- ", lower[lower[string("A1- ")]]));
+
+ BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
+ BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
+ BOOST_TEST(test("A1- ", upper[lower["a1- "]]));
+ BOOST_TEST(test("A1- ", upper[lower["A1- "]]));
+
+ BOOST_TEST(test("A1- ", upper[lower[string]], "a1- "));
+ BOOST_TEST(test("A1- ", upper[lower[string]], "A1- "));
+ BOOST_TEST(test("A1- ", upper[lower[lit("a1- ")]]));
+ BOOST_TEST(test("A1- ", upper[lower[lit("A1- ")]]));
+ BOOST_TEST(test("A1- ", upper[lower[string("a1- ")]]));
+ BOOST_TEST(test("A1- ", upper[lower[string("A1- ")]]));
+
+ BOOST_TEST(test("A1- ", upper["a1- "]));
+ BOOST_TEST(test("A1- ", upper["a1- "]));
+ BOOST_TEST(test("A1- ", upper["a1- "]));
+ BOOST_TEST(test("A1- ", upper["A1- "]));
+
+ BOOST_TEST(test("A1- ", upper[string], "a1- "));
+ BOOST_TEST(test("A1- ", upper[string], "A1- "));
+ BOOST_TEST(test("A1- ", upper[lit("a1- ")]));
+ BOOST_TEST(test("A1- ", upper[lit("A1- ")]));
+
+ BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
+ BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
+ BOOST_TEST(test("a1- ", lower[upper["a1- "]]));
+ BOOST_TEST(test("a1- ", lower[upper["A1- "]]));
+
+ BOOST_TEST(test("a1- ", lower[upper[string]], "a1- "));
+ BOOST_TEST(test("a1- ", lower[upper[string]], "A1- "));
+ BOOST_TEST(test("a1- ", lower[upper[lit("a1- ")]]));
+ BOOST_TEST(test("a1- ", lower[upper[lit("A1- ")]]));
+ BOOST_TEST(test("a1- ", lower[upper[string("a1- ")]]));
+ BOOST_TEST(test("a1- ", lower[upper[string("A1- ")]]));
+
+ BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
+ BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
+ BOOST_TEST(test("A1- ", upper[upper["a1- "]]));
+ BOOST_TEST(test("A1- ", upper[upper["A1- "]]));
+
+ BOOST_TEST(test("A1- ", upper[upper[string]], "a1- "));
+ BOOST_TEST(test("A1- ", upper[upper[string]], "A1- "));
+ BOOST_TEST(test("A1- ", upper[upper[lit("a1- ")]]));
+ BOOST_TEST(test("A1- ", upper[upper[lit("A1- ")]]));
+ BOOST_TEST(test("A1- ", upper[upper[string("a1- ")]]));
+ BOOST_TEST(test("A1- ", upper[upper[string("A1- ")]]));
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/karma/char.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/char.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,306 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-//#define KARMA_FAIL_COMPILATION
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/karma_phoenix_attributes.hpp>
-
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using namespace boost::spirit;
- using namespace boost::phoenix;
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("x", 'x'));
- BOOST_TEST(test(L"x", L'x'));
- BOOST_TEST(!test("x", 'y'));
- BOOST_TEST(!test(L"x", L'y'));
-
- BOOST_TEST(test("x", "x"));
- BOOST_TEST(test(L"x", L"x"));
- BOOST_TEST(!test("x", "y"));
- BOOST_TEST(!test(L"x", L"y"));
-
- BOOST_TEST(test("x", char_, 'x'));
- BOOST_TEST(test(L"x", char_, L'x'));
- BOOST_TEST(!test("x", char_, 'y'));
- BOOST_TEST(!test(L"x", char_, L'y'));
-
- BOOST_TEST(test("x", char_('x')));
- BOOST_TEST(!test("x", char_('y')));
-
- BOOST_TEST(test("x", char_('x'), 'x'));
- BOOST_TEST(!test("", char_('y'), 'x'));
-
- BOOST_TEST(test("x", char_("x")));
-
- BOOST_TEST(test("a", char_('a', 'z'), 'a'));
- BOOST_TEST(test("b", char_('a', 'z'), 'b'));
- BOOST_TEST(!test("", char_('a', 'z'), 'A'));
-
- BOOST_TEST(test("a", char_("a-z"), 'a'));
- BOOST_TEST(test("b", char_("a-z"), 'b'));
- BOOST_TEST(!test("", char_("a-z"), 'A'));
-
-#if defined(KARMA_FAIL_COMPILATION)
- BOOST_TEST(test("x", char_)); // anychar without a parameter doesn't make any sense
- BOOST_TEST(test("", char_('a', 'z'))); // char sets without attribute neither
-#endif
-
- BOOST_TEST(!test("", ~char_('x')));
-
- BOOST_TEST(!test("", ~char_('x'), 'x'));
- BOOST_TEST(test("x", ~char_('y'), 'x'));
-
- BOOST_TEST(!test("", ~char_("x")));
-
- BOOST_TEST(!test("", ~char_('a', 'z'), 'a'));
- BOOST_TEST(!test("", ~char_('a', 'z'), 'b'));
- BOOST_TEST(test("A", ~char_('a', 'z'), 'A'));
-
- BOOST_TEST(!test("", ~char_("a-z"), 'a'));
- BOOST_TEST(!test("", ~char_("a-z"), 'b'));
- BOOST_TEST(test("A", ~char_("a-z"), 'A'));
-
- BOOST_TEST(test("x", ~~char_('x')));
- BOOST_TEST(!test("x", ~~char_('y')));
-
- BOOST_TEST(test("x", ~~char_('x'), 'x'));
- BOOST_TEST(!test("", ~~char_('y'), 'x'));
-
- BOOST_TEST(test("x", ~~char_("x")));
-
- BOOST_TEST(test("a", ~~char_('a', 'z'), 'a'));
- BOOST_TEST(test("b", ~~char_('a', 'z'), 'b'));
- BOOST_TEST(!test("", ~~char_('a', 'z'), 'A'));
-
- BOOST_TEST(test("a", ~~char_("a-z"), 'a'));
- BOOST_TEST(test("b", ~~char_("a-z"), 'b'));
- BOOST_TEST(!test("", ~~char_("a-z"), 'A'));
- }
-
- {
- using namespace boost::spirit::standard_wide;
-
- BOOST_TEST(test(L"x", 'x'));
- BOOST_TEST(test(L"x", L'x'));
- BOOST_TEST(!test(L"x", 'y'));
- BOOST_TEST(!test(L"x", L'y'));
-
- BOOST_TEST(test(L"x", "x"));
- BOOST_TEST(test(L"x", L"x"));
- BOOST_TEST(!test(L"x", "y"));
- BOOST_TEST(!test(L"x", L"y"));
-
- BOOST_TEST(test(L"x", char_, 'x'));
- BOOST_TEST(test(L"x", char_, L'x'));
- BOOST_TEST(!test(L"x", char_, 'y'));
- BOOST_TEST(!test(L"x", char_, L'y'));
-
- BOOST_TEST(test(L"x", char_('x')));
- BOOST_TEST(test(L"x", char_(L'x')));
- BOOST_TEST(!test(L"x", char_('y')));
- BOOST_TEST(!test(L"x", char_(L'y')));
-
- BOOST_TEST(test(L"x", char_(L'x'), L'x'));
- BOOST_TEST(!test(L"", char_('y'), L'x'));
-
- BOOST_TEST(test(L"x", char_(L"x")));
-
- BOOST_TEST(test("a", char_("a", "z"), 'a'));
- BOOST_TEST(test(L"a", char_(L"a", L"z"), L'a'));
-
-#if defined(KARMA_FAIL_COMPILATION)
- BOOST_TEST(test("x", char_)); // anychar without a parameter doesn't make any sense
-#endif
-
- BOOST_TEST(!test(L"", ~char_('x')));
- BOOST_TEST(!test(L"", ~char_(L'x')));
-
- BOOST_TEST(!test(L"", ~char_(L'x'), L'x'));
- BOOST_TEST(test(L"x", ~char_('y'), L'x'));
-
- BOOST_TEST(!test(L"", ~char_(L"x")));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test(" ", space));
- BOOST_TEST(test(L" ", space));
- BOOST_TEST(!test("\t", space));
- BOOST_TEST(!test(L"\t", space));
-
- BOOST_TEST(test(" ", space, ' '));
- BOOST_TEST(test(L" ", space, L' '));
- BOOST_TEST(test("\t", space, '\t'));
- BOOST_TEST(test(L"\t", space, L'\t'));
-
- BOOST_TEST(!test("", space, 'x'));
- BOOST_TEST(!test(L"", space, L'x'));
-
- BOOST_TEST(!test(" ", ~space, ' '));
- BOOST_TEST(!test(L" ", ~space, L' '));
-
- BOOST_TEST(test("x", ~space, 'x'));
- BOOST_TEST(test(L"x", ~space, L'x'));
- }
-
- {
- using namespace boost::spirit::standard_wide;
-
- BOOST_TEST(test(" ", space));
- BOOST_TEST(test(L" ", space));
- BOOST_TEST(!test("\t", space));
- BOOST_TEST(!test(L"\t", space));
-
- BOOST_TEST(test(" ", space, ' '));
- BOOST_TEST(test(L" ", space, L' '));
- BOOST_TEST(test("\t", space, '\t'));
- BOOST_TEST(test(L"\t", space, L'\t'));
-
- BOOST_TEST(!test("", space, 'x'));
- BOOST_TEST(!test(L"", space, L'x'));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test_delimited("x ", 'x', ' '));
- BOOST_TEST(test_delimited(L"x ", L'x', L' '));
- BOOST_TEST(!test_delimited("x ", 'y', ' '));
- BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
-
- BOOST_TEST(test_delimited("x ", 'x', ' '));
- BOOST_TEST(test_delimited(L"x ", L'x', L' '));
- BOOST_TEST(!test_delimited("x ", 'y', ' '));
- BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
-
- BOOST_TEST(test_delimited("x ", char_, 'x', ' '));
- BOOST_TEST(test_delimited(L"x ", char_, L'x', L' '));
- BOOST_TEST(!test_delimited("x ", char_, 'y', ' '));
- BOOST_TEST(!test_delimited(L"x ", char_, L'y', L' '));
-
- BOOST_TEST(test_delimited("x ", char_('x'), ' '));
- BOOST_TEST(!test_delimited("x ", char_('y'), ' '));
-
- BOOST_TEST(test_delimited("x ", char_('x'), 'x', ' '));
- BOOST_TEST(!test_delimited("", char_('y'), 'x', ' '));
-
- BOOST_TEST(test_delimited("x ", char_("x"), ' '));
-
-#if defined(KARMA_FAIL_COMPILATION)
- BOOST_TEST(test_delimited("x ", char_, ' ')); // anychar without a parameter doesn't make any sense
-#endif
- }
-
- { // pre-delimiting
- {
- std::string generated;
- std::back_insert_iterator<std::string> it(generated);
- BOOST_TEST(karma::generate_delimited(it, '_', '^'
- , karma::delimit_flag::predelimit));
- BOOST_TEST(generated == "^_^");
- }
- {
- using namespace boost::spirit::standard_wide;
- std::basic_string<wchar_t> generated;
- std::back_insert_iterator<std::basic_string<wchar_t> > it(generated);
- BOOST_TEST(karma::generate_delimited(it, char_, L'.'
- , karma::delimit_flag::predelimit, L'x'));
- BOOST_TEST(generated == L".x.");
- }
- }
-
- // action tests
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("x", char_[_1 = val('x')]));
- BOOST_TEST(!test("x", char_[_1 = val('y')]));
- }
-
- { // lazy chars
- namespace ascii = boost::spirit::ascii;
- namespace wide = boost::spirit::standard_wide;
-
- using namespace boost::phoenix;
-
- BOOST_TEST((test("x", ascii::char_(val('x')))));
- BOOST_TEST((test(L"x", wide::char_(val(L'x')))));
-
- BOOST_TEST((test("x", ascii::char_(val('x')), 'x')));
- BOOST_TEST((test(L"x", wide::char_(val(L'x')), L'x')));
-
- BOOST_TEST((!test("", ascii::char_(val('y')), 'x')));
- BOOST_TEST((!test(L"", wide::char_(val(L'y')), L'x')));
- }
-
- // we can pass optionals as attributes to any generator
- {
- namespace ascii = boost::spirit::ascii;
- namespace wide = boost::spirit::standard_wide;
-
- boost::optional<char> v;
- boost::optional<wchar_t> w;
-
- BOOST_TEST(!test("", ascii::char_, v));
- BOOST_TEST(!test(L"", wide::char_, w));
-
- BOOST_TEST(!test("", ascii::char_('x'), v));
- BOOST_TEST(!test(L"", wide::char_(L'x'), w));
- }
-
- {
- namespace ascii = boost::spirit::ascii;
- namespace wide = boost::spirit::standard_wide;
-
- boost::optional<char> v ('x');
- boost::optional<wchar_t> w (L'x');
-
- BOOST_TEST(test("x", ascii::char_, v));
- BOOST_TEST(test(L"x", wide::char_, w));
- BOOST_TEST(test("x", ascii::char_('x'), v));
- BOOST_TEST(test(L"x", wide::char_(L'x'), w));
- BOOST_TEST(!test("", ascii::char_('y'), v));
- BOOST_TEST(!test(L"", wide::char_(L'y'), w));
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- // yes, we can use phoenix expressions as attributes as well
- // but only if we include karma_phoenix_attributes.hpp
- {
- namespace ascii = boost::spirit::ascii;
- namespace phoenix = boost::phoenix;
-
- BOOST_TEST(test("x", ascii::char_, phoenix::val('x')));
-
- char c = 'x';
- BOOST_TEST(test("x", ascii::char_, phoenix::ref(c)));
- BOOST_TEST(test("y", ascii::char_, ++phoenix::ref(c)));
- }
-#endif
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/karma/char1.cpp (from r67483, /trunk/libs/spirit/test/karma/char.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/char.cpp (original)
+++ trunk/libs/spirit/test/karma/char1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -143,103 +143,6 @@
BOOST_TEST(!test(L"", ~char_(L"x")));
}
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test(" ", space));
- BOOST_TEST(test(L" ", space));
- BOOST_TEST(!test("\t", space));
- BOOST_TEST(!test(L"\t", space));
-
- BOOST_TEST(test(" ", space, ' '));
- BOOST_TEST(test(L" ", space, L' '));
- BOOST_TEST(test("\t", space, '\t'));
- BOOST_TEST(test(L"\t", space, L'\t'));
-
- BOOST_TEST(!test("", space, 'x'));
- BOOST_TEST(!test(L"", space, L'x'));
-
- BOOST_TEST(!test(" ", ~space, ' '));
- BOOST_TEST(!test(L" ", ~space, L' '));
-
- BOOST_TEST(test("x", ~space, 'x'));
- BOOST_TEST(test(L"x", ~space, L'x'));
- }
-
- {
- using namespace boost::spirit::standard_wide;
-
- BOOST_TEST(test(" ", space));
- BOOST_TEST(test(L" ", space));
- BOOST_TEST(!test("\t", space));
- BOOST_TEST(!test(L"\t", space));
-
- BOOST_TEST(test(" ", space, ' '));
- BOOST_TEST(test(L" ", space, L' '));
- BOOST_TEST(test("\t", space, '\t'));
- BOOST_TEST(test(L"\t", space, L'\t'));
-
- BOOST_TEST(!test("", space, 'x'));
- BOOST_TEST(!test(L"", space, L'x'));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test_delimited("x ", 'x', ' '));
- BOOST_TEST(test_delimited(L"x ", L'x', L' '));
- BOOST_TEST(!test_delimited("x ", 'y', ' '));
- BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
-
- BOOST_TEST(test_delimited("x ", 'x', ' '));
- BOOST_TEST(test_delimited(L"x ", L'x', L' '));
- BOOST_TEST(!test_delimited("x ", 'y', ' '));
- BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
-
- BOOST_TEST(test_delimited("x ", char_, 'x', ' '));
- BOOST_TEST(test_delimited(L"x ", char_, L'x', L' '));
- BOOST_TEST(!test_delimited("x ", char_, 'y', ' '));
- BOOST_TEST(!test_delimited(L"x ", char_, L'y', L' '));
-
- BOOST_TEST(test_delimited("x ", char_('x'), ' '));
- BOOST_TEST(!test_delimited("x ", char_('y'), ' '));
-
- BOOST_TEST(test_delimited("x ", char_('x'), 'x', ' '));
- BOOST_TEST(!test_delimited("", char_('y'), 'x', ' '));
-
- BOOST_TEST(test_delimited("x ", char_("x"), ' '));
-
-#if defined(KARMA_FAIL_COMPILATION)
- BOOST_TEST(test_delimited("x ", char_, ' ')); // anychar without a parameter doesn't make any sense
-#endif
- }
-
- { // pre-delimiting
- {
- std::string generated;
- std::back_insert_iterator<std::string> it(generated);
- BOOST_TEST(karma::generate_delimited(it, '_', '^'
- , karma::delimit_flag::predelimit));
- BOOST_TEST(generated == "^_^");
- }
- {
- using namespace boost::spirit::standard_wide;
- std::basic_string<wchar_t> generated;
- std::back_insert_iterator<std::basic_string<wchar_t> > it(generated);
- BOOST_TEST(karma::generate_delimited(it, char_, L'.'
- , karma::delimit_flag::predelimit, L'x'));
- BOOST_TEST(generated == L".x.");
- }
- }
-
- // action tests
- {
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("x", char_[_1 = val('x')]));
- BOOST_TEST(!test("x", char_[_1 = val('y')]));
- }
-
{ // lazy chars
namespace ascii = boost::spirit::ascii;
namespace wide = boost::spirit::standard_wide;
@@ -271,36 +174,5 @@
BOOST_TEST(!test(L"", wide::char_(L'x'), w));
}
- {
- namespace ascii = boost::spirit::ascii;
- namespace wide = boost::spirit::standard_wide;
-
- boost::optional<char> v ('x');
- boost::optional<wchar_t> w (L'x');
-
- BOOST_TEST(test("x", ascii::char_, v));
- BOOST_TEST(test(L"x", wide::char_, w));
- BOOST_TEST(test("x", ascii::char_('x'), v));
- BOOST_TEST(test(L"x", wide::char_(L'x'), w));
- BOOST_TEST(!test("", ascii::char_('y'), v));
- BOOST_TEST(!test(L"", wide::char_(L'y'), w));
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- // yes, we can use phoenix expressions as attributes as well
- // but only if we include karma_phoenix_attributes.hpp
- {
- namespace ascii = boost::spirit::ascii;
- namespace phoenix = boost::phoenix;
-
- BOOST_TEST(test("x", ascii::char_, phoenix::val('x')));
-
- char c = 'x';
- BOOST_TEST(test("x", ascii::char_, phoenix::ref(c)));
- BOOST_TEST(test("y", ascii::char_, ++phoenix::ref(c)));
- }
-#endif
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/char2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/char2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,160 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+//#define KARMA_FAIL_COMPILATION
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+ using namespace boost::phoenix;
+
+ {
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test(" ", space));
+ BOOST_TEST(test(L" ", space));
+ BOOST_TEST(!test("\t", space));
+ BOOST_TEST(!test(L"\t", space));
+
+ BOOST_TEST(test(" ", space, ' '));
+ BOOST_TEST(test(L" ", space, L' '));
+ BOOST_TEST(test("\t", space, '\t'));
+ BOOST_TEST(test(L"\t", space, L'\t'));
+
+ BOOST_TEST(!test("", space, 'x'));
+ BOOST_TEST(!test(L"", space, L'x'));
+
+ BOOST_TEST(!test(" ", ~space, ' '));
+ BOOST_TEST(!test(L" ", ~space, L' '));
+
+ BOOST_TEST(test("x", ~space, 'x'));
+ BOOST_TEST(test(L"x", ~space, L'x'));
+ }
+
+ {
+ using namespace boost::spirit::standard_wide;
+
+ BOOST_TEST(test(" ", space));
+ BOOST_TEST(test(L" ", space));
+ BOOST_TEST(!test("\t", space));
+ BOOST_TEST(!test(L"\t", space));
+
+ BOOST_TEST(test(" ", space, ' '));
+ BOOST_TEST(test(L" ", space, L' '));
+ BOOST_TEST(test("\t", space, '\t'));
+ BOOST_TEST(test(L"\t", space, L'\t'));
+
+ BOOST_TEST(!test("", space, 'x'));
+ BOOST_TEST(!test(L"", space, L'x'));
+ }
+
+ {
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test_delimited("x ", 'x', ' '));
+ BOOST_TEST(test_delimited(L"x ", L'x', L' '));
+ BOOST_TEST(!test_delimited("x ", 'y', ' '));
+ BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
+
+ BOOST_TEST(test_delimited("x ", 'x', ' '));
+ BOOST_TEST(test_delimited(L"x ", L'x', L' '));
+ BOOST_TEST(!test_delimited("x ", 'y', ' '));
+ BOOST_TEST(!test_delimited(L"x ", L'y', L' '));
+
+ BOOST_TEST(test_delimited("x ", char_, 'x', ' '));
+ BOOST_TEST(test_delimited(L"x ", char_, L'x', L' '));
+ BOOST_TEST(!test_delimited("x ", char_, 'y', ' '));
+ BOOST_TEST(!test_delimited(L"x ", char_, L'y', L' '));
+
+ BOOST_TEST(test_delimited("x ", char_('x'), ' '));
+ BOOST_TEST(!test_delimited("x ", char_('y'), ' '));
+
+ BOOST_TEST(test_delimited("x ", char_('x'), 'x', ' '));
+ BOOST_TEST(!test_delimited("", char_('y'), 'x', ' '));
+
+ BOOST_TEST(test_delimited("x ", char_("x"), ' '));
+
+#if defined(KARMA_FAIL_COMPILATION)
+ BOOST_TEST(test_delimited("x ", char_, ' ')); // anychar without a parameter doesn't make any sense
+#endif
+ }
+
+ { // pre-delimiting
+ {
+ std::string generated;
+ std::back_insert_iterator<std::string> it(generated);
+ BOOST_TEST(karma::generate_delimited(it, '_', '^'
+ , karma::delimit_flag::predelimit));
+ BOOST_TEST(generated == "^_^");
+ }
+ {
+ using namespace boost::spirit::standard_wide;
+ std::basic_string<wchar_t> generated;
+ std::back_insert_iterator<std::basic_string<wchar_t> > it(generated);
+ BOOST_TEST(karma::generate_delimited(it, char_, L'.'
+ , karma::delimit_flag::predelimit, L'x'));
+ BOOST_TEST(generated == L".x.");
+ }
+ }
+
+ // action tests
+ {
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test("x", char_[_1 = val('x')]));
+ BOOST_TEST(!test("x", char_[_1 = val('y')]));
+ }
+
+// we support Phoenix attributes only starting with V2.2
+#if SPIRIT_VERSION >= 0x2020
+ // yes, we can use phoenix expressions as attributes as well
+ // but only if we include karma_phoenix_attributes.hpp
+ {
+ namespace ascii = boost::spirit::ascii;
+ namespace phoenix = boost::phoenix;
+
+ BOOST_TEST(test("x", ascii::char_, phoenix::val('x')));
+
+ char c = 'x';
+ BOOST_TEST(test("x", ascii::char_, phoenix::ref(c)));
+ BOOST_TEST(test("y", ascii::char_, ++phoenix::ref(c)));
+ }
+#endif
+
+ {
+ namespace ascii = boost::spirit::ascii;
+ namespace wide = boost::spirit::standard_wide;
+
+ boost::optional<char> v ('x');
+ boost::optional<wchar_t> w (L'x');
+
+ BOOST_TEST(test("x", ascii::char_, v));
+ BOOST_TEST(test(L"x", wide::char_, w));
+ BOOST_TEST(test("x", ascii::char_('x'), v));
+ BOOST_TEST(test(L"x", wide::char_(L'x'), w));
+ BOOST_TEST(!test("", ascii::char_('y'), v));
+ BOOST_TEST(!test(L"", wide::char_(L'y'), w));
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/karma/int_numerics.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/int_numerics.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,390 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-//#define KARMA_FAIL_COMPILATION
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/mpl/vector.hpp>
-#include <boost/mpl/for_each.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/bool.hpp>
-
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/karma_phoenix_attributes.hpp>
-
-#include <limits>
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-struct test_minmax
-{
- template <typename T>
- void operator()(T) const
- {
- using namespace boost::spirit;
- using namespace boost::phoenix;
-
- T minval = (std::numeric_limits<T>::min)();
- T maxval = (std::numeric_limits<T>::max)();
-
- std::string expected_minval = boost::lexical_cast<std::string>(minval);
- std::string expected_maxval = boost::lexical_cast<std::string>(maxval);
-
- // create a correct generator type from the given integer type
- typedef typename
- boost::mpl::if_<
- boost::mpl::bool_<std::numeric_limits<T>::is_signed>,
- karma::int_generator<T>,
- karma::uint_generator<T>
- >::type
- int_generator_type;
-
- int_generator_type const gen = int_generator_type();
-
- BOOST_TEST(test(expected_maxval, gen, maxval));
- BOOST_TEST(test(expected_minval, gen, minval));
- BOOST_TEST(test(expected_maxval, gen(maxval)));
- BOOST_TEST(test(expected_minval, gen(minval)));
- BOOST_TEST(test(expected_maxval, gen(maxval), maxval));
- BOOST_TEST(test(expected_minval, gen(minval), minval));
- BOOST_TEST(!test("", gen(maxval), maxval-1));
- BOOST_TEST(!test("", gen(minval), minval+1));
- BOOST_TEST(test(expected_maxval, lit(maxval)));
- BOOST_TEST(test(expected_minval, lit(minval)));
-
- BOOST_TEST(test_delimited(expected_maxval + " ", gen, maxval, char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", gen, minval, char(' ')));
- BOOST_TEST(test_delimited(expected_maxval + " ", gen(maxval), char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", gen(minval), char(' ')));
- BOOST_TEST(test_delimited(expected_maxval + " ", gen(maxval), maxval, char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", gen(minval), minval, char(' ')));
- BOOST_TEST(!test_delimited("", gen(maxval), maxval-1, char(' ')));
- BOOST_TEST(!test_delimited("", gen(minval), minval+1, char(' ')));
- BOOST_TEST(test_delimited(expected_maxval + " ", lit(maxval), char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", lit(minval), char(' ')));
-
- // action tests
- BOOST_TEST(test(expected_maxval, gen[_1 = val(maxval)]));
- BOOST_TEST(test(expected_minval, gen[_1 = val(minval)]));
-
- // optional tests
- boost::optional<T> optmin, optmax(maxval);
-
- BOOST_TEST(!test("", gen, optmin));
- BOOST_TEST(!test("", gen(minval), optmin));
-
- optmin = minval;
- BOOST_TEST(test(expected_minval, gen, optmin));
- BOOST_TEST(test(expected_maxval, gen, optmax));
- BOOST_TEST(test(expected_minval, gen(minval), optmin));
- BOOST_TEST(test(expected_maxval, gen(maxval), optmax));
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- // Phoenix expression tests (only supported while including
- // karma_phoenix_attributes.hpp
- namespace phoenix = boost::phoenix;
-
- BOOST_TEST(test("1", gen, phoenix::val(1)));
-
- T val = 1;
- BOOST_TEST(test("1", gen, phoenix::ref(val)));
- BOOST_TEST(test("2", gen, ++phoenix::ref(val)));
-#endif
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using namespace boost::spirit;
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- // this is currently ambiguous with character literals
-// BOOST_TEST(test("0", 0));
-// BOOST_TEST(test("123", 123));
-// BOOST_TEST(test("-123", -123));
-
- BOOST_TEST(test("0", int_, 0));
- BOOST_TEST(test("123", int_, 123));
- BOOST_TEST(test("-123", int_, -123));
-
- BOOST_TEST(test_delimited("0 ", int_, 0, char_(' ')));
- BOOST_TEST(test_delimited("123 ", int_, 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", int_, -123, char_(' ')));
-
- BOOST_TEST(test("0", lower[int_], 0));
- BOOST_TEST(test("123", lower[int_], 123));
- BOOST_TEST(test("-123", lower[int_], -123));
-
- BOOST_TEST(test_delimited("0 ", lower[int_], 0, char_(' ')));
- BOOST_TEST(test_delimited("123 ", lower[int_], 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", lower[int_], -123, char_(' ')));
-
- BOOST_TEST(test("0", upper[int_], 0));
- BOOST_TEST(test("123", upper[int_], 123));
- BOOST_TEST(test("-123", upper[int_], -123));
-
- BOOST_TEST(test_delimited("0 ", upper[int_], 0, char_(' ')));
- BOOST_TEST(test_delimited("123 ", upper[int_], 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", upper[int_], -123, char_(' ')));
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test("0", int_(0)));
- BOOST_TEST(test("123", int_(123)));
- BOOST_TEST(test("-123", int_(-123)));
-
- BOOST_TEST(test_delimited("0 ", int_(0), char_(' ')));
- BOOST_TEST(test_delimited("123 ", int_(123), char_(' ')));
- BOOST_TEST(test_delimited("-123 ", int_(-123), char_(' ')));
-
- BOOST_TEST(test("0", lower[int_(0)]));
- BOOST_TEST(test("123", lower[int_(123)]));
- BOOST_TEST(test("-123", lower[int_(-123)]));
-
- BOOST_TEST(test_delimited("0 ", lower[int_(0)], char_(' ')));
- BOOST_TEST(test_delimited("123 ", lower[int_(123)], char_(' ')));
- BOOST_TEST(test_delimited("-123 ", lower[int_(-123)], char_(' ')));
-
- BOOST_TEST(test("0", upper[int_(0)]));
- BOOST_TEST(test("123", upper[int_(123)]));
- BOOST_TEST(test("-123", upper[int_(-123)]));
-
- BOOST_TEST(test_delimited("0 ", upper[int_(0)], char_(' ')));
- BOOST_TEST(test_delimited("123 ", upper[int_(123)], char_(' ')));
- BOOST_TEST(test_delimited("-123 ", upper[int_(-123)], char_(' ')));
- }
-
- { // literals, make sure there are no ambiguities
- BOOST_TEST(test("0", lit(short(0))));
- BOOST_TEST(test("0", lit(0)));
- BOOST_TEST(test("0", lit(0L)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(test("0", lit(0LL)));
-#endif
-
- BOOST_TEST(test("0", lit((unsigned short)0)));
- BOOST_TEST(test("0", lit(0U)));
- BOOST_TEST(test("0", lit(0UL)));
-#ifdef BOOST_HAS_LONG_LONG
- BOOST_TEST(test("0", lit(0ULL)));
-#endif
-
- BOOST_TEST(test("a", lit('a')));
- BOOST_TEST(test("a", 'a'));
- BOOST_TEST(test(L"a", L'a'));
- }
-
- { // lazy numerics
- using namespace boost::phoenix;
-
- BOOST_TEST(test("0", int_(val(0))));
- BOOST_TEST(test("123", int_(val(123))));
- BOOST_TEST(test("-123", int_(val(-123))));
-
- int i1 = 0, i2 = 123, i3 = -123;
- BOOST_TEST(test("0", int_(ref(i1))));
- BOOST_TEST(test("123", int_(ref(i2))));
- BOOST_TEST(test("-123", int_(ref(i3))));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- karma::int_generator<int, 10, true> const signed_int =
- karma::int_generator<int, 10, true>();
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test(" 0", signed_int, 0));
- BOOST_TEST(test("+123", signed_int, 123));
- BOOST_TEST(test("-123", signed_int, -123));
-
- BOOST_TEST(test_delimited(" 0 ", signed_int, 0, char_(' ')));
- BOOST_TEST(test_delimited("+123 ", signed_int, 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", signed_int, -123, char_(' ')));
-
- BOOST_TEST(test(" 0", lower[signed_int], 0));
- BOOST_TEST(test("+123", lower[signed_int], 123));
- BOOST_TEST(test("-123", lower[signed_int], -123));
-
- BOOST_TEST(test_delimited(" 0 ", lower[signed_int], 0, char_(' ')));
- BOOST_TEST(test_delimited("+123 ", lower[signed_int], 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", lower[signed_int], -123, char_(' ')));
-
- BOOST_TEST(test(" 0", upper[signed_int], 0));
- BOOST_TEST(test("+123", upper[signed_int], 123));
- BOOST_TEST(test("-123", upper[signed_int], -123));
-
- BOOST_TEST(test_delimited(" 0 ", upper[signed_int], 0, char_(' ')));
- BOOST_TEST(test_delimited("+123 ", upper[signed_int], 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", upper[signed_int], -123, char_(' ')));
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test(" 0", signed_int(0)));
- BOOST_TEST(test("+123", signed_int(123)));
- BOOST_TEST(test("-123", signed_int(-123)));
-
- BOOST_TEST(test_delimited(" 0 ", signed_int(0), char_(' ')));
- BOOST_TEST(test_delimited("+123 ", signed_int(123), char_(' ')));
- BOOST_TEST(test_delimited("-123 ", signed_int(-123), char_(' ')));
-
- BOOST_TEST(test(" 0", lower[signed_int(0)]));
- BOOST_TEST(test("+123", lower[signed_int(123)]));
- BOOST_TEST(test("-123", lower[signed_int(-123)]));
-
- BOOST_TEST(test_delimited(" 0 ", lower[signed_int(0)], char_(' ')));
- BOOST_TEST(test_delimited("+123 ", lower[signed_int(123)], char_(' ')));
- BOOST_TEST(test_delimited("-123 ", lower[signed_int(-123)], char_(' ')));
-
- BOOST_TEST(test(" 0", upper[signed_int(0)]));
- BOOST_TEST(test("+123", upper[signed_int(123)]));
- BOOST_TEST(test("-123", upper[signed_int(-123)]));
-
- BOOST_TEST(test_delimited(" 0 ", upper[signed_int(0)], char_(' ')));
- BOOST_TEST(test_delimited("+123 ", upper[signed_int(123)], char_(' ')));
- BOOST_TEST(test_delimited("-123 ", upper[signed_int(-123)], char_(' ')));
-
- using namespace boost::phoenix;
-
- BOOST_TEST(test(" 0", signed_int(val(0))));
- BOOST_TEST(test("+123", signed_int(val(123))));
- BOOST_TEST(test("-123", signed_int(val(-123))));
-
- int i1 = 0, i2 = 123, i3 = -123;
- BOOST_TEST(test(" 0", signed_int(ref(i1))));
- BOOST_TEST(test("+123", signed_int(ref(i2))));
- BOOST_TEST(test("-123", signed_int(ref(i3))));
- }
-
- {
- ///////////////////////////////////////////////////////////////////////
- using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("1234", uint_, 1234));
- BOOST_TEST(test("ff", hex, 0xff));
- BOOST_TEST(test("1234", oct, 01234));
- BOOST_TEST(test("11110000", bin, 0xf0));
-
- BOOST_TEST(test_delimited("1234 ", uint_, 1234, char_(' ')));
- BOOST_TEST(test_delimited("ff ", hex, 0xff, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", oct, 01234, char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", bin, 0xf0, char_(' ')));
-
- // test unsigned generator with signed integral value
- BOOST_TEST(test("ff", hex, (char)0xff));
- BOOST_TEST(test_delimited("ff ", hex, (char)0xff, char_(' ')));
-
- BOOST_TEST(test("1234", lower[uint_], 1234));
- BOOST_TEST(test("ff", lower[hex], 0xff));
- BOOST_TEST(test("1234", lower[oct], 01234));
- BOOST_TEST(test("11110000", lower[bin], 0xf0));
-
- BOOST_TEST(test_delimited("1234 ", lower[uint_], 1234, char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[hex], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[oct], 01234, char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", lower[bin], 0xf0, char_(' ')));
-
- BOOST_TEST(test("1234", upper[uint_], 1234));
- BOOST_TEST(test("FF", upper[hex], 0xff));
- BOOST_TEST(test("1234", upper[oct], 01234));
- BOOST_TEST(test("11110000", upper[bin], 0xf0));
-
- BOOST_TEST(test_delimited("1234 ", upper[uint_], 1234, char_(' ')));
- BOOST_TEST(test_delimited("FF ", upper[hex], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", upper[oct], 01234, char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", upper[bin], 0xf0, char_(' ')));
-
- // no generator transformation should occur for uint_'s
- BOOST_TEST(test("1234", upper[upper[uint_]], 1234));
- BOOST_TEST(test("1234", upper[lower[uint_]], 1234));
- BOOST_TEST(test("1234", lower[upper[uint_]], 1234));
- BOOST_TEST(test("1234", lower[lower[uint_]], 1234));
-
- BOOST_TEST(test_delimited("1234 ", upper[upper[uint_]], 1234, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", upper[lower[uint_]], 1234, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[upper[uint_]], 1234, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[lower[uint_]], 1234, char_(' ')));
-
- BOOST_TEST(test("FF", upper[upper[hex]], 0xff));
- BOOST_TEST(test("FF", upper[lower[hex]], 0xff));
- BOOST_TEST(test("ff", lower[upper[hex]], 0xff));
- BOOST_TEST(test("ff", lower[lower[hex]], 0xff));
-
- BOOST_TEST(test_delimited("FF ", upper[upper[hex]], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("FF ", upper[lower[hex]], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[upper[hex]], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[lower[hex]], 0xff, char_(' ')));
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test("1234", uint_(1234)));
- BOOST_TEST(test("ff", hex(0xff)));
- BOOST_TEST(test("1234", oct(01234)));
- BOOST_TEST(test("11110000", bin(0xf0)));
-
- BOOST_TEST(test_delimited("1234 ", uint_(1234), char_(' ')));
- BOOST_TEST(test_delimited("ff ", hex(0xff), char_(' ')));
- BOOST_TEST(test_delimited("1234 ", oct(01234), char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", bin(0xf0), char_(' ')));
-
- BOOST_TEST(test("1234", lower[uint_(1234)]));
- BOOST_TEST(test("ff", lower[hex(0xff)]));
- BOOST_TEST(test("1234", lower[oct(01234)]));
- BOOST_TEST(test("11110000", lower[bin(0xf0)]));
-
- BOOST_TEST(test_delimited("1234 ", lower[uint_(1234)], char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[hex(0xff)], char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[oct(01234)], char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", lower[bin(0xf0)], char_(' ')));
-
- BOOST_TEST(test("1234", upper[uint_(1234)]));
- BOOST_TEST(test("FF", upper[hex(0xff)]));
- BOOST_TEST(test("1234", upper[oct(01234)]));
- BOOST_TEST(test("11110000", upper[bin(0xf0)]));
-
- BOOST_TEST(test_delimited("1234 ", upper[uint_(1234)], char_(' ')));
- BOOST_TEST(test_delimited("FF ", upper[hex(0xff)], char_(' ')));
- BOOST_TEST(test_delimited("1234 ", upper[oct(01234)], char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", upper[bin(0xf0)], char_(' ')));
-
- BOOST_TEST(test("FF", upper[upper[hex(0xff)]]));
- BOOST_TEST(test("FF", upper[lower[hex(0xff)]]));
- BOOST_TEST(test("ff", lower[upper[hex(0xff)]]));
- BOOST_TEST(test("ff", lower[lower[hex(0xff)]]));
-
- BOOST_TEST(test_delimited("FF ", upper[upper[hex(0xff)]], char_(' ')));
- BOOST_TEST(test_delimited("FF ", upper[lower[hex(0xff)]], char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[upper[hex(0xff)]], char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[lower[hex(0xff)]], char_(' ')));
- }
-
-// test boundary values
- typedef boost::mpl::vector<
-#ifdef BOOST_HAS_LONG_LONG
- boost::long_long_type, boost::ulong_long_type,
-#endif
- short, unsigned short,
- int, unsigned int,
- long, unsigned long
- > integer_types;
- boost::mpl::for_each<integer_types>(test_minmax());
-
- return boost::report_errors();
-}
-
Copied: trunk/libs/spirit/test/karma/int_numerics1.cpp (from r67483, /trunk/libs/spirit/test/karma/int_numerics.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/int_numerics.cpp (original)
+++ trunk/libs/spirit/test/karma/int_numerics1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -29,85 +29,6 @@
using namespace spirit_test;
///////////////////////////////////////////////////////////////////////////////
-struct test_minmax
-{
- template <typename T>
- void operator()(T) const
- {
- using namespace boost::spirit;
- using namespace boost::phoenix;
-
- T minval = (std::numeric_limits<T>::min)();
- T maxval = (std::numeric_limits<T>::max)();
-
- std::string expected_minval = boost::lexical_cast<std::string>(minval);
- std::string expected_maxval = boost::lexical_cast<std::string>(maxval);
-
- // create a correct generator type from the given integer type
- typedef typename
- boost::mpl::if_<
- boost::mpl::bool_<std::numeric_limits<T>::is_signed>,
- karma::int_generator<T>,
- karma::uint_generator<T>
- >::type
- int_generator_type;
-
- int_generator_type const gen = int_generator_type();
-
- BOOST_TEST(test(expected_maxval, gen, maxval));
- BOOST_TEST(test(expected_minval, gen, minval));
- BOOST_TEST(test(expected_maxval, gen(maxval)));
- BOOST_TEST(test(expected_minval, gen(minval)));
- BOOST_TEST(test(expected_maxval, gen(maxval), maxval));
- BOOST_TEST(test(expected_minval, gen(minval), minval));
- BOOST_TEST(!test("", gen(maxval), maxval-1));
- BOOST_TEST(!test("", gen(minval), minval+1));
- BOOST_TEST(test(expected_maxval, lit(maxval)));
- BOOST_TEST(test(expected_minval, lit(minval)));
-
- BOOST_TEST(test_delimited(expected_maxval + " ", gen, maxval, char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", gen, minval, char(' ')));
- BOOST_TEST(test_delimited(expected_maxval + " ", gen(maxval), char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", gen(minval), char(' ')));
- BOOST_TEST(test_delimited(expected_maxval + " ", gen(maxval), maxval, char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", gen(minval), minval, char(' ')));
- BOOST_TEST(!test_delimited("", gen(maxval), maxval-1, char(' ')));
- BOOST_TEST(!test_delimited("", gen(minval), minval+1, char(' ')));
- BOOST_TEST(test_delimited(expected_maxval + " ", lit(maxval), char(' ')));
- BOOST_TEST(test_delimited(expected_minval + " ", lit(minval), char(' ')));
-
- // action tests
- BOOST_TEST(test(expected_maxval, gen[_1 = val(maxval)]));
- BOOST_TEST(test(expected_minval, gen[_1 = val(minval)]));
-
- // optional tests
- boost::optional<T> optmin, optmax(maxval);
-
- BOOST_TEST(!test("", gen, optmin));
- BOOST_TEST(!test("", gen(minval), optmin));
-
- optmin = minval;
- BOOST_TEST(test(expected_minval, gen, optmin));
- BOOST_TEST(test(expected_maxval, gen, optmax));
- BOOST_TEST(test(expected_minval, gen(minval), optmin));
- BOOST_TEST(test(expected_maxval, gen(maxval), optmax));
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- // Phoenix expression tests (only supported while including
- // karma_phoenix_attributes.hpp
- namespace phoenix = boost::phoenix;
-
- BOOST_TEST(test("1", gen, phoenix::val(1)));
-
- T val = 1;
- BOOST_TEST(test("1", gen, phoenix::ref(val)));
- BOOST_TEST(test("2", gen, ++phoenix::ref(val)));
-#endif
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
int
main()
{
@@ -118,9 +39,9 @@
///////////////////////////////////////////////////////////////////////
// this is currently ambiguous with character literals
-// BOOST_TEST(test("0", 0));
-// BOOST_TEST(test("123", 123));
-// BOOST_TEST(test("-123", -123));
+ BOOST_TEST(test("0", 0));
+ BOOST_TEST(test("123", 123));
+ BOOST_TEST(test("-123", -123));
BOOST_TEST(test("0", int_, 0));
BOOST_TEST(test("123", int_, 123));
@@ -204,135 +125,10 @@
BOOST_TEST(test("123", int_(ref(i2))));
BOOST_TEST(test("-123", int_(ref(i3))));
}
-
- {
- using namespace boost::spirit::ascii;
-
- karma::int_generator<int, 10, true> const signed_int =
- karma::int_generator<int, 10, true>();
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test(" 0", signed_int, 0));
- BOOST_TEST(test("+123", signed_int, 123));
- BOOST_TEST(test("-123", signed_int, -123));
-
- BOOST_TEST(test_delimited(" 0 ", signed_int, 0, char_(' ')));
- BOOST_TEST(test_delimited("+123 ", signed_int, 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", signed_int, -123, char_(' ')));
-
- BOOST_TEST(test(" 0", lower[signed_int], 0));
- BOOST_TEST(test("+123", lower[signed_int], 123));
- BOOST_TEST(test("-123", lower[signed_int], -123));
-
- BOOST_TEST(test_delimited(" 0 ", lower[signed_int], 0, char_(' ')));
- BOOST_TEST(test_delimited("+123 ", lower[signed_int], 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", lower[signed_int], -123, char_(' ')));
-
- BOOST_TEST(test(" 0", upper[signed_int], 0));
- BOOST_TEST(test("+123", upper[signed_int], 123));
- BOOST_TEST(test("-123", upper[signed_int], -123));
-
- BOOST_TEST(test_delimited(" 0 ", upper[signed_int], 0, char_(' ')));
- BOOST_TEST(test_delimited("+123 ", upper[signed_int], 123, char_(' ')));
- BOOST_TEST(test_delimited("-123 ", upper[signed_int], -123, char_(' ')));
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test(" 0", signed_int(0)));
- BOOST_TEST(test("+123", signed_int(123)));
- BOOST_TEST(test("-123", signed_int(-123)));
-
- BOOST_TEST(test_delimited(" 0 ", signed_int(0), char_(' ')));
- BOOST_TEST(test_delimited("+123 ", signed_int(123), char_(' ')));
- BOOST_TEST(test_delimited("-123 ", signed_int(-123), char_(' ')));
-
- BOOST_TEST(test(" 0", lower[signed_int(0)]));
- BOOST_TEST(test("+123", lower[signed_int(123)]));
- BOOST_TEST(test("-123", lower[signed_int(-123)]));
-
- BOOST_TEST(test_delimited(" 0 ", lower[signed_int(0)], char_(' ')));
- BOOST_TEST(test_delimited("+123 ", lower[signed_int(123)], char_(' ')));
- BOOST_TEST(test_delimited("-123 ", lower[signed_int(-123)], char_(' ')));
-
- BOOST_TEST(test(" 0", upper[signed_int(0)]));
- BOOST_TEST(test("+123", upper[signed_int(123)]));
- BOOST_TEST(test("-123", upper[signed_int(-123)]));
-
- BOOST_TEST(test_delimited(" 0 ", upper[signed_int(0)], char_(' ')));
- BOOST_TEST(test_delimited("+123 ", upper[signed_int(123)], char_(' ')));
- BOOST_TEST(test_delimited("-123 ", upper[signed_int(-123)], char_(' ')));
-
- using namespace boost::phoenix;
-
- BOOST_TEST(test(" 0", signed_int(val(0))));
- BOOST_TEST(test("+123", signed_int(val(123))));
- BOOST_TEST(test("-123", signed_int(val(-123))));
-
- int i1 = 0, i2 = 123, i3 = -123;
- BOOST_TEST(test(" 0", signed_int(ref(i1))));
- BOOST_TEST(test("+123", signed_int(ref(i2))));
- BOOST_TEST(test("-123", signed_int(ref(i3))));
- }
-
+
{
///////////////////////////////////////////////////////////////////////
using namespace boost::spirit::ascii;
-
- BOOST_TEST(test("1234", uint_, 1234));
- BOOST_TEST(test("ff", hex, 0xff));
- BOOST_TEST(test("1234", oct, 01234));
- BOOST_TEST(test("11110000", bin, 0xf0));
-
- BOOST_TEST(test_delimited("1234 ", uint_, 1234, char_(' ')));
- BOOST_TEST(test_delimited("ff ", hex, 0xff, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", oct, 01234, char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", bin, 0xf0, char_(' ')));
-
- // test unsigned generator with signed integral value
- BOOST_TEST(test("ff", hex, (char)0xff));
- BOOST_TEST(test_delimited("ff ", hex, (char)0xff, char_(' ')));
-
- BOOST_TEST(test("1234", lower[uint_], 1234));
- BOOST_TEST(test("ff", lower[hex], 0xff));
- BOOST_TEST(test("1234", lower[oct], 01234));
- BOOST_TEST(test("11110000", lower[bin], 0xf0));
-
- BOOST_TEST(test_delimited("1234 ", lower[uint_], 1234, char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[hex], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[oct], 01234, char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", lower[bin], 0xf0, char_(' ')));
-
- BOOST_TEST(test("1234", upper[uint_], 1234));
- BOOST_TEST(test("FF", upper[hex], 0xff));
- BOOST_TEST(test("1234", upper[oct], 01234));
- BOOST_TEST(test("11110000", upper[bin], 0xf0));
-
- BOOST_TEST(test_delimited("1234 ", upper[uint_], 1234, char_(' ')));
- BOOST_TEST(test_delimited("FF ", upper[hex], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", upper[oct], 01234, char_(' ')));
- BOOST_TEST(test_delimited("11110000 ", upper[bin], 0xf0, char_(' ')));
-
- // no generator transformation should occur for uint_'s
- BOOST_TEST(test("1234", upper[upper[uint_]], 1234));
- BOOST_TEST(test("1234", upper[lower[uint_]], 1234));
- BOOST_TEST(test("1234", lower[upper[uint_]], 1234));
- BOOST_TEST(test("1234", lower[lower[uint_]], 1234));
-
- BOOST_TEST(test_delimited("1234 ", upper[upper[uint_]], 1234, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", upper[lower[uint_]], 1234, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[upper[uint_]], 1234, char_(' ')));
- BOOST_TEST(test_delimited("1234 ", lower[lower[uint_]], 1234, char_(' ')));
-
- BOOST_TEST(test("FF", upper[upper[hex]], 0xff));
- BOOST_TEST(test("FF", upper[lower[hex]], 0xff));
- BOOST_TEST(test("ff", lower[upper[hex]], 0xff));
- BOOST_TEST(test("ff", lower[lower[hex]], 0xff));
-
- BOOST_TEST(test_delimited("FF ", upper[upper[hex]], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("FF ", upper[lower[hex]], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[upper[hex]], 0xff, char_(' ')));
- BOOST_TEST(test_delimited("ff ", lower[lower[hex]], 0xff, char_(' ')));
-
- ///////////////////////////////////////////////////////////////////////
BOOST_TEST(test("1234", uint_(1234)));
BOOST_TEST(test("ff", hex(0xff)));
BOOST_TEST(test("1234", oct(01234)));
@@ -374,17 +170,6 @@
BOOST_TEST(test_delimited("ff ", lower[lower[hex(0xff)]], char_(' ')));
}
-// test boundary values
- typedef boost::mpl::vector<
-#ifdef BOOST_HAS_LONG_LONG
- boost::long_long_type, boost::ulong_long_type,
-#endif
- short, unsigned short,
- int, unsigned int,
- long, unsigned long
- > integer_types;
- boost::mpl::for_each<integer_types>(test_minmax());
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/int_numerics2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/int_numerics2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,168 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+//#define KARMA_FAIL_COMPILATION
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+
+#include <limits>
+#include "test.hpp"
+
+using namespace spirit_test;
+
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+
+ {
+ using namespace boost::spirit::ascii;
+
+ karma::int_generator<int, 10, true> const signed_int =
+ karma::int_generator<int, 10, true>();
+
+ ///////////////////////////////////////////////////////////////////////
+ BOOST_TEST(test(" 0", signed_int, 0));
+ BOOST_TEST(test("+123", signed_int, 123));
+ BOOST_TEST(test("-123", signed_int, -123));
+
+ BOOST_TEST(test_delimited(" 0 ", signed_int, 0, char_(' ')));
+ BOOST_TEST(test_delimited("+123 ", signed_int, 123, char_(' ')));
+ BOOST_TEST(test_delimited("-123 ", signed_int, -123, char_(' ')));
+
+ BOOST_TEST(test(" 0", lower[signed_int], 0));
+ BOOST_TEST(test("+123", lower[signed_int], 123));
+ BOOST_TEST(test("-123", lower[signed_int], -123));
+
+ BOOST_TEST(test_delimited(" 0 ", lower[signed_int], 0, char_(' ')));
+ BOOST_TEST(test_delimited("+123 ", lower[signed_int], 123, char_(' ')));
+ BOOST_TEST(test_delimited("-123 ", lower[signed_int], -123, char_(' ')));
+
+ BOOST_TEST(test(" 0", upper[signed_int], 0));
+ BOOST_TEST(test("+123", upper[signed_int], 123));
+ BOOST_TEST(test("-123", upper[signed_int], -123));
+
+ BOOST_TEST(test_delimited(" 0 ", upper[signed_int], 0, char_(' ')));
+ BOOST_TEST(test_delimited("+123 ", upper[signed_int], 123, char_(' ')));
+ BOOST_TEST(test_delimited("-123 ", upper[signed_int], -123, char_(' ')));
+
+ ///////////////////////////////////////////////////////////////////////
+ BOOST_TEST(test(" 0", signed_int(0)));
+ BOOST_TEST(test("+123", signed_int(123)));
+ BOOST_TEST(test("-123", signed_int(-123)));
+
+ BOOST_TEST(test_delimited(" 0 ", signed_int(0), char_(' ')));
+ BOOST_TEST(test_delimited("+123 ", signed_int(123), char_(' ')));
+ BOOST_TEST(test_delimited("-123 ", signed_int(-123), char_(' ')));
+
+ BOOST_TEST(test(" 0", lower[signed_int(0)]));
+ BOOST_TEST(test("+123", lower[signed_int(123)]));
+ BOOST_TEST(test("-123", lower[signed_int(-123)]));
+
+ BOOST_TEST(test_delimited(" 0 ", lower[signed_int(0)], char_(' ')));
+ BOOST_TEST(test_delimited("+123 ", lower[signed_int(123)], char_(' ')));
+ BOOST_TEST(test_delimited("-123 ", lower[signed_int(-123)], char_(' ')));
+
+ BOOST_TEST(test(" 0", upper[signed_int(0)]));
+ BOOST_TEST(test("+123", upper[signed_int(123)]));
+ BOOST_TEST(test("-123", upper[signed_int(-123)]));
+
+ BOOST_TEST(test_delimited(" 0 ", upper[signed_int(0)], char_(' ')));
+ BOOST_TEST(test_delimited("+123 ", upper[signed_int(123)], char_(' ')));
+ BOOST_TEST(test_delimited("-123 ", upper[signed_int(-123)], char_(' ')));
+
+ using namespace boost::phoenix;
+
+ BOOST_TEST(test(" 0", signed_int(val(0))));
+ BOOST_TEST(test("+123", signed_int(val(123))));
+ BOOST_TEST(test("-123", signed_int(val(-123))));
+
+ int i1 = 0, i2 = 123, i3 = -123;
+ BOOST_TEST(test(" 0", signed_int(ref(i1))));
+ BOOST_TEST(test("+123", signed_int(ref(i2))));
+ BOOST_TEST(test("-123", signed_int(ref(i3))));
+ }
+
+ {
+ ///////////////////////////////////////////////////////////////////////
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test("1234", uint_, 1234));
+ BOOST_TEST(test("ff", hex, 0xff));
+ BOOST_TEST(test("1234", oct, 01234));
+ BOOST_TEST(test("11110000", bin, 0xf0));
+
+ BOOST_TEST(test_delimited("1234 ", uint_, 1234, char_(' ')));
+ BOOST_TEST(test_delimited("ff ", hex, 0xff, char_(' ')));
+ BOOST_TEST(test_delimited("1234 ", oct, 01234, char_(' ')));
+ BOOST_TEST(test_delimited("11110000 ", bin, 0xf0, char_(' ')));
+
+ // test unsigned generator with signed integral value
+ BOOST_TEST(test("ff", hex, (char)0xff));
+ BOOST_TEST(test_delimited("ff ", hex, (char)0xff, char_(' ')));
+
+ BOOST_TEST(test("1234", lower[uint_], 1234));
+ BOOST_TEST(test("ff", lower[hex], 0xff));
+ BOOST_TEST(test("1234", lower[oct], 01234));
+ BOOST_TEST(test("11110000", lower[bin], 0xf0));
+
+ BOOST_TEST(test_delimited("1234 ", lower[uint_], 1234, char_(' ')));
+ BOOST_TEST(test_delimited("ff ", lower[hex], 0xff, char_(' ')));
+ BOOST_TEST(test_delimited("1234 ", lower[oct], 01234, char_(' ')));
+ BOOST_TEST(test_delimited("11110000 ", lower[bin], 0xf0, char_(' ')));
+
+ BOOST_TEST(test("1234", upper[uint_], 1234));
+ BOOST_TEST(test("FF", upper[hex], 0xff));
+ BOOST_TEST(test("1234", upper[oct], 01234));
+ BOOST_TEST(test("11110000", upper[bin], 0xf0));
+
+ BOOST_TEST(test_delimited("1234 ", upper[uint_], 1234, char_(' ')));
+ BOOST_TEST(test_delimited("FF ", upper[hex], 0xff, char_(' ')));
+ BOOST_TEST(test_delimited("1234 ", upper[oct], 01234, char_(' ')));
+ BOOST_TEST(test_delimited("11110000 ", upper[bin], 0xf0, char_(' ')));
+
+ // no generator transformation should occur for uint_'s
+ BOOST_TEST(test("1234", upper[upper[uint_]], 1234));
+ BOOST_TEST(test("1234", upper[lower[uint_]], 1234));
+ BOOST_TEST(test("1234", lower[upper[uint_]], 1234));
+ BOOST_TEST(test("1234", lower[lower[uint_]], 1234));
+
+ BOOST_TEST(test_delimited("1234 ", upper[upper[uint_]], 1234, char_(' ')));
+ BOOST_TEST(test_delimited("1234 ", upper[lower[uint_]], 1234, char_(' ')));
+ BOOST_TEST(test_delimited("1234 ", lower[upper[uint_]], 1234, char_(' ')));
+ BOOST_TEST(test_delimited("1234 ", lower[lower[uint_]], 1234, char_(' ')));
+
+ BOOST_TEST(test("FF", upper[upper[hex]], 0xff));
+ BOOST_TEST(test("FF", upper[lower[hex]], 0xff));
+ BOOST_TEST(test("ff", lower[upper[hex]], 0xff));
+ BOOST_TEST(test("ff", lower[lower[hex]], 0xff));
+
+ BOOST_TEST(test_delimited("FF ", upper[upper[hex]], 0xff, char_(' ')));
+ BOOST_TEST(test_delimited("FF ", upper[lower[hex]], 0xff, char_(' ')));
+ BOOST_TEST(test_delimited("ff ", lower[upper[hex]], 0xff, char_(' ')));
+ BOOST_TEST(test_delimited("ff ", lower[lower[hex]], 0xff, char_(' ')));
+ }
+
+ return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/karma/int_numerics3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/int_numerics3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,129 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+//#define KARMA_FAIL_COMPILATION
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+
+#include <limits>
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+struct test_minmax
+{
+ template <typename T>
+ void operator()(T) const
+ {
+ using namespace boost::spirit;
+ using namespace boost::phoenix;
+
+ T minval = (std::numeric_limits<T>::min)();
+ T maxval = (std::numeric_limits<T>::max)();
+
+ std::string expected_minval = boost::lexical_cast<std::string>(minval);
+ std::string expected_maxval = boost::lexical_cast<std::string>(maxval);
+
+ // create a correct generator type from the given integer type
+ typedef typename
+ boost::mpl::if_<
+ boost::mpl::bool_<std::numeric_limits<T>::is_signed>,
+ karma::int_generator<T>,
+ karma::uint_generator<T>
+ >::type
+ int_generator_type;
+
+ int_generator_type const gen = int_generator_type();
+
+ BOOST_TEST(test(expected_maxval, gen, maxval));
+ BOOST_TEST(test(expected_minval, gen, minval));
+ BOOST_TEST(test(expected_maxval, gen(maxval)));
+ BOOST_TEST(test(expected_minval, gen(minval)));
+ BOOST_TEST(test(expected_maxval, gen(maxval), maxval));
+ BOOST_TEST(test(expected_minval, gen(minval), minval));
+ BOOST_TEST(!test("", gen(maxval), maxval-1));
+ BOOST_TEST(!test("", gen(minval), minval+1));
+ BOOST_TEST(test(expected_maxval, lit(maxval)));
+ BOOST_TEST(test(expected_minval, lit(minval)));
+
+ BOOST_TEST(test_delimited(expected_maxval + " ", gen, maxval, char(' ')));
+ BOOST_TEST(test_delimited(expected_minval + " ", gen, minval, char(' ')));
+ BOOST_TEST(test_delimited(expected_maxval + " ", gen(maxval), char(' ')));
+ BOOST_TEST(test_delimited(expected_minval + " ", gen(minval), char(' ')));
+ BOOST_TEST(test_delimited(expected_maxval + " ", gen(maxval), maxval, char(' ')));
+ BOOST_TEST(test_delimited(expected_minval + " ", gen(minval), minval, char(' ')));
+ BOOST_TEST(!test_delimited("", gen(maxval), maxval-1, char(' ')));
+ BOOST_TEST(!test_delimited("", gen(minval), minval+1, char(' ')));
+ BOOST_TEST(test_delimited(expected_maxval + " ", lit(maxval), char(' ')));
+ BOOST_TEST(test_delimited(expected_minval + " ", lit(minval), char(' ')));
+
+ // action tests
+ BOOST_TEST(test(expected_maxval, gen[_1 = val(maxval)]));
+ BOOST_TEST(test(expected_minval, gen[_1 = val(minval)]));
+
+ // optional tests
+ boost::optional<T> optmin, optmax(maxval);
+
+ BOOST_TEST(!test("", gen, optmin));
+ BOOST_TEST(!test("", gen(minval), optmin));
+
+ optmin = minval;
+ BOOST_TEST(test(expected_minval, gen, optmin));
+ BOOST_TEST(test(expected_maxval, gen, optmax));
+ BOOST_TEST(test(expected_minval, gen(minval), optmin));
+ BOOST_TEST(test(expected_maxval, gen(maxval), optmax));
+
+// we support Phoenix attributes only starting with V2.2
+#if SPIRIT_VERSION >= 0x2020
+ // Phoenix expression tests (only supported while including
+ // karma_phoenix_attributes.hpp
+ namespace phoenix = boost::phoenix;
+
+ BOOST_TEST(test("1", gen, phoenix::val(1)));
+
+ T val = 1;
+ BOOST_TEST(test("1", gen, phoenix::ref(val)));
+ BOOST_TEST(test("2", gen, ++phoenix::ref(val)));
+#endif
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+
+// test boundary values
+ typedef boost::mpl::vector<
+#ifdef BOOST_HAS_LONG_LONG
+ boost::long_long_type, boost::ulong_long_type,
+#endif
+ short, unsigned short,
+ int, unsigned int,
+ long, unsigned long
+ > integer_types;
+ boost::mpl::for_each<integer_types>(test_minmax());
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/karma/karma_optional_double.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/karma_optional_double.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,52 +0,0 @@
-// Copyright (c) 2010 Olaf Peter
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/karma.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-namespace client
-{
- namespace karma = boost::spirit::karma;
-
- template <typename OutputIterator>
- struct grammar
- : karma::grammar<OutputIterator, boost::optional<double>()>
- {
- grammar()
- : grammar::base_type(start)
- {
- using karma::double_;
-
- u = double_ << "U";
- start = ( !double_ << "NA" ) | u;
-
- start.name("start");
- u.name("u");
- }
-
- karma::rule<OutputIterator, double()> u;
- karma::rule<OutputIterator, boost::optional<double>()> start;
- };
-}
-
-int main()
-{
- namespace karma = boost::spirit::karma;
-
- typedef std::back_insert_iterator<std::string> sink_type;
-
- boost::optional<double> d1, d2;
- d2 = 1.0;
-
- std::string generated1, generated2;
- client::grammar<sink_type> g;
-
- BOOST_TEST(karma::generate(sink_type(generated1), g, d1) && generated1 == "NA");
- BOOST_TEST(karma::generate(sink_type(generated2), g, d2) && generated2 == "1.0U");
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/karma/pattern.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/pattern.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,215 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_auxiliary.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- using namespace boost;
- using namespace boost::spirit;
- using namespace boost::spirit::ascii;
-
- typedef spirit_test::output_iterator<char>::type outiter_type;
-
- // test rule parameter propagation
- {
- using boost::phoenix::at_c;
-
- karma::rule<outiter_type, fusion::vector<char, int, double>()> start;
- fusion::vector<char, int, double> vec('a', 10, 12.4);
-
- start %= char_ << int_ << double_;
- BOOST_TEST(test("a1012.4", start, vec));
-
- karma::rule<outiter_type, char()> a;
- karma::rule<outiter_type, int()> b;
- karma::rule<outiter_type, double()> c;
-
- a %= char_ << eps;
- b %= int_;
- c %= double_;
- start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
- BOOST_TEST(test("a1012.4", start, vec));
-
- start = (a << b << c)[_1 = at_c<0>(_r0), _2 = at_c<1>(_r0), _3 = at_c<2>(_r0)];
- BOOST_TEST(test("a1012.4", start, vec));
-
- start = a << b << c;
- BOOST_TEST(test("a1012.4", start, vec));
-
- start %= a << b << c;
- BOOST_TEST(test("a1012.4", start, vec));
- }
-
- {
- using boost::phoenix::at_c;
-
- karma::rule<outiter_type, space_type, fusion::vector<char, int, double>()> start;
- fusion::vector<char, int, double> vec('a', 10, 12.4);
-
- start %= char_ << int_ << double_;
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
-
- karma::rule<outiter_type, space_type, char()> a;
- karma::rule<outiter_type, space_type, int()> b;
- karma::rule<outiter_type, space_type, double()> c;
-
- a %= char_ << eps;
- b %= int_;
- c %= double_;
- start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
-
- start = (a << b << c)[_1 = at_c<0>(_r0), _2 = at_c<1>(_r0), _3 = at_c<2>(_r0)];
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
-
- start = a << b << c;
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
-
- start %= a << b << c;
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
- }
-
- // test direct initalization
- {
- using boost::phoenix::at_c;
-
- fusion::vector<char, int, double> vec('a', 10, 12.4);
- karma::rule<outiter_type, space_type, fusion::vector<char, int, double>()>
- start = char_ << int_ << double_;;
-
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
-
- karma::rule<outiter_type, space_type, char()> a = char_ << eps;
- karma::rule<outiter_type, space_type, int()> b = int_;
- karma::rule<outiter_type, space_type, double()> c = double_;
-
- start = a[_1 = at_c<0>(_r0)] << b[_1 = at_c<1>(_r0)] << c[_1 = at_c<2>(_r0)];
- BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
- }
-
- // locals test
- {
- karma::rule<outiter_type, locals<std::string> > start;
-
- start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
- BOOST_TEST(test("abc10abc", start));
- }
-
- {
- karma::rule<outiter_type, space_type, locals<std::string> > start;
-
- start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
- BOOST_TEST(test_delimited("abc 10 abc ", start, space));
- }
-
- // alias tests
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start = (char_ | int_ | double_)[_1 = _val];
-
- var_type v ('a');
- BOOST_TEST(test("a", d, v));
- v = 10;
- BOOST_TEST(test("10", d, v));
- v = 12.4;
- BOOST_TEST(test("12.4", d, v));
- }
-
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, space_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start = (char_ | int_ | double_)[_1 = _val];
-
- var_type v ('a');
- BOOST_TEST(test_delimited("a ", d, v, space));
- v = 10;
- BOOST_TEST(test_delimited("10 ", d, v, space));
- v = 12.4;
- BOOST_TEST(test_delimited("12.4 ", d, v, space));
- }
-
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start %= char_ | int_ | double_;
-
- var_type v ('a');
- BOOST_TEST(test("a", d, v));
- v = 10;
- BOOST_TEST(test("10", d, v));
- v = 12.4;
- BOOST_TEST(test("12.4", d, v));
-
- start = char_ | int_ | double_;
-
- v = 'a';
- BOOST_TEST(test("a", d, v));
- v = 10;
- BOOST_TEST(test("10", d, v));
- v = 12.4;
- BOOST_TEST(test("12.4", d, v));
- }
-
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, space_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start %= char_ | int_ | double_;
-
- var_type v ('a');
- BOOST_TEST(test_delimited("a ", d, v, space));
- v = 10;
- BOOST_TEST(test_delimited("10 ", d, v, space));
- v = 12.4;
- BOOST_TEST(test_delimited("12.4 ", d, v, space));
-
- start = char_ | int_ | double_;
-
- v = 'a';
- BOOST_TEST(test_delimited("a ", d, v, space));
- v = 10;
- BOOST_TEST(test_delimited("10 ", d, v, space));
- v = 12.4;
- BOOST_TEST(test_delimited("12.4 ", d, v, space));
- }
-
- return boost::report_errors();
-}
-
Copied: trunk/libs/spirit/test/karma/pattern1.cpp (from r67483, /trunk/libs/spirit/test/karma/pattern.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/pattern.cpp (original)
+++ trunk/libs/spirit/test/karma/pattern1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -108,108 +108,6 @@
BOOST_TEST(test_delimited("a 10 12.4 ", start, vec, space));
}
- // locals test
- {
- karma::rule<outiter_type, locals<std::string> > start;
-
- start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
- BOOST_TEST(test("abc10abc", start));
- }
-
- {
- karma::rule<outiter_type, space_type, locals<std::string> > start;
-
- start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
- BOOST_TEST(test_delimited("abc 10 abc ", start, space));
- }
-
- // alias tests
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start = (char_ | int_ | double_)[_1 = _val];
-
- var_type v ('a');
- BOOST_TEST(test("a", d, v));
- v = 10;
- BOOST_TEST(test("10", d, v));
- v = 12.4;
- BOOST_TEST(test("12.4", d, v));
- }
-
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, space_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start = (char_ | int_ | double_)[_1 = _val];
-
- var_type v ('a');
- BOOST_TEST(test_delimited("a ", d, v, space));
- v = 10;
- BOOST_TEST(test_delimited("10 ", d, v, space));
- v = 12.4;
- BOOST_TEST(test_delimited("12.4 ", d, v, space));
- }
-
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start %= char_ | int_ | double_;
-
- var_type v ('a');
- BOOST_TEST(test("a", d, v));
- v = 10;
- BOOST_TEST(test("10", d, v));
- v = 12.4;
- BOOST_TEST(test("12.4", d, v));
-
- start = char_ | int_ | double_;
-
- v = 'a';
- BOOST_TEST(test("a", d, v));
- v = 10;
- BOOST_TEST(test("10", d, v));
- v = 12.4;
- BOOST_TEST(test("12.4", d, v));
- }
-
- {
- typedef variant<char, int, double> var_type;
-
- karma::rule<outiter_type, space_type, var_type()> d, start;
-
- d = start.alias(); // d will always track start
-
- start %= char_ | int_ | double_;
-
- var_type v ('a');
- BOOST_TEST(test_delimited("a ", d, v, space));
- v = 10;
- BOOST_TEST(test_delimited("10 ", d, v, space));
- v = 12.4;
- BOOST_TEST(test_delimited("12.4 ", d, v, space));
-
- start = char_ | int_ | double_;
-
- v = 'a';
- BOOST_TEST(test_delimited("a ", d, v, space));
- v = 10;
- BOOST_TEST(test_delimited("10 ", d, v, space));
- v = 12.4;
- BOOST_TEST(test_delimited("12.4 ", d, v, space));
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/pattern2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/pattern2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,138 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+#include <boost/spirit/include/phoenix_fusion.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ using namespace boost;
+ using namespace boost::spirit;
+ using namespace boost::spirit::ascii;
+
+ typedef spirit_test::output_iterator<char>::type outiter_type;
+
+ // locals test
+ {
+ karma::rule<outiter_type, locals<std::string> > start;
+
+ start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
+ BOOST_TEST(test("abc10abc", start));
+ }
+
+ {
+ karma::rule<outiter_type, space_type, locals<std::string> > start;
+
+ start = string[_1 = "abc", _a = _1] << int_[_1 = 10] << string[_1 = _a];
+ BOOST_TEST(test_delimited("abc 10 abc ", start, space));
+ }
+
+ // alias tests
+ {
+ typedef variant<char, int, double> var_type;
+
+ karma::rule<outiter_type, var_type()> d, start;
+
+ d = start.alias(); // d will always track start
+
+ start = (char_ | int_ | double_)[_1 = _val];
+
+ var_type v ('a');
+ BOOST_TEST(test("a", d, v));
+ v = 10;
+ BOOST_TEST(test("10", d, v));
+ v = 12.4;
+ BOOST_TEST(test("12.4", d, v));
+ }
+
+ {
+ typedef variant<char, int, double> var_type;
+
+ karma::rule<outiter_type, space_type, var_type()> d, start;
+
+ d = start.alias(); // d will always track start
+
+ start = (char_ | int_ | double_)[_1 = _val];
+
+ var_type v ('a');
+ BOOST_TEST(test_delimited("a ", d, v, space));
+ v = 10;
+ BOOST_TEST(test_delimited("10 ", d, v, space));
+ v = 12.4;
+ BOOST_TEST(test_delimited("12.4 ", d, v, space));
+ }
+
+ {
+ typedef variant<char, int, double> var_type;
+
+ karma::rule<outiter_type, var_type()> d, start;
+
+ d = start.alias(); // d will always track start
+
+ start %= char_ | int_ | double_;
+
+ var_type v ('a');
+ BOOST_TEST(test("a", d, v));
+ v = 10;
+ BOOST_TEST(test("10", d, v));
+ v = 12.4;
+ BOOST_TEST(test("12.4", d, v));
+
+ start = char_ | int_ | double_;
+
+ v = 'a';
+ BOOST_TEST(test("a", d, v));
+ v = 10;
+ BOOST_TEST(test("10", d, v));
+ v = 12.4;
+ BOOST_TEST(test("12.4", d, v));
+ }
+
+ {
+ typedef variant<char, int, double> var_type;
+
+ karma::rule<outiter_type, space_type, var_type()> d, start;
+
+ d = start.alias(); // d will always track start
+
+ start %= char_ | int_ | double_;
+
+ var_type v ('a');
+ BOOST_TEST(test_delimited("a ", d, v, space));
+ v = 10;
+ BOOST_TEST(test_delimited("10 ", d, v, space));
+ v = 12.4;
+ BOOST_TEST(test_delimited("12.4 ", d, v, space));
+
+ start = char_ | int_ | double_;
+
+ v = 'a';
+ BOOST_TEST(test_delimited("a ", d, v, space));
+ v = 10;
+ BOOST_TEST(test_delimited("10 ", d, v, space));
+ v = 12.4;
+ BOOST_TEST(test_delimited("12.4 ", d, v, space));
+ }
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/karma/real_numerics.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/real_numerics.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,560 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-//#define KARMA_FAIL_COMPILATION
-
-#include <boost/version.hpp>
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/math/concepts/real_concept.hpp>
-
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_phoenix_attributes.hpp>
-
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include <limits>
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces the scientific notation
-template <typename T>
-struct scientific_policy : boost::spirit::karma::real_policies<T>
-{
- // we want the numbers always to be in scientific format
- typedef boost::spirit::karma::real_policies<T> base_type;
- static int floatfield(T) { return base_type::fmtflags::scientific; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces the fixed notation
-template <typename T>
-struct fixed_policy : boost::spirit::karma::real_policies<T>
-{
- typedef boost::spirit::karma::real_policies<T> base_type;
-
- // we want the numbers always to be in scientific format
- static int floatfield(T) { return base_type::fmtflags::fixed; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces to output trailing zeros in the
-// fractional part
-template <typename T>
-struct trailing_zeros_policy : boost::spirit::karma::real_policies<T> // 4 digits
-{
- // we want the numbers always to contain trailing zeros up to 4 digits in
- // the fractional part
- static bool trailing_zeros(T) { return true; }
-
- // we want to generate up to 4 fractional digits
- static unsigned int precision(T) { return 4; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces the sign to be generated
-template <typename T>
-struct signed_policy : boost::spirit::karma::real_policies<T>
-{
- // we want to always have a sign generated
- static bool force_sign(T)
- {
- return true;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces to output trailing zeros in the
-// fractional part
-template <typename T>
-struct bordercase_policy : boost::spirit::karma::real_policies<T>
-{
- // we want to generate up to the maximum significant amount of fractional
- // digits
- static unsigned int precision(T)
- {
- return std::numeric_limits<T>::digits10 + 1;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces to output trailing zeros in the
-// fractional part
-template <typename T>
-struct statefull_policy : boost::spirit::karma::real_policies<T>
-{
- statefull_policy(int precision = 4, bool trailingzeros = false)
- : precision_(precision), trailingzeros_(trailingzeros)
- {}
-
- // we want to generate up to the maximum significant amount of fractional
- // digits
- unsigned int precision(T) const
- {
- return precision_;
- }
-
- bool trailing_zeros(T) const
- {
- return trailingzeros_;
- }
-
- int precision_;
- bool trailingzeros_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- using namespace boost::spirit;
-
- {
- ///////////////////////////////////////////////////////////////////////
- // use the default real_policies
- BOOST_TEST(test("0.0", double_, 0.0));
- BOOST_TEST(test("1.0", double_, 1.0));
- BOOST_TEST(test("1.0", double_, 1.0001));
- BOOST_TEST(test("1.001", double_, 1.001));
- BOOST_TEST(test("1.01", double_, 1.010));
- BOOST_TEST(test("1.1", double_, 1.100));
-
- BOOST_TEST(test("1.234e-04", double_, 0.00012345));
- BOOST_TEST(test("0.001", double_, 0.0012345));
- BOOST_TEST(test("0.012", double_, 0.012345));
- BOOST_TEST(test("0.123", double_, 0.12345));
- BOOST_TEST(test("1.234", double_, 1.2345));
- BOOST_TEST(test("12.346", double_, 12.346));
- BOOST_TEST(test("123.46", double_, 123.46));
- BOOST_TEST(test("1234.5", double_, 1234.5));
- BOOST_TEST(test("12342.0", double_, 12342.));
- BOOST_TEST(test("1.234e05", double_, 123420.));
-
- BOOST_TEST(test("-1.0", double_, -1.0));
- BOOST_TEST(test("-1.234", double_, -1.2345));
- BOOST_TEST(test("-1.235", double_, -1.2346));
- BOOST_TEST(test("-1234.2", double_, -1234.2));
-
- BOOST_TEST(test("1.0", double_(1.0)));
- BOOST_TEST(test("1.0", double_(1.0001)));
- BOOST_TEST(test("1.001", double_(1.001)));
- BOOST_TEST(test("1.01", double_(1.010)));
- BOOST_TEST(test("1.1", double_(1.100)));
-
- BOOST_TEST(test("1.234e-04", double_(0.00012345)));
- BOOST_TEST(test("0.001", double_(0.0012345)));
- BOOST_TEST(test("0.012", double_(0.012345)));
- BOOST_TEST(test("0.123", double_(0.12345)));
- BOOST_TEST(test("1.234", double_(1.2345)));
- BOOST_TEST(test("12.346", double_(12.346)));
- BOOST_TEST(test("123.46", double_(123.46)));
- BOOST_TEST(test("1234.5", double_(1234.5)));
- BOOST_TEST(test("12342.0", double_(12342.)));
- BOOST_TEST(test("1.234e05", double_(123420.)));
- }
-
- {
- ///////////////////////////////////////////////////////////////////////
- // test NaN and Inf
- BOOST_TEST(test("nan", double_, std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("-nan", double_, -std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("inf", double_, std::numeric_limits<double>::infinity()));
- BOOST_TEST(test("-inf", double_, -std::numeric_limits<double>::infinity()));
-
- typedef karma::real_generator<double, signed_policy<double> > signed_type;
- signed_type const signed_ = signed_type();
-
- BOOST_TEST(test("+nan", signed_, std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("-nan", signed_, -std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("+inf", signed_, std::numeric_limits<double>::infinity()));
- BOOST_TEST(test("-inf", signed_, -std::numeric_limits<double>::infinity()));
- BOOST_TEST(test(" 0.0", signed_, 0.0));
-
- BOOST_TEST(test("+nan", signed_(std::numeric_limits<double>::quiet_NaN())));
- BOOST_TEST(test("-nan", signed_(-std::numeric_limits<double>::quiet_NaN())));
- BOOST_TEST(test("+inf", signed_(std::numeric_limits<double>::infinity())));
- BOOST_TEST(test("-inf", signed_(-std::numeric_limits<double>::infinity())));
- BOOST_TEST(test(" 0.0", signed_(0.0)));
- }
-
- {
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, statefull_policy<double> >
- statefull_type;
-
- statefull_policy<double> policy(5, true);
- statefull_type const statefull = statefull_type(policy);
-
- BOOST_TEST(test("0.00000", statefull, 0.0));
- BOOST_TEST(test("0.00000", statefull(0.0)));
-
- using namespace boost::phoenix;
- BOOST_TEST(test("0.00000", statefull(val(0.0))));
- }
-
- {
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, trailing_zeros_policy<double> >
- trailing_zeros_type;
- trailing_zeros_type const trail_zeros = trailing_zeros_type();
-
- BOOST_TEST(test("0.0000", trail_zeros, 0.0));
- BOOST_TEST(test("1.0000", trail_zeros, 1.0));
- BOOST_TEST(test("1.0001", trail_zeros, 1.0001));
- BOOST_TEST(test("1.0010", trail_zeros, 1.001));
- BOOST_TEST(test("1.0100", trail_zeros, 1.010));
- BOOST_TEST(test("1.1000", trail_zeros, 1.100));
-
- BOOST_TEST(test("1.2345e-04", trail_zeros, 0.00012345));
- BOOST_TEST(test("0.0012", trail_zeros, 0.0012345));
- BOOST_TEST(test("0.0123", trail_zeros, 0.012345));
- BOOST_TEST(test("0.1235", trail_zeros, 0.12345));
- BOOST_TEST(test("1.2345", trail_zeros, 1.2345));
- BOOST_TEST(test("12.3460", trail_zeros, 12.346));
- BOOST_TEST(test("123.4600", trail_zeros, 123.46));
- BOOST_TEST(test("1234.5000", trail_zeros, 1234.5));
- BOOST_TEST(test("12342.0000", trail_zeros, 12342.));
- BOOST_TEST(test("1.2342e05", trail_zeros, 123420.));
-
- BOOST_TEST(test("-1.0000", trail_zeros, -1.0));
- BOOST_TEST(test("-1.2345", trail_zeros, -1.2345));
- BOOST_TEST(test("-1.2346", trail_zeros, -1.2346));
- BOOST_TEST(test("-1234.2000", trail_zeros, -1234.2));
-
- BOOST_TEST(test("1.0000", trail_zeros(1.0)));
- BOOST_TEST(test("1.0001", trail_zeros(1.0001)));
- BOOST_TEST(test("1.0010", trail_zeros(1.001)));
- BOOST_TEST(test("1.0100", trail_zeros(1.010)));
- BOOST_TEST(test("1.1000", trail_zeros(1.100)));
-
- BOOST_TEST(test("1.2345e-04", trail_zeros(0.00012345)));
- BOOST_TEST(test("0.0012", trail_zeros(0.0012345)));
- BOOST_TEST(test("0.0123", trail_zeros(0.012345)));
- BOOST_TEST(test("0.1235", trail_zeros(0.12345)));
- BOOST_TEST(test("1.2345", trail_zeros(1.2345)));
- BOOST_TEST(test("12.3460", trail_zeros(12.346)));
- BOOST_TEST(test("123.4600", trail_zeros(123.46)));
- BOOST_TEST(test("1234.5000", trail_zeros(1234.5)));
- BOOST_TEST(test("12342.0000", trail_zeros(12342.)));
- BOOST_TEST(test("1.2342e05", trail_zeros(123420.)));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test_delimited("0.0 ", double_, 0.0, char_(' ')));
- BOOST_TEST(test_delimited("1.0 ", double_, 1.0, char_(' ')));
- BOOST_TEST(test_delimited("1.0 ", double_, 1.0001, char_(' ')));
- BOOST_TEST(test_delimited("1.001 ", double_, 1.001, char_(' ')));
- BOOST_TEST(test_delimited("1.01 ", double_, 1.010, char_(' ')));
- BOOST_TEST(test_delimited("1.1 ", double_, 1.100, char_(' ')));
-
- BOOST_TEST(test_delimited("1.234e-04 ", double_, 0.00012345, char_(' ')));
- BOOST_TEST(test_delimited("0.001 ", double_, 0.0012345, char_(' ')));
- BOOST_TEST(test_delimited("0.012 ", double_, 0.012345, char_(' ')));
- BOOST_TEST(test_delimited("0.123 ", double_, 0.12345, char_(' ')));
- BOOST_TEST(test_delimited("1.234 ", double_, 1.2345, char_(' ')));
- BOOST_TEST(test_delimited("12.346 ", double_, 12.346, char_(' ')));
- BOOST_TEST(test_delimited("123.46 ", double_, 123.46, char_(' ')));
- BOOST_TEST(test_delimited("1234.5 ", double_, 1234.5, char_(' ')));
- BOOST_TEST(test_delimited("12342.0 ", double_, 12342., char_(' ')));
- BOOST_TEST(test_delimited("1.234e05 ", double_, 123420., char_(' ')));
-
- BOOST_TEST(test_delimited("-1.0 ", double_, -1.0, char_(' ')));
- BOOST_TEST(test_delimited("-1.234 ", double_, -1.2345, char_(' ')));
- BOOST_TEST(test_delimited("-1.235 ", double_, -1.2346, char_(' ')));
- BOOST_TEST(test_delimited("-1234.2 ", double_, -1234.2, char_(' ')));
-
- BOOST_TEST(test_delimited("1.0 ", double_(1.0), char_(' ')));
- BOOST_TEST(test_delimited("1.0 ", double_(1.0001), char_(' ')));
- BOOST_TEST(test_delimited("1.001 ", double_(1.001), char_(' ')));
- BOOST_TEST(test_delimited("1.01 ", double_(1.010), char_(' ')));
- BOOST_TEST(test_delimited("1.1 ", double_(1.100), char_(' ')));
-
- BOOST_TEST(test_delimited("1.234e-04 ", double_(0.00012345), char_(' ')));
- BOOST_TEST(test_delimited("0.001 ", double_(0.0012345), char_(' ')));
- BOOST_TEST(test_delimited("0.012 ", double_(0.012345), char_(' ')));
- BOOST_TEST(test_delimited("0.123 ", double_(0.12345), char_(' ')));
- BOOST_TEST(test_delimited("1.234 ", double_(1.2345), char_(' ')));
- BOOST_TEST(test_delimited("12.346 ", double_(12.346), char_(' ')));
- BOOST_TEST(test_delimited("123.46 ", double_(123.46), char_(' ')));
- BOOST_TEST(test_delimited("1234.5 ", double_(1234.5), char_(' ')));
- BOOST_TEST(test_delimited("12342.0 ", double_(12342.), char_(' ')));
- BOOST_TEST(test_delimited("1.234e05 ", double_(123420.), char_(' ')));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- // test NaN and Inf
- BOOST_TEST(test_delimited("nan ", double_,
- std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("-nan ", double_,
- -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("inf ", double_,
- std::numeric_limits<double>::infinity(), char_(' ')));
- BOOST_TEST(test_delimited("-inf ", double_,
- -std::numeric_limits<double>::infinity(), char_(' ')));
-
- typedef karma::real_generator<double, signed_policy<double> > signed_type;
- signed_type const signed_ = signed_type();
-
- BOOST_TEST(test_delimited("+nan ", signed_,
- std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("-nan ", signed_,
- -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("+inf ", signed_,
- std::numeric_limits<double>::infinity(), char_(' ')));
- BOOST_TEST(test_delimited("-inf ", signed_,
- -std::numeric_limits<double>::infinity(), char_(' ')));
- BOOST_TEST(test_delimited(" 0.0 ", signed_, 0.0, char_(' ')));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, scientific_policy<double> >
- science_type;
- science_type const science = science_type();
-
- BOOST_TEST(test("0.0e00", science, 0.0));
- BOOST_TEST(test("1.0e00", science, 1.0));
-
- BOOST_TEST(test("1.234e-05", science, 0.000012345));
- BOOST_TEST(test("1.234e-04", science, 0.00012345));
- BOOST_TEST(test("1.234e-03", science, 0.0012345));
- BOOST_TEST(test("1.234e-02", science, 0.012345));
- BOOST_TEST(test("1.235e-01", science, 0.12345)); // note the rounding error!
- BOOST_TEST(test("1.234e00", science, 1.2345));
- BOOST_TEST(test("1.235e01", science, 12.346));
- BOOST_TEST(test("1.235e02", science, 123.46));
- BOOST_TEST(test("1.234e03", science, 1234.5));
- BOOST_TEST(test("1.234e04", science, 12342.));
- BOOST_TEST(test("1.234e05", science, 123420.));
-
- BOOST_TEST(test("-1.234e-05", science, -0.000012345));
- BOOST_TEST(test("-1.234e-04", science, -0.00012345));
- BOOST_TEST(test("-1.234e-03", science, -0.0012345));
- BOOST_TEST(test("-1.234e-02", science, -0.012345));
- BOOST_TEST(test("-1.235e-01", science, -0.12345)); // note the rounding error!
- BOOST_TEST(test("-1.234e00", science, -1.2345));
- BOOST_TEST(test("-1.235e01", science, -12.346));
- BOOST_TEST(test("-1.235e02", science, -123.46));
- BOOST_TEST(test("-1.234e03", science, -1234.5));
- BOOST_TEST(test("-1.234e04", science, -12342.));
- BOOST_TEST(test("-1.234e05", science, -123420.));
-
- BOOST_TEST(test("1.234E-05", upper[science], 0.000012345));
- BOOST_TEST(test("1.234E-04", upper[science], 0.00012345));
- BOOST_TEST(test("1.234E-03", upper[science], 0.0012345));
- BOOST_TEST(test("1.234E-02", upper[science], 0.012345));
- BOOST_TEST(test("1.235E-01", upper[science], 0.12345)); // note the rounding error!
- BOOST_TEST(test("1.234E00", upper[science], 1.2345));
- BOOST_TEST(test("1.235E01", upper[science], 12.346));
- BOOST_TEST(test("1.235E02", upper[science], 123.46));
- BOOST_TEST(test("1.234E03", upper[science], 1234.5));
- BOOST_TEST(test("1.234E04", upper[science], 12342.));
- BOOST_TEST(test("1.234E05", upper[science], 123420.));
-
- BOOST_TEST(test("-1.234E-05", upper[science], -0.000012345));
- BOOST_TEST(test("-1.234E-04", upper[science], -0.00012345));
- BOOST_TEST(test("-1.234E-03", upper[science], -0.0012345));
- BOOST_TEST(test("-1.234E-02", upper[science], -0.012345));
- BOOST_TEST(test("-1.235E-01", upper[science], -0.12345)); // note the rounding error!
- BOOST_TEST(test("-1.234E00", upper[science], -1.2345));
- BOOST_TEST(test("-1.235E01", upper[science], -12.346));
- BOOST_TEST(test("-1.235E02", upper[science], -123.46));
- BOOST_TEST(test("-1.234E03", upper[science], -1234.5));
- BOOST_TEST(test("-1.234E04", upper[science], -12342.));
- BOOST_TEST(test("-1.234E05", upper[science], -123420.));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, fixed_policy<double> > fixed_type;
- fixed_type const fixed = fixed_type();
-
- BOOST_TEST(test("0.0", fixed, 0.0));
- BOOST_TEST(test("1.0", fixed, 1.0));
-
- BOOST_TEST(test("0.0", fixed, 0.000012345));
- BOOST_TEST(test("0.0", fixed, 0.00012345));
- BOOST_TEST(test("0.001", fixed, 0.0012345));
- BOOST_TEST(test("0.012", fixed, 0.012345));
- BOOST_TEST(test("0.123", fixed, 0.12345));
- BOOST_TEST(test("1.234", fixed, 1.2345));
- BOOST_TEST(test("12.345", fixed, 12.345));
- BOOST_TEST(test("123.45", fixed, 123.45));
- BOOST_TEST(test("1234.5", fixed, 1234.5));
- BOOST_TEST(test("12342.0", fixed, 12342.));
- BOOST_TEST(test("123420.0", fixed, 123420.));
- BOOST_TEST(test("123420000000000000000.0", fixed, 1.23420e20));
-
- BOOST_TEST(test("0.0", fixed, -0.000012345));
- BOOST_TEST(test("0.0", fixed, -0.00012345));
- BOOST_TEST(test("-0.001", fixed, -0.0012345));
- BOOST_TEST(test("-0.012", fixed, -0.012345));
- BOOST_TEST(test("-0.123", fixed, -0.12345));
- BOOST_TEST(test("-1.234", fixed, -1.2345));
- BOOST_TEST(test("-12.346", fixed, -12.346));
- BOOST_TEST(test("-123.46", fixed, -123.46));
- BOOST_TEST(test("-1234.5", fixed, -1234.5));
- BOOST_TEST(test("-12342.0", fixed, -12342.));
- BOOST_TEST(test("-123420.0", fixed, -123420.));
- BOOST_TEST(test("-123420000000000000000.0", fixed, -1.23420e20));
- }
-
- {
- BOOST_TEST(test("1.0", lit(1.0)));
- BOOST_TEST(test("1.0", lit(1.0f)));
- BOOST_TEST(test("1.0", lit(1.0l)));
-
- BOOST_TEST(test("1.0", double_(1.0), 1.0));
- BOOST_TEST(test("1.0", float_(1.0), 1.0f));
- BOOST_TEST(test("1.0", long_double(1.0), 1.0l));
- BOOST_TEST(!test("", double_(1.0), 2.0));
- BOOST_TEST(!test("", float_(1.0), 2.0f));
- BOOST_TEST(!test("", long_double(1.0), 2.0l));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- // test NaN and Inf
- BOOST_TEST(test("NAN", upper[double_],
- std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("-NAN", upper[double_],
- -std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("INF", upper[double_],
- std::numeric_limits<double>::infinity()));
- BOOST_TEST(test("-INF", upper[double_],
- -std::numeric_limits<double>::infinity()));
-
- typedef karma::real_generator<double, signed_policy<double> > signed_type;
- signed_type const signed_ = signed_type();
-
- BOOST_TEST(test("+NAN", upper[signed_],
- std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("-NAN", upper[signed_],
- -std::numeric_limits<double>::quiet_NaN()));
- BOOST_TEST(test("+INF", upper[signed_],
- std::numeric_limits<double>::infinity()));
- BOOST_TEST(test("-INF", upper[signed_],
- -std::numeric_limits<double>::infinity()));
- BOOST_TEST(test(" 0.0", upper[signed_], 0.0));
- }
-
-// support for using real_concept with a Karma generator has been implemented
-// in Boost versions > 1.36 only, additionally real_concept is available only
-// if BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS is not defined
-#if BOOST_VERSION > 103600 && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
- {
- using boost::math::concepts::real_concept;
- typedef karma::real_generator<real_concept> custom_type;
- custom_type const custom = custom_type();
-
- BOOST_TEST(test("0.0", custom, real_concept(0.0)));
- BOOST_TEST(test("1.0", custom, real_concept(1.0)));
- BOOST_TEST(test("1.0", custom, real_concept(1.0001)));
- BOOST_TEST(test("1.001", custom, real_concept(1.001)));
- BOOST_TEST(test("1.01", custom, real_concept(1.010)));
- BOOST_TEST(test("1.1", custom, real_concept(1.100)));
-
- BOOST_TEST(test("1.234e-04", custom, real_concept(0.00012345)));
- BOOST_TEST(test("0.001", custom, real_concept(0.0012345)));
- BOOST_TEST(test("0.012", custom, real_concept(0.012345)));
- BOOST_TEST(test("0.123", custom, real_concept(0.12345)));
- BOOST_TEST(test("1.234", custom, real_concept(1.2345)));
- BOOST_TEST(test("12.346", custom, real_concept(12.346)));
- BOOST_TEST(test("123.46", custom, real_concept(123.46)));
- BOOST_TEST(test("1234.5", custom, real_concept(1234.5)));
- BOOST_TEST(test("12342.0", custom, real_concept(12342.)));
- BOOST_TEST(test("1.234e05", custom, real_concept(123420.)));
-
- BOOST_TEST(test("-1.0", custom, real_concept(-1.0)));
- BOOST_TEST(test("-1.234", custom, real_concept(-1.2345)));
- BOOST_TEST(test("-1.235", custom, real_concept(-1.2346)));
- BOOST_TEST(test("-1234.2", custom, real_concept(-1234.2)));
-
- BOOST_TEST(test("1.0", custom(real_concept(1.0))));
- BOOST_TEST(test("1.0", custom(real_concept(1.0001))));
- BOOST_TEST(test("1.001", custom(real_concept(1.001))));
- BOOST_TEST(test("1.01", custom(real_concept(1.010))));
- BOOST_TEST(test("1.1", custom(real_concept(1.100))));
-
- BOOST_TEST(test("1.234e-04", custom(real_concept(0.00012345))));
- BOOST_TEST(test("0.001", custom(real_concept(0.0012345))));
- BOOST_TEST(test("0.012", custom(real_concept(0.012345))));
- BOOST_TEST(test("0.123", custom(real_concept(0.12345))));
- BOOST_TEST(test("1.234", custom(real_concept(1.2345))));
- BOOST_TEST(test("12.346", custom(real_concept(12.346))));
- BOOST_TEST(test("123.46", custom(real_concept(123.46))));
- BOOST_TEST(test("1234.5", custom(real_concept(1234.5))));
- BOOST_TEST(test("12342.0", custom(real_concept(12342.))));
- BOOST_TEST(test("1.234e05", custom(real_concept(123420.))));
- }
-#endif
-
-// this appears to be broken on Apple Tiger x86 with gcc4.0.1
-#if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ != 40001) || \
- !defined(__APPLE__)
- {
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, bordercase_policy<double> >
- bordercase_type;
- bordercase_type const bordercase = bordercase_type();
-
-// BOOST_TEST(test("-5.7222349715140557e307",
-// bordercase(-5.7222349715140557e307)));
-
- BOOST_TEST(test("1.7976931348623158e308",
- bordercase(1.7976931348623158e308))); // DBL_MAX
- BOOST_TEST(test("-1.7976931348623158e308",
- bordercase(-1.7976931348623158e308))); // -DBL_MAX
- BOOST_TEST(test("2.2250738585072014e-308",
- bordercase(2.2250738585072014e-308))); // DBL_MIN
- BOOST_TEST(test("-2.2250738585072014e-308",
- bordercase(-2.2250738585072014e-308))); // -DBL_MIN
- }
-#endif
-
- {
- boost::optional<double> v;
- BOOST_TEST(!test("", double_, v));
- BOOST_TEST(!test("", double_(1.0), v));
-
- v = 1.0;
- BOOST_TEST(test("1.0", double_, v));
- BOOST_TEST(test("1.0", double_(1.0), v));
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- { // Phoenix expression tests (requires to include
- // karma_phoenix_attributes.hpp)
- namespace phoenix = boost::phoenix;
-
- BOOST_TEST(test("1.0", double_, phoenix::val(1.0)));
-
- double d = 1.2;
- BOOST_TEST(test("1.2", double_, phoenix::ref(d)));
- BOOST_TEST(test("2.2", double_, ++phoenix::ref(d)));
- }
-#endif
-
- return boost::report_errors();
-}
Added: trunk/libs/spirit/test/karma/real_numerics.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/real_numerics.hpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,120 @@
+/*==============================================================================
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2010 Bryce Lelbach
+
+ Distributed under 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)
+==============================================================================*/
+
+#if !defined(BOOST_SPIRIT_TEST_REAL_NUMERICS_HPP)
+#define BOOST_SPIRIT_TEST_REAL_NUMERICS_HPP
+
+#include <boost/version.hpp>
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/math/concepts/real_concept.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include <limits>
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+// policy for real_generator, which forces the scientific notation
+template <typename T>
+struct scientific_policy : boost::spirit::karma::real_policies<T>
+{
+ // we want the numbers always to be in scientific format
+ typedef boost::spirit::karma::real_policies<T> base_type;
+ static int floatfield(T) { return base_type::fmtflags::scientific; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// policy for real_generator, which forces the fixed notation
+template <typename T>
+struct fixed_policy : boost::spirit::karma::real_policies<T>
+{
+ typedef boost::spirit::karma::real_policies<T> base_type;
+
+ // we want the numbers always to be in scientific format
+ static int floatfield(T) { return base_type::fmtflags::fixed; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// policy for real_generator, which forces to output trailing zeros in the
+// fractional part
+template <typename T>
+struct trailing_zeros_policy : boost::spirit::karma::real_policies<T> // 4 digits
+{
+ // we want the numbers always to contain trailing zeros up to 4 digits in
+ // the fractional part
+ static bool trailing_zeros(T) { return true; }
+
+ // we want to generate up to 4 fractional digits
+ static unsigned int precision(T) { return 4; }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// policy for real_generator, which forces the sign to be generated
+template <typename T>
+struct signed_policy : boost::spirit::karma::real_policies<T>
+{
+ // we want to always have a sign generated
+ static bool force_sign(T)
+ {
+ return true;
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// policy for real_generator, which forces to output trailing zeros in the
+// fractional part
+template <typename T>
+struct bordercase_policy : boost::spirit::karma::real_policies<T>
+{
+ // we want to generate up to the maximum significant amount of fractional
+ // digits
+ static unsigned int precision(T)
+ {
+ return std::numeric_limits<T>::digits10 + 1;
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// policy for real_generator, which forces to output trailing zeros in the
+// fractional part
+template <typename T>
+struct statefull_policy : boost::spirit::karma::real_policies<T>
+{
+ statefull_policy(int precision = 4, bool trailingzeros = false)
+ : precision_(precision), trailingzeros_(trailingzeros)
+ {}
+
+ // we want to generate up to the maximum significant amount of fractional
+ // digits
+ unsigned int precision(T) const
+ {
+ return precision_;
+ }
+
+ bool trailing_zeros(T) const
+ {
+ return trailingzeros_;
+ }
+
+ int precision_;
+ bool trailingzeros_;
+};
+
+#endif // BOOST_SPIRIT_TEST_REAL_NUMERICS_HPP
+
Copied: trunk/libs/spirit/test/karma/real_numerics1.cpp (from r67483, /trunk/libs/spirit/test/karma/real_numerics.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/real_numerics.cpp (original)
+++ trunk/libs/spirit/test/karma/real_numerics1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -1,116 +1,12 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2011 Bryce Lelbach
//
// Distributed under 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)
//#define KARMA_FAIL_COMPILATION
-#include <boost/version.hpp>
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/math/concepts/real_concept.hpp>
-
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_phoenix_attributes.hpp>
-
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include <limits>
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces the scientific notation
-template <typename T>
-struct scientific_policy : boost::spirit::karma::real_policies<T>
-{
- // we want the numbers always to be in scientific format
- typedef boost::spirit::karma::real_policies<T> base_type;
- static int floatfield(T) { return base_type::fmtflags::scientific; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces the fixed notation
-template <typename T>
-struct fixed_policy : boost::spirit::karma::real_policies<T>
-{
- typedef boost::spirit::karma::real_policies<T> base_type;
-
- // we want the numbers always to be in scientific format
- static int floatfield(T) { return base_type::fmtflags::fixed; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces to output trailing zeros in the
-// fractional part
-template <typename T>
-struct trailing_zeros_policy : boost::spirit::karma::real_policies<T> // 4 digits
-{
- // we want the numbers always to contain trailing zeros up to 4 digits in
- // the fractional part
- static bool trailing_zeros(T) { return true; }
-
- // we want to generate up to 4 fractional digits
- static unsigned int precision(T) { return 4; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces the sign to be generated
-template <typename T>
-struct signed_policy : boost::spirit::karma::real_policies<T>
-{
- // we want to always have a sign generated
- static bool force_sign(T)
- {
- return true;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces to output trailing zeros in the
-// fractional part
-template <typename T>
-struct bordercase_policy : boost::spirit::karma::real_policies<T>
-{
- // we want to generate up to the maximum significant amount of fractional
- // digits
- static unsigned int precision(T)
- {
- return std::numeric_limits<T>::digits10 + 1;
- }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// policy for real_generator, which forces to output trailing zeros in the
-// fractional part
-template <typename T>
-struct statefull_policy : boost::spirit::karma::real_policies<T>
-{
- statefull_policy(int precision = 4, bool trailingzeros = false)
- : precision_(precision), trailingzeros_(trailingzeros)
- {}
-
- // we want to generate up to the maximum significant amount of fractional
- // digits
- unsigned int precision(T) const
- {
- return precision_;
- }
-
- bool trailing_zeros(T) const
- {
- return trailingzeros_;
- }
-
- int precision_;
- bool trailingzeros_;
-};
+#include "real_numerics.hpp"
///////////////////////////////////////////////////////////////////////////////
int main()
@@ -246,190 +142,7 @@
BOOST_TEST(test("12342.0000", trail_zeros(12342.)));
BOOST_TEST(test("1.2342e05", trail_zeros(123420.)));
}
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- BOOST_TEST(test_delimited("0.0 ", double_, 0.0, char_(' ')));
- BOOST_TEST(test_delimited("1.0 ", double_, 1.0, char_(' ')));
- BOOST_TEST(test_delimited("1.0 ", double_, 1.0001, char_(' ')));
- BOOST_TEST(test_delimited("1.001 ", double_, 1.001, char_(' ')));
- BOOST_TEST(test_delimited("1.01 ", double_, 1.010, char_(' ')));
- BOOST_TEST(test_delimited("1.1 ", double_, 1.100, char_(' ')));
-
- BOOST_TEST(test_delimited("1.234e-04 ", double_, 0.00012345, char_(' ')));
- BOOST_TEST(test_delimited("0.001 ", double_, 0.0012345, char_(' ')));
- BOOST_TEST(test_delimited("0.012 ", double_, 0.012345, char_(' ')));
- BOOST_TEST(test_delimited("0.123 ", double_, 0.12345, char_(' ')));
- BOOST_TEST(test_delimited("1.234 ", double_, 1.2345, char_(' ')));
- BOOST_TEST(test_delimited("12.346 ", double_, 12.346, char_(' ')));
- BOOST_TEST(test_delimited("123.46 ", double_, 123.46, char_(' ')));
- BOOST_TEST(test_delimited("1234.5 ", double_, 1234.5, char_(' ')));
- BOOST_TEST(test_delimited("12342.0 ", double_, 12342., char_(' ')));
- BOOST_TEST(test_delimited("1.234e05 ", double_, 123420., char_(' ')));
-
- BOOST_TEST(test_delimited("-1.0 ", double_, -1.0, char_(' ')));
- BOOST_TEST(test_delimited("-1.234 ", double_, -1.2345, char_(' ')));
- BOOST_TEST(test_delimited("-1.235 ", double_, -1.2346, char_(' ')));
- BOOST_TEST(test_delimited("-1234.2 ", double_, -1234.2, char_(' ')));
-
- BOOST_TEST(test_delimited("1.0 ", double_(1.0), char_(' ')));
- BOOST_TEST(test_delimited("1.0 ", double_(1.0001), char_(' ')));
- BOOST_TEST(test_delimited("1.001 ", double_(1.001), char_(' ')));
- BOOST_TEST(test_delimited("1.01 ", double_(1.010), char_(' ')));
- BOOST_TEST(test_delimited("1.1 ", double_(1.100), char_(' ')));
-
- BOOST_TEST(test_delimited("1.234e-04 ", double_(0.00012345), char_(' ')));
- BOOST_TEST(test_delimited("0.001 ", double_(0.0012345), char_(' ')));
- BOOST_TEST(test_delimited("0.012 ", double_(0.012345), char_(' ')));
- BOOST_TEST(test_delimited("0.123 ", double_(0.12345), char_(' ')));
- BOOST_TEST(test_delimited("1.234 ", double_(1.2345), char_(' ')));
- BOOST_TEST(test_delimited("12.346 ", double_(12.346), char_(' ')));
- BOOST_TEST(test_delimited("123.46 ", double_(123.46), char_(' ')));
- BOOST_TEST(test_delimited("1234.5 ", double_(1234.5), char_(' ')));
- BOOST_TEST(test_delimited("12342.0 ", double_(12342.), char_(' ')));
- BOOST_TEST(test_delimited("1.234e05 ", double_(123420.), char_(' ')));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- // test NaN and Inf
- BOOST_TEST(test_delimited("nan ", double_,
- std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("-nan ", double_,
- -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("inf ", double_,
- std::numeric_limits<double>::infinity(), char_(' ')));
- BOOST_TEST(test_delimited("-inf ", double_,
- -std::numeric_limits<double>::infinity(), char_(' ')));
-
- typedef karma::real_generator<double, signed_policy<double> > signed_type;
- signed_type const signed_ = signed_type();
-
- BOOST_TEST(test_delimited("+nan ", signed_,
- std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("-nan ", signed_,
- -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
- BOOST_TEST(test_delimited("+inf ", signed_,
- std::numeric_limits<double>::infinity(), char_(' ')));
- BOOST_TEST(test_delimited("-inf ", signed_,
- -std::numeric_limits<double>::infinity(), char_(' ')));
- BOOST_TEST(test_delimited(" 0.0 ", signed_, 0.0, char_(' ')));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, scientific_policy<double> >
- science_type;
- science_type const science = science_type();
-
- BOOST_TEST(test("0.0e00", science, 0.0));
- BOOST_TEST(test("1.0e00", science, 1.0));
-
- BOOST_TEST(test("1.234e-05", science, 0.000012345));
- BOOST_TEST(test("1.234e-04", science, 0.00012345));
- BOOST_TEST(test("1.234e-03", science, 0.0012345));
- BOOST_TEST(test("1.234e-02", science, 0.012345));
- BOOST_TEST(test("1.235e-01", science, 0.12345)); // note the rounding error!
- BOOST_TEST(test("1.234e00", science, 1.2345));
- BOOST_TEST(test("1.235e01", science, 12.346));
- BOOST_TEST(test("1.235e02", science, 123.46));
- BOOST_TEST(test("1.234e03", science, 1234.5));
- BOOST_TEST(test("1.234e04", science, 12342.));
- BOOST_TEST(test("1.234e05", science, 123420.));
-
- BOOST_TEST(test("-1.234e-05", science, -0.000012345));
- BOOST_TEST(test("-1.234e-04", science, -0.00012345));
- BOOST_TEST(test("-1.234e-03", science, -0.0012345));
- BOOST_TEST(test("-1.234e-02", science, -0.012345));
- BOOST_TEST(test("-1.235e-01", science, -0.12345)); // note the rounding error!
- BOOST_TEST(test("-1.234e00", science, -1.2345));
- BOOST_TEST(test("-1.235e01", science, -12.346));
- BOOST_TEST(test("-1.235e02", science, -123.46));
- BOOST_TEST(test("-1.234e03", science, -1234.5));
- BOOST_TEST(test("-1.234e04", science, -12342.));
- BOOST_TEST(test("-1.234e05", science, -123420.));
-
- BOOST_TEST(test("1.234E-05", upper[science], 0.000012345));
- BOOST_TEST(test("1.234E-04", upper[science], 0.00012345));
- BOOST_TEST(test("1.234E-03", upper[science], 0.0012345));
- BOOST_TEST(test("1.234E-02", upper[science], 0.012345));
- BOOST_TEST(test("1.235E-01", upper[science], 0.12345)); // note the rounding error!
- BOOST_TEST(test("1.234E00", upper[science], 1.2345));
- BOOST_TEST(test("1.235E01", upper[science], 12.346));
- BOOST_TEST(test("1.235E02", upper[science], 123.46));
- BOOST_TEST(test("1.234E03", upper[science], 1234.5));
- BOOST_TEST(test("1.234E04", upper[science], 12342.));
- BOOST_TEST(test("1.234E05", upper[science], 123420.));
-
- BOOST_TEST(test("-1.234E-05", upper[science], -0.000012345));
- BOOST_TEST(test("-1.234E-04", upper[science], -0.00012345));
- BOOST_TEST(test("-1.234E-03", upper[science], -0.0012345));
- BOOST_TEST(test("-1.234E-02", upper[science], -0.012345));
- BOOST_TEST(test("-1.235E-01", upper[science], -0.12345)); // note the rounding error!
- BOOST_TEST(test("-1.234E00", upper[science], -1.2345));
- BOOST_TEST(test("-1.235E01", upper[science], -12.346));
- BOOST_TEST(test("-1.235E02", upper[science], -123.46));
- BOOST_TEST(test("-1.234E03", upper[science], -1234.5));
- BOOST_TEST(test("-1.234E04", upper[science], -12342.));
- BOOST_TEST(test("-1.234E05", upper[science], -123420.));
- }
-
- {
- using namespace boost::spirit::ascii;
-
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, fixed_policy<double> > fixed_type;
- fixed_type const fixed = fixed_type();
-
- BOOST_TEST(test("0.0", fixed, 0.0));
- BOOST_TEST(test("1.0", fixed, 1.0));
-
- BOOST_TEST(test("0.0", fixed, 0.000012345));
- BOOST_TEST(test("0.0", fixed, 0.00012345));
- BOOST_TEST(test("0.001", fixed, 0.0012345));
- BOOST_TEST(test("0.012", fixed, 0.012345));
- BOOST_TEST(test("0.123", fixed, 0.12345));
- BOOST_TEST(test("1.234", fixed, 1.2345));
- BOOST_TEST(test("12.345", fixed, 12.345));
- BOOST_TEST(test("123.45", fixed, 123.45));
- BOOST_TEST(test("1234.5", fixed, 1234.5));
- BOOST_TEST(test("12342.0", fixed, 12342.));
- BOOST_TEST(test("123420.0", fixed, 123420.));
- BOOST_TEST(test("123420000000000000000.0", fixed, 1.23420e20));
-
- BOOST_TEST(test("0.0", fixed, -0.000012345));
- BOOST_TEST(test("0.0", fixed, -0.00012345));
- BOOST_TEST(test("-0.001", fixed, -0.0012345));
- BOOST_TEST(test("-0.012", fixed, -0.012345));
- BOOST_TEST(test("-0.123", fixed, -0.12345));
- BOOST_TEST(test("-1.234", fixed, -1.2345));
- BOOST_TEST(test("-12.346", fixed, -12.346));
- BOOST_TEST(test("-123.46", fixed, -123.46));
- BOOST_TEST(test("-1234.5", fixed, -1234.5));
- BOOST_TEST(test("-12342.0", fixed, -12342.));
- BOOST_TEST(test("-123420.0", fixed, -123420.));
- BOOST_TEST(test("-123420000000000000000.0", fixed, -1.23420e20));
- }
-
- {
- BOOST_TEST(test("1.0", lit(1.0)));
- BOOST_TEST(test("1.0", lit(1.0f)));
- BOOST_TEST(test("1.0", lit(1.0l)));
-
- BOOST_TEST(test("1.0", double_(1.0), 1.0));
- BOOST_TEST(test("1.0", float_(1.0), 1.0f));
- BOOST_TEST(test("1.0", long_double(1.0), 1.0l));
- BOOST_TEST(!test("", double_(1.0), 2.0));
- BOOST_TEST(!test("", float_(1.0), 2.0f));
- BOOST_TEST(!test("", long_double(1.0), 2.0l));
- }
-
+
{
using namespace boost::spirit::ascii;
@@ -458,103 +171,7 @@
BOOST_TEST(test(" 0.0", upper[signed_], 0.0));
}
-// support for using real_concept with a Karma generator has been implemented
-// in Boost versions > 1.36 only, additionally real_concept is available only
-// if BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS is not defined
-#if BOOST_VERSION > 103600 && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
- {
- using boost::math::concepts::real_concept;
- typedef karma::real_generator<real_concept> custom_type;
- custom_type const custom = custom_type();
-
- BOOST_TEST(test("0.0", custom, real_concept(0.0)));
- BOOST_TEST(test("1.0", custom, real_concept(1.0)));
- BOOST_TEST(test("1.0", custom, real_concept(1.0001)));
- BOOST_TEST(test("1.001", custom, real_concept(1.001)));
- BOOST_TEST(test("1.01", custom, real_concept(1.010)));
- BOOST_TEST(test("1.1", custom, real_concept(1.100)));
-
- BOOST_TEST(test("1.234e-04", custom, real_concept(0.00012345)));
- BOOST_TEST(test("0.001", custom, real_concept(0.0012345)));
- BOOST_TEST(test("0.012", custom, real_concept(0.012345)));
- BOOST_TEST(test("0.123", custom, real_concept(0.12345)));
- BOOST_TEST(test("1.234", custom, real_concept(1.2345)));
- BOOST_TEST(test("12.346", custom, real_concept(12.346)));
- BOOST_TEST(test("123.46", custom, real_concept(123.46)));
- BOOST_TEST(test("1234.5", custom, real_concept(1234.5)));
- BOOST_TEST(test("12342.0", custom, real_concept(12342.)));
- BOOST_TEST(test("1.234e05", custom, real_concept(123420.)));
-
- BOOST_TEST(test("-1.0", custom, real_concept(-1.0)));
- BOOST_TEST(test("-1.234", custom, real_concept(-1.2345)));
- BOOST_TEST(test("-1.235", custom, real_concept(-1.2346)));
- BOOST_TEST(test("-1234.2", custom, real_concept(-1234.2)));
-
- BOOST_TEST(test("1.0", custom(real_concept(1.0))));
- BOOST_TEST(test("1.0", custom(real_concept(1.0001))));
- BOOST_TEST(test("1.001", custom(real_concept(1.001))));
- BOOST_TEST(test("1.01", custom(real_concept(1.010))));
- BOOST_TEST(test("1.1", custom(real_concept(1.100))));
-
- BOOST_TEST(test("1.234e-04", custom(real_concept(0.00012345))));
- BOOST_TEST(test("0.001", custom(real_concept(0.0012345))));
- BOOST_TEST(test("0.012", custom(real_concept(0.012345))));
- BOOST_TEST(test("0.123", custom(real_concept(0.12345))));
- BOOST_TEST(test("1.234", custom(real_concept(1.2345))));
- BOOST_TEST(test("12.346", custom(real_concept(12.346))));
- BOOST_TEST(test("123.46", custom(real_concept(123.46))));
- BOOST_TEST(test("1234.5", custom(real_concept(1234.5))));
- BOOST_TEST(test("12342.0", custom(real_concept(12342.))));
- BOOST_TEST(test("1.234e05", custom(real_concept(123420.))));
- }
-#endif
-
-// this appears to be broken on Apple Tiger x86 with gcc4.0.1
-#if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ != 40001) || \
- !defined(__APPLE__)
- {
- ///////////////////////////////////////////////////////////////////////
- typedef karma::real_generator<double, bordercase_policy<double> >
- bordercase_type;
- bordercase_type const bordercase = bordercase_type();
-
-// BOOST_TEST(test("-5.7222349715140557e307",
-// bordercase(-5.7222349715140557e307)));
-
- BOOST_TEST(test("1.7976931348623158e308",
- bordercase(1.7976931348623158e308))); // DBL_MAX
- BOOST_TEST(test("-1.7976931348623158e308",
- bordercase(-1.7976931348623158e308))); // -DBL_MAX
- BOOST_TEST(test("2.2250738585072014e-308",
- bordercase(2.2250738585072014e-308))); // DBL_MIN
- BOOST_TEST(test("-2.2250738585072014e-308",
- bordercase(-2.2250738585072014e-308))); // -DBL_MIN
- }
-#endif
-
- {
- boost::optional<double> v;
- BOOST_TEST(!test("", double_, v));
- BOOST_TEST(!test("", double_(1.0), v));
-
- v = 1.0;
- BOOST_TEST(test("1.0", double_, v));
- BOOST_TEST(test("1.0", double_(1.0), v));
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- { // Phoenix expression tests (requires to include
- // karma_phoenix_attributes.hpp)
- namespace phoenix = boost::phoenix;
-
- BOOST_TEST(test("1.0", double_, phoenix::val(1.0)));
-
- double d = 1.2;
- BOOST_TEST(test("1.2", double_, phoenix::ref(d)));
- BOOST_TEST(test("2.2", double_, ++phoenix::ref(d)));
- }
-#endif
return boost::report_errors();
}
+
Added: trunk/libs/spirit/test/karma/real_numerics2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/real_numerics2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,164 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2011 Bryce Lelbach
+//
+// Distributed under 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)
+
+//#define KARMA_FAIL_COMPILATION
+
+#include "real_numerics.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ using namespace boost::spirit;
+
+ {
+ using namespace boost::spirit::ascii;
+
+ ///////////////////////////////////////////////////////////////////////
+ BOOST_TEST(test_delimited("0.0 ", double_, 0.0, char_(' ')));
+ BOOST_TEST(test_delimited("1.0 ", double_, 1.0, char_(' ')));
+ BOOST_TEST(test_delimited("1.0 ", double_, 1.0001, char_(' ')));
+ BOOST_TEST(test_delimited("1.001 ", double_, 1.001, char_(' ')));
+ BOOST_TEST(test_delimited("1.01 ", double_, 1.010, char_(' ')));
+ BOOST_TEST(test_delimited("1.1 ", double_, 1.100, char_(' ')));
+
+ BOOST_TEST(test_delimited("1.234e-04 ", double_, 0.00012345, char_(' ')));
+ BOOST_TEST(test_delimited("0.001 ", double_, 0.0012345, char_(' ')));
+ BOOST_TEST(test_delimited("0.012 ", double_, 0.012345, char_(' ')));
+ BOOST_TEST(test_delimited("0.123 ", double_, 0.12345, char_(' ')));
+ BOOST_TEST(test_delimited("1.234 ", double_, 1.2345, char_(' ')));
+ BOOST_TEST(test_delimited("12.346 ", double_, 12.346, char_(' ')));
+ BOOST_TEST(test_delimited("123.46 ", double_, 123.46, char_(' ')));
+ BOOST_TEST(test_delimited("1234.5 ", double_, 1234.5, char_(' ')));
+ BOOST_TEST(test_delimited("12342.0 ", double_, 12342., char_(' ')));
+ BOOST_TEST(test_delimited("1.234e05 ", double_, 123420., char_(' ')));
+
+ BOOST_TEST(test_delimited("-1.0 ", double_, -1.0, char_(' ')));
+ BOOST_TEST(test_delimited("-1.234 ", double_, -1.2345, char_(' ')));
+ BOOST_TEST(test_delimited("-1.235 ", double_, -1.2346, char_(' ')));
+ BOOST_TEST(test_delimited("-1234.2 ", double_, -1234.2, char_(' ')));
+
+ BOOST_TEST(test_delimited("1.0 ", double_(1.0), char_(' ')));
+ BOOST_TEST(test_delimited("1.0 ", double_(1.0001), char_(' ')));
+ BOOST_TEST(test_delimited("1.001 ", double_(1.001), char_(' ')));
+ BOOST_TEST(test_delimited("1.01 ", double_(1.010), char_(' ')));
+ BOOST_TEST(test_delimited("1.1 ", double_(1.100), char_(' ')));
+
+ BOOST_TEST(test_delimited("1.234e-04 ", double_(0.00012345), char_(' ')));
+ BOOST_TEST(test_delimited("0.001 ", double_(0.0012345), char_(' ')));
+ BOOST_TEST(test_delimited("0.012 ", double_(0.012345), char_(' ')));
+ BOOST_TEST(test_delimited("0.123 ", double_(0.12345), char_(' ')));
+ BOOST_TEST(test_delimited("1.234 ", double_(1.2345), char_(' ')));
+ BOOST_TEST(test_delimited("12.346 ", double_(12.346), char_(' ')));
+ BOOST_TEST(test_delimited("123.46 ", double_(123.46), char_(' ')));
+ BOOST_TEST(test_delimited("1234.5 ", double_(1234.5), char_(' ')));
+ BOOST_TEST(test_delimited("12342.0 ", double_(12342.), char_(' ')));
+ BOOST_TEST(test_delimited("1.234e05 ", double_(123420.), char_(' ')));
+ }
+
+ {
+ using namespace boost::spirit::ascii;
+
+ ///////////////////////////////////////////////////////////////////////
+ // test NaN and Inf
+ BOOST_TEST(test_delimited("nan ", double_,
+ std::numeric_limits<double>::quiet_NaN(), char_(' ')));
+ BOOST_TEST(test_delimited("-nan ", double_,
+ -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
+ BOOST_TEST(test_delimited("inf ", double_,
+ std::numeric_limits<double>::infinity(), char_(' ')));
+ BOOST_TEST(test_delimited("-inf ", double_,
+ -std::numeric_limits<double>::infinity(), char_(' ')));
+
+ typedef karma::real_generator<double, signed_policy<double> > signed_type;
+ signed_type const signed_ = signed_type();
+
+ BOOST_TEST(test_delimited("+nan ", signed_,
+ std::numeric_limits<double>::quiet_NaN(), char_(' ')));
+ BOOST_TEST(test_delimited("-nan ", signed_,
+ -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
+ BOOST_TEST(test_delimited("+inf ", signed_,
+ std::numeric_limits<double>::infinity(), char_(' ')));
+ BOOST_TEST(test_delimited("-inf ", signed_,
+ -std::numeric_limits<double>::infinity(), char_(' ')));
+ BOOST_TEST(test_delimited(" 0.0 ", signed_, 0.0, char_(' ')));
+ }
+
+ {
+ using namespace boost::spirit::ascii;
+
+ ///////////////////////////////////////////////////////////////////////
+ typedef karma::real_generator<double, scientific_policy<double> >
+ science_type;
+ science_type const science = science_type();
+
+ BOOST_TEST(test("0.0e00", science, 0.0));
+ BOOST_TEST(test("1.0e00", science, 1.0));
+
+ BOOST_TEST(test("1.234e-05", science, 0.000012345));
+ BOOST_TEST(test("1.234e-04", science, 0.00012345));
+ BOOST_TEST(test("1.234e-03", science, 0.0012345));
+ BOOST_TEST(test("1.234e-02", science, 0.012345));
+ BOOST_TEST(test("1.235e-01", science, 0.12345)); // note the rounding error!
+ BOOST_TEST(test("1.234e00", science, 1.2345));
+ BOOST_TEST(test("1.235e01", science, 12.346));
+ BOOST_TEST(test("1.235e02", science, 123.46));
+ BOOST_TEST(test("1.234e03", science, 1234.5));
+ BOOST_TEST(test("1.234e04", science, 12342.));
+ BOOST_TEST(test("1.234e05", science, 123420.));
+
+ BOOST_TEST(test("-1.234e-05", science, -0.000012345));
+ BOOST_TEST(test("-1.234e-04", science, -0.00012345));
+ BOOST_TEST(test("-1.234e-03", science, -0.0012345));
+ BOOST_TEST(test("-1.234e-02", science, -0.012345));
+ BOOST_TEST(test("-1.235e-01", science, -0.12345)); // note the rounding error!
+ BOOST_TEST(test("-1.234e00", science, -1.2345));
+ BOOST_TEST(test("-1.235e01", science, -12.346));
+ BOOST_TEST(test("-1.235e02", science, -123.46));
+ BOOST_TEST(test("-1.234e03", science, -1234.5));
+ BOOST_TEST(test("-1.234e04", science, -12342.));
+ BOOST_TEST(test("-1.234e05", science, -123420.));
+
+ BOOST_TEST(test("1.234E-05", upper[science], 0.000012345));
+ BOOST_TEST(test("1.234E-04", upper[science], 0.00012345));
+ BOOST_TEST(test("1.234E-03", upper[science], 0.0012345));
+ BOOST_TEST(test("1.234E-02", upper[science], 0.012345));
+ BOOST_TEST(test("1.235E-01", upper[science], 0.12345)); // note the rounding error!
+ BOOST_TEST(test("1.234E00", upper[science], 1.2345));
+ BOOST_TEST(test("1.235E01", upper[science], 12.346));
+ BOOST_TEST(test("1.235E02", upper[science], 123.46));
+ BOOST_TEST(test("1.234E03", upper[science], 1234.5));
+ BOOST_TEST(test("1.234E04", upper[science], 12342.));
+ BOOST_TEST(test("1.234E05", upper[science], 123420.));
+
+ BOOST_TEST(test("-1.234E-05", upper[science], -0.000012345));
+ BOOST_TEST(test("-1.234E-04", upper[science], -0.00012345));
+ BOOST_TEST(test("-1.234E-03", upper[science], -0.0012345));
+ BOOST_TEST(test("-1.234E-02", upper[science], -0.012345));
+ BOOST_TEST(test("-1.235E-01", upper[science], -0.12345)); // note the rounding error!
+ BOOST_TEST(test("-1.234E00", upper[science], -1.2345));
+ BOOST_TEST(test("-1.235E01", upper[science], -12.346));
+ BOOST_TEST(test("-1.235E02", upper[science], -123.46));
+ BOOST_TEST(test("-1.234E03", upper[science], -1234.5));
+ BOOST_TEST(test("-1.234E04", upper[science], -12342.));
+ BOOST_TEST(test("-1.234E05", upper[science], -123420.));
+ }
+
+ {
+ BOOST_TEST(test("1.0", lit(1.0)));
+ BOOST_TEST(test("1.0", lit(1.0f)));
+ BOOST_TEST(test("1.0", lit(1.0l)));
+
+ BOOST_TEST(test("1.0", double_(1.0), 1.0));
+ BOOST_TEST(test("1.0", float_(1.0), 1.0f));
+ BOOST_TEST(test("1.0", long_double(1.0), 1.0l));
+ BOOST_TEST(!test("", double_(1.0), 2.0));
+ BOOST_TEST(!test("", float_(1.0), 2.0f));
+ BOOST_TEST(!test("", long_double(1.0), 2.0l));
+ }
+
+ return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/karma/real_numerics3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/real_numerics3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,154 @@
+// Copyright (c) 2001-2011 Hartmut Kaiser
+// Copyright (c) 2011 Bryce Lelbach
+//
+// Distributed under 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)
+
+//#define KARMA_FAIL_COMPILATION
+
+#include "real_numerics.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ using namespace boost::spirit;
+
+ {
+ using namespace boost::spirit::ascii;
+
+ ///////////////////////////////////////////////////////////////////////
+ typedef karma::real_generator<double, fixed_policy<double> > fixed_type;
+ fixed_type const fixed = fixed_type();
+
+ BOOST_TEST(test("0.0", fixed, 0.0));
+ BOOST_TEST(test("1.0", fixed, 1.0));
+
+ BOOST_TEST(test("0.0", fixed, 0.000012345));
+ BOOST_TEST(test("0.0", fixed, 0.00012345));
+ BOOST_TEST(test("0.001", fixed, 0.0012345));
+ BOOST_TEST(test("0.012", fixed, 0.012345));
+ BOOST_TEST(test("0.123", fixed, 0.12345));
+ BOOST_TEST(test("1.234", fixed, 1.2345));
+ BOOST_TEST(test("12.345", fixed, 12.345));
+ BOOST_TEST(test("123.45", fixed, 123.45));
+ BOOST_TEST(test("1234.5", fixed, 1234.5));
+ BOOST_TEST(test("12342.0", fixed, 12342.));
+ BOOST_TEST(test("123420.0", fixed, 123420.));
+ BOOST_TEST(test("123420000000000000000.0", fixed, 1.23420e20));
+
+ BOOST_TEST(test("0.0", fixed, -0.000012345));
+ BOOST_TEST(test("0.0", fixed, -0.00012345));
+ BOOST_TEST(test("-0.001", fixed, -0.0012345));
+ BOOST_TEST(test("-0.012", fixed, -0.012345));
+ BOOST_TEST(test("-0.123", fixed, -0.12345));
+ BOOST_TEST(test("-1.234", fixed, -1.2345));
+ BOOST_TEST(test("-12.346", fixed, -12.346));
+ BOOST_TEST(test("-123.46", fixed, -123.46));
+ BOOST_TEST(test("-1234.5", fixed, -1234.5));
+ BOOST_TEST(test("-12342.0", fixed, -12342.));
+ BOOST_TEST(test("-123420.0", fixed, -123420.));
+ BOOST_TEST(test("-123420000000000000000.0", fixed, -1.23420e20));
+ }
+
+
+// support for using real_concept with a Karma generator has been implemented
+// in Boost versions > 1.36 only, additionally real_concept is available only
+// if BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS is not defined
+#if BOOST_VERSION > 103600 && !defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)
+ {
+ using boost::math::concepts::real_concept;
+ typedef karma::real_generator<real_concept> custom_type;
+ custom_type const custom = custom_type();
+
+ BOOST_TEST(test("0.0", custom, real_concept(0.0)));
+ BOOST_TEST(test("1.0", custom, real_concept(1.0)));
+ BOOST_TEST(test("1.0", custom, real_concept(1.0001)));
+ BOOST_TEST(test("1.001", custom, real_concept(1.001)));
+ BOOST_TEST(test("1.01", custom, real_concept(1.010)));
+ BOOST_TEST(test("1.1", custom, real_concept(1.100)));
+
+ BOOST_TEST(test("1.234e-04", custom, real_concept(0.00012345)));
+ BOOST_TEST(test("0.001", custom, real_concept(0.0012345)));
+ BOOST_TEST(test("0.012", custom, real_concept(0.012345)));
+ BOOST_TEST(test("0.123", custom, real_concept(0.12345)));
+ BOOST_TEST(test("1.234", custom, real_concept(1.2345)));
+ BOOST_TEST(test("12.346", custom, real_concept(12.346)));
+ BOOST_TEST(test("123.46", custom, real_concept(123.46)));
+ BOOST_TEST(test("1234.5", custom, real_concept(1234.5)));
+ BOOST_TEST(test("12342.0", custom, real_concept(12342.)));
+ BOOST_TEST(test("1.234e05", custom, real_concept(123420.)));
+
+ BOOST_TEST(test("-1.0", custom, real_concept(-1.0)));
+ BOOST_TEST(test("-1.234", custom, real_concept(-1.2345)));
+ BOOST_TEST(test("-1.235", custom, real_concept(-1.2346)));
+ BOOST_TEST(test("-1234.2", custom, real_concept(-1234.2)));
+
+ BOOST_TEST(test("1.0", custom(real_concept(1.0))));
+ BOOST_TEST(test("1.0", custom(real_concept(1.0001))));
+ BOOST_TEST(test("1.001", custom(real_concept(1.001))));
+ BOOST_TEST(test("1.01", custom(real_concept(1.010))));
+ BOOST_TEST(test("1.1", custom(real_concept(1.100))));
+
+ BOOST_TEST(test("1.234e-04", custom(real_concept(0.00012345))));
+ BOOST_TEST(test("0.001", custom(real_concept(0.0012345))));
+ BOOST_TEST(test("0.012", custom(real_concept(0.012345))));
+ BOOST_TEST(test("0.123", custom(real_concept(0.12345))));
+ BOOST_TEST(test("1.234", custom(real_concept(1.2345))));
+ BOOST_TEST(test("12.346", custom(real_concept(12.346))));
+ BOOST_TEST(test("123.46", custom(real_concept(123.46))));
+ BOOST_TEST(test("1234.5", custom(real_concept(1234.5))));
+ BOOST_TEST(test("12342.0", custom(real_concept(12342.))));
+ BOOST_TEST(test("1.234e05", custom(real_concept(123420.))));
+ }
+#endif
+
+// this appears to be broken on Apple Tiger x86 with gcc4.0.1
+#if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ != 40001) || \
+ !defined(__APPLE__)
+ {
+ ///////////////////////////////////////////////////////////////////////
+ typedef karma::real_generator<double, bordercase_policy<double> >
+ bordercase_type;
+ bordercase_type const bordercase = bordercase_type();
+
+// BOOST_TEST(test("-5.7222349715140557e307",
+// bordercase(-5.7222349715140557e307)));
+
+ BOOST_TEST(test("1.7976931348623158e308",
+ bordercase(1.7976931348623158e308))); // DBL_MAX
+ BOOST_TEST(test("-1.7976931348623158e308",
+ bordercase(-1.7976931348623158e308))); // -DBL_MAX
+ BOOST_TEST(test("2.2250738585072014e-308",
+ bordercase(2.2250738585072014e-308))); // DBL_MIN
+ BOOST_TEST(test("-2.2250738585072014e-308",
+ bordercase(-2.2250738585072014e-308))); // -DBL_MIN
+ }
+#endif
+
+ {
+ boost::optional<double> v;
+ BOOST_TEST(!test("", double_, v));
+ BOOST_TEST(!test("", double_(1.0), v));
+
+ v = 1.0;
+ BOOST_TEST(test("1.0", double_, v));
+ BOOST_TEST(test("1.0", double_(1.0), v));
+ }
+
+// we support Phoenix attributes only starting with V2.2
+#if SPIRIT_VERSION >= 0x2020
+ { // Phoenix expression tests (requires to include
+ // karma_phoenix_attributes.hpp)
+ namespace phoenix = boost::phoenix;
+
+ BOOST_TEST(test("1.0", double_, phoenix::val(1.0)));
+
+ double d = 1.2;
+ BOOST_TEST(test("1.2", double_, phoenix::ref(d)));
+ BOOST_TEST(test("2.2", double_, ++phoenix::ref(d)));
+ }
+#endif
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/karma/real_scientific.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/real_scientific.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,40 +0,0 @@
-// Copyright (c) 2010 Lars Kielhorn
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/karma.hpp>
-
-#include <iostream>
-#include <string>
-#include <iterator>
-
-namespace karma = boost::spirit::karma;
-
-// define a new real number formatting policy
-template <typename Num>
-struct scientific_policy : karma::real_policies<Num>
-{
- // we want the numbers always to be in scientific format
- static int floatfield(Num n) { return std::ios_base::scientific; }
-};
-
-int main()
-{
- // define a new generator type based on the new policy
- typedef karma::real_generator<double, scientific_policy<double> >
- science_type;
- science_type const scientific = science_type();
-
- std::string output;
- typedef std::back_insert_iterator<std::string> output_iterator;
- output_iterator sink(output);
-
- // should output: 1.0e-01, but will output: 10.0e-02
- BOOST_TEST(karma::generate(sink, scientific, 0.1) && output == "1.0e-01");
-
- return boost::report_errors();
-};
Deleted: trunk/libs/spirit/test/karma/repeat.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/repeat.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,240 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/assign/std/vector.hpp>
-
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_auxiliary.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_phoenix_attributes.hpp>
-#include <boost/spirit/include/support_argument.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-#include <boost/fusion/include/std_pair.hpp>
-
-#include <string>
-#include <iostream>
-#include <vector>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-struct action
-{
- action (std::vector<char>& vec)
- : vec(vec), it(vec.begin())
- {}
-
- void operator()(unsigned& value, boost::spirit::unused_type, bool& pass) const
- {
- pass = (it != vec.end());
- if (pass)
- value = *it++;
- }
-
- std::vector<char>& vec;
- mutable std::vector<char>::iterator it;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- using namespace boost::spirit::ascii;
- using boost::spirit::karma::repeat;
- using boost::spirit::karma::inf;
- using boost::spirit::karma::int_;
- using boost::spirit::karma::hex;
- using boost::spirit::karma::_1;
-
- {
- std::string str8("aaaaaaaa");
- BOOST_TEST(test("aaaaaaaa", repeat[char_], str8)); // kleene synonym
- BOOST_TEST(test("aaaaaaaa", repeat(8)[char_], str8));
- BOOST_TEST(test("aaa", repeat(3)[char_], str8));
- BOOST_TEST(!test("aaaaaaaa", repeat(9)[char_], str8));
-
- std::string str3("aaa");
- BOOST_TEST(test("aaaaa", repeat(3, 5)[char_], str8));
- BOOST_TEST(test("aaa", repeat(3, 5)[char_], str3));
- BOOST_TEST(!test("aaa", repeat(4, 5)[char_], str3));
-
- BOOST_TEST(test("aaa", repeat(3, inf)[char_], str3));
- BOOST_TEST(test("aaaaaaaa", repeat(3, inf)[char_], str8));
- BOOST_TEST(!test("aaa", repeat(4, inf)[char_], str3));
- }
-
- {
- std::string str8("aaaaaaaa");
- BOOST_TEST(test_delimited("a a a a a a a a ", repeat[char_], str8, space));
- BOOST_TEST(test_delimited("a a a a a a a a ", repeat(8)[char_], str8, space));
- BOOST_TEST(test_delimited("a a a ", repeat(3)[char_], str8, space));
- BOOST_TEST(!test_delimited("a a a a a a a a ", repeat(9)[char_], str8, space));
-
- std::string str3("aaa");
- BOOST_TEST(test_delimited("a a a a a ", repeat(3, 5)[char_], str8, space));
- BOOST_TEST(test_delimited("a a a ", repeat(3, 5)[char_], str3, space));
- BOOST_TEST(!test_delimited("a a a ", repeat(4, 5)[char_], str3, space));
-
- BOOST_TEST(test_delimited("a a a ", repeat(3, inf)[char_], str3, space));
- BOOST_TEST(test_delimited("a a a a a a a a ", repeat(3, inf)[char_], str8, space));
- BOOST_TEST(!test_delimited("a a a ", repeat(4, inf)[char_], str3, space));
- }
-
- { // lazy repeats
- using boost::phoenix::val;
-
- std::string str8("aaaaaaaa");
- BOOST_TEST(test("aaaaaaaa", repeat[char_], str8)); // kleene synonym
- BOOST_TEST(test("aaaaaaaa", repeat(val(8))[char_], str8));
- BOOST_TEST(test("aaa", repeat(val(3))[char_], str8));
- BOOST_TEST(!test("aaaaaaaa", repeat(val(9))[char_], str8));
-
- std::string str3("aaa");
- BOOST_TEST(test("aaaaa", repeat(val(3), val(5))[char_], str8));
- BOOST_TEST(test("aaa", repeat(val(3), val(5))[char_], str3));
- BOOST_TEST(!test("aaa", repeat(val(4), val(5))[char_], str3));
-
- BOOST_TEST(test("aaa", repeat(val(3), val(inf))[char_], str3));
- BOOST_TEST(test("aaaaaaaa", repeat(val(3), val(inf))[char_], str8));
- BOOST_TEST(!test("aaa", repeat(val(4), val(inf))[char_], str3));
- }
-
- {
- std::string str("aBcdeFGH");
- BOOST_TEST(test("abcdefgh", lower[repeat(8)[char_]], str));
- BOOST_TEST(test_delimited("A B C D E F G H ", upper[repeat(8)[char_]], str, space));
- }
-
- { // actions
- namespace phx = boost::phoenix;
-
- std::vector<char> v;
- v.push_back('a');
- v.push_back('a');
- v.push_back('a');
- v.push_back('a');
- BOOST_TEST(test("aaaa", repeat(4)[char_][_1 = phx::ref(v)]));
- }
-
- { // more actions
- namespace phx = boost::phoenix;
-
- std::vector<int> v;
- v.push_back(123);
- v.push_back(456);
- v.push_back(789);
- BOOST_TEST(test_delimited("123 456 789 ", repeat(3)[int_][_1 = phx::ref(v)], space));
- }
-
- // failing sub-generators
- {
- using boost::spirit::karma::strict;
- using boost::spirit::karma::relaxed;
-
- using namespace boost::assign;
- namespace karma = boost::spirit::karma;
-
- typedef std::pair<char, char> data;
- std::vector<data> v2, v3;
- v2 += std::make_pair('a', 'a'),
- std::make_pair('b', 'b'),
- std::make_pair('c', 'c'),
- std::make_pair('d', 'd'),
- std::make_pair('e', 'e'),
- std::make_pair('f', 'f'),
- std::make_pair('g', 'g');
- v3 += std::make_pair('a', 'a'),
- std::make_pair('b', 'b'),
- std::make_pair('c', 'c'),
- std::make_pair('d', 'd');
-
- karma::rule<spirit_test::output_iterator<char>::type, data()> r;
-
- r = &char_('d') << char_;
- BOOST_TEST(test("d", repeat[r], v2));
- BOOST_TEST(test("d", relaxed[repeat[r]], v2));
- BOOST_TEST(test("", strict[repeat[r]], v2));
-
- r = !char_('d') << char_;
- BOOST_TEST(test("abcefg", repeat(6)[r], v2));
- BOOST_TEST(!test("", repeat(5)[r], v2));
- BOOST_TEST(test("abcefg", relaxed[repeat(6)[r]], v2));
- BOOST_TEST(!test("", relaxed[repeat(5)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(6)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(5)[r]], v2));
-
- r = !char_('c') << char_;
- BOOST_TEST(test("abd", repeat(3)[r], v2));
- BOOST_TEST(test("abd", relaxed[repeat(3)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(3)[r]], v2));
-
- r = !char_('a') << char_;
- BOOST_TEST(test("bcdef", repeat(3, 5)[r], v2));
- BOOST_TEST(test("bcd", repeat(3, 5)[r], v3));
- BOOST_TEST(!test("", repeat(4, 5)[r], v3));
- BOOST_TEST(test("bcdef", relaxed[repeat(3, 5)[r]], v2));
- BOOST_TEST(test("bcd", relaxed[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", relaxed[repeat(4, 5)[r]], v3));
- BOOST_TEST(!test("", strict[repeat(3, 5)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", strict[repeat(4, 5)[r]], v3));
-
- BOOST_TEST(test("bcd", repeat(3, inf)[r], v3));
- BOOST_TEST(test("bcdefg", repeat(3, inf)[r], v2));
- BOOST_TEST(!test("", repeat(4, inf)[r], v3));
-
- r = !char_('g') << char_;
- BOOST_TEST(test("abcde", repeat(3, 5)[r], v2));
- BOOST_TEST(test("abcd", repeat(3, 5)[r], v3));
- BOOST_TEST(!test("", repeat(4, 5)[r], v3));
- BOOST_TEST(test("abcde", relaxed[repeat(3, 5)[r]], v2));
- BOOST_TEST(test("abcd", relaxed[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", relaxed[repeat(4, 5)[r]], v3));
- BOOST_TEST(test("abcde", strict[repeat(3, 5)[r]], v2));
- BOOST_TEST(test("abcd", strict[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", strict[repeat(5)[r]], v3));
- }
-
- {
- // make sure user defined end condition is applied if no attribute
- // is passed in
- using namespace boost::assign;
-
- std::vector<char> v;
- v += 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h';
- BOOST_TEST(test("[6162636465666768]",
- '[' << repeat[hex[action(v)]] << ']'));
- }
-
-// we support Phoenix attributes only starting with V2.2
-#if SPIRIT_VERSION >= 0x2020
- {
- namespace ascii = boost::spirit::ascii;
- namespace phoenix = boost::phoenix;
-
- char c = 'a';
- BOOST_TEST(test("bcd", repeat(3)[ascii::char_[_1 = ++phoenix::ref(c)]]));
-
- c = 'a';
- BOOST_TEST(test("bcd", repeat(3)[ascii::char_], ++phoenix::ref(c)));
- }
-#endif
-
- return boost::report_errors();
-}
-
Copied: trunk/libs/spirit/test/karma/repeat1.cpp (from r67483, /trunk/libs/spirit/test/karma/repeat.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/repeat.cpp (original)
+++ trunk/libs/spirit/test/karma/repeat1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -60,6 +60,26 @@
using boost::spirit::karma::int_;
using boost::spirit::karma::hex;
using boost::spirit::karma::_1;
+
+ { // lazy repeats
+ using boost::phoenix::val;
+
+ std::string str8("aaaaaaaa");
+ BOOST_TEST(test("aaaaaaaa", repeat[char_], str8)); // kleene synonym
+ BOOST_TEST(test("aaaaaaaa", repeat(val(8))[char_], str8));
+ BOOST_TEST(test("aaa", repeat(val(3))[char_], str8));
+ BOOST_TEST(!test("aaaaaaaa", repeat(val(9))[char_], str8));
+
+ std::string str3("aaa");
+ BOOST_TEST(test("aaaaa", repeat(val(3), val(5))[char_], str8));
+ BOOST_TEST(test("aaa", repeat(val(3), val(5))[char_], str3));
+ BOOST_TEST(!test("aaa", repeat(val(4), val(5))[char_], str3));
+
+ BOOST_TEST(test("aaa", repeat(val(3), val(inf))[char_], str3));
+ BOOST_TEST(test("aaaaaaaa", repeat(val(3), val(inf))[char_], str8));
+ BOOST_TEST(!test("aaa", repeat(val(4), val(inf))[char_], str3));
+ }
+
{
std::string str8("aaaaaaaa");
@@ -95,121 +115,6 @@
BOOST_TEST(!test_delimited("a a a ", repeat(4, inf)[char_], str3, space));
}
- { // lazy repeats
- using boost::phoenix::val;
-
- std::string str8("aaaaaaaa");
- BOOST_TEST(test("aaaaaaaa", repeat[char_], str8)); // kleene synonym
- BOOST_TEST(test("aaaaaaaa", repeat(val(8))[char_], str8));
- BOOST_TEST(test("aaa", repeat(val(3))[char_], str8));
- BOOST_TEST(!test("aaaaaaaa", repeat(val(9))[char_], str8));
-
- std::string str3("aaa");
- BOOST_TEST(test("aaaaa", repeat(val(3), val(5))[char_], str8));
- BOOST_TEST(test("aaa", repeat(val(3), val(5))[char_], str3));
- BOOST_TEST(!test("aaa", repeat(val(4), val(5))[char_], str3));
-
- BOOST_TEST(test("aaa", repeat(val(3), val(inf))[char_], str3));
- BOOST_TEST(test("aaaaaaaa", repeat(val(3), val(inf))[char_], str8));
- BOOST_TEST(!test("aaa", repeat(val(4), val(inf))[char_], str3));
- }
-
- {
- std::string str("aBcdeFGH");
- BOOST_TEST(test("abcdefgh", lower[repeat(8)[char_]], str));
- BOOST_TEST(test_delimited("A B C D E F G H ", upper[repeat(8)[char_]], str, space));
- }
-
- { // actions
- namespace phx = boost::phoenix;
-
- std::vector<char> v;
- v.push_back('a');
- v.push_back('a');
- v.push_back('a');
- v.push_back('a');
- BOOST_TEST(test("aaaa", repeat(4)[char_][_1 = phx::ref(v)]));
- }
-
- { // more actions
- namespace phx = boost::phoenix;
-
- std::vector<int> v;
- v.push_back(123);
- v.push_back(456);
- v.push_back(789);
- BOOST_TEST(test_delimited("123 456 789 ", repeat(3)[int_][_1 = phx::ref(v)], space));
- }
-
- // failing sub-generators
- {
- using boost::spirit::karma::strict;
- using boost::spirit::karma::relaxed;
-
- using namespace boost::assign;
- namespace karma = boost::spirit::karma;
-
- typedef std::pair<char, char> data;
- std::vector<data> v2, v3;
- v2 += std::make_pair('a', 'a'),
- std::make_pair('b', 'b'),
- std::make_pair('c', 'c'),
- std::make_pair('d', 'd'),
- std::make_pair('e', 'e'),
- std::make_pair('f', 'f'),
- std::make_pair('g', 'g');
- v3 += std::make_pair('a', 'a'),
- std::make_pair('b', 'b'),
- std::make_pair('c', 'c'),
- std::make_pair('d', 'd');
-
- karma::rule<spirit_test::output_iterator<char>::type, data()> r;
-
- r = &char_('d') << char_;
- BOOST_TEST(test("d", repeat[r], v2));
- BOOST_TEST(test("d", relaxed[repeat[r]], v2));
- BOOST_TEST(test("", strict[repeat[r]], v2));
-
- r = !char_('d') << char_;
- BOOST_TEST(test("abcefg", repeat(6)[r], v2));
- BOOST_TEST(!test("", repeat(5)[r], v2));
- BOOST_TEST(test("abcefg", relaxed[repeat(6)[r]], v2));
- BOOST_TEST(!test("", relaxed[repeat(5)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(6)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(5)[r]], v2));
-
- r = !char_('c') << char_;
- BOOST_TEST(test("abd", repeat(3)[r], v2));
- BOOST_TEST(test("abd", relaxed[repeat(3)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(3)[r]], v2));
-
- r = !char_('a') << char_;
- BOOST_TEST(test("bcdef", repeat(3, 5)[r], v2));
- BOOST_TEST(test("bcd", repeat(3, 5)[r], v3));
- BOOST_TEST(!test("", repeat(4, 5)[r], v3));
- BOOST_TEST(test("bcdef", relaxed[repeat(3, 5)[r]], v2));
- BOOST_TEST(test("bcd", relaxed[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", relaxed[repeat(4, 5)[r]], v3));
- BOOST_TEST(!test("", strict[repeat(3, 5)[r]], v2));
- BOOST_TEST(!test("", strict[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", strict[repeat(4, 5)[r]], v3));
-
- BOOST_TEST(test("bcd", repeat(3, inf)[r], v3));
- BOOST_TEST(test("bcdefg", repeat(3, inf)[r], v2));
- BOOST_TEST(!test("", repeat(4, inf)[r], v3));
-
- r = !char_('g') << char_;
- BOOST_TEST(test("abcde", repeat(3, 5)[r], v2));
- BOOST_TEST(test("abcd", repeat(3, 5)[r], v3));
- BOOST_TEST(!test("", repeat(4, 5)[r], v3));
- BOOST_TEST(test("abcde", relaxed[repeat(3, 5)[r]], v2));
- BOOST_TEST(test("abcd", relaxed[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", relaxed[repeat(4, 5)[r]], v3));
- BOOST_TEST(test("abcde", strict[repeat(3, 5)[r]], v2));
- BOOST_TEST(test("abcd", strict[repeat(3, 5)[r]], v3));
- BOOST_TEST(!test("", strict[repeat(5)[r]], v3));
- }
-
{
// make sure user defined end condition is applied if no attribute
// is passed in
Added: trunk/libs/spirit/test/karma/repeat2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/repeat2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,144 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/assign/std/vector.hpp>
+
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+#include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_phoenix_attributes.hpp>
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include <string>
+#include <iostream>
+#include <vector>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ using namespace boost::spirit::ascii;
+ using boost::spirit::karma::repeat;
+ using boost::spirit::karma::inf;
+ using boost::spirit::karma::int_;
+ using boost::spirit::karma::hex;
+ using boost::spirit::karma::_1;
+
+ {
+ std::string str("aBcdeFGH");
+ BOOST_TEST(test("abcdefgh", lower[repeat(8)[char_]], str));
+ BOOST_TEST(test_delimited("A B C D E F G H ", upper[repeat(8)[char_]], str, space));
+ }
+
+ { // actions
+ namespace phx = boost::phoenix;
+
+ std::vector<char> v;
+ v.push_back('a');
+ v.push_back('a');
+ v.push_back('a');
+ v.push_back('a');
+ BOOST_TEST(test("aaaa", repeat(4)[char_][_1 = phx::ref(v)]));
+ }
+
+ { // more actions
+ namespace phx = boost::phoenix;
+
+ std::vector<int> v;
+ v.push_back(123);
+ v.push_back(456);
+ v.push_back(789);
+ BOOST_TEST(test_delimited("123 456 789 ", repeat(3)[int_][_1 = phx::ref(v)], space));
+ }
+
+ // failing sub-generators
+ {
+ using boost::spirit::karma::strict;
+ using boost::spirit::karma::relaxed;
+
+ using namespace boost::assign;
+ namespace karma = boost::spirit::karma;
+
+ typedef std::pair<char, char> data;
+ std::vector<data> v2, v3;
+ v2 += std::make_pair('a', 'a'),
+ std::make_pair('b', 'b'),
+ std::make_pair('c', 'c'),
+ std::make_pair('d', 'd'),
+ std::make_pair('e', 'e'),
+ std::make_pair('f', 'f'),
+ std::make_pair('g', 'g');
+ v3 += std::make_pair('a', 'a'),
+ std::make_pair('b', 'b'),
+ std::make_pair('c', 'c'),
+ std::make_pair('d', 'd');
+
+ karma::rule<spirit_test::output_iterator<char>::type, data()> r;
+
+ r = &char_('d') << char_;
+ BOOST_TEST(test("d", repeat[r], v2));
+ BOOST_TEST(test("d", relaxed[repeat[r]], v2));
+ BOOST_TEST(test("", strict[repeat[r]], v2));
+
+ r = !char_('d') << char_;
+ BOOST_TEST(test("abcefg", repeat(6)[r], v2));
+ BOOST_TEST(!test("", repeat(5)[r], v2));
+ BOOST_TEST(test("abcefg", relaxed[repeat(6)[r]], v2));
+ BOOST_TEST(!test("", relaxed[repeat(5)[r]], v2));
+ BOOST_TEST(!test("", strict[repeat(6)[r]], v2));
+ BOOST_TEST(!test("", strict[repeat(5)[r]], v2));
+
+ r = !char_('c') << char_;
+ BOOST_TEST(test("abd", repeat(3)[r], v2));
+ BOOST_TEST(test("abd", relaxed[repeat(3)[r]], v2));
+ BOOST_TEST(!test("", strict[repeat(3)[r]], v2));
+
+ r = !char_('a') << char_;
+ BOOST_TEST(test("bcdef", repeat(3, 5)[r], v2));
+ BOOST_TEST(test("bcd", repeat(3, 5)[r], v3));
+ BOOST_TEST(!test("", repeat(4, 5)[r], v3));
+ BOOST_TEST(test("bcdef", relaxed[repeat(3, 5)[r]], v2));
+ BOOST_TEST(test("bcd", relaxed[repeat(3, 5)[r]], v3));
+ BOOST_TEST(!test("", relaxed[repeat(4, 5)[r]], v3));
+ BOOST_TEST(!test("", strict[repeat(3, 5)[r]], v2));
+ BOOST_TEST(!test("", strict[repeat(3, 5)[r]], v3));
+ BOOST_TEST(!test("", strict[repeat(4, 5)[r]], v3));
+
+ BOOST_TEST(test("bcd", repeat(3, inf)[r], v3));
+ BOOST_TEST(test("bcdefg", repeat(3, inf)[r], v2));
+ BOOST_TEST(!test("", repeat(4, inf)[r], v3));
+
+ r = !char_('g') << char_;
+ BOOST_TEST(test("abcde", repeat(3, 5)[r], v2));
+ BOOST_TEST(test("abcd", repeat(3, 5)[r], v3));
+ BOOST_TEST(!test("", repeat(4, 5)[r], v3));
+ BOOST_TEST(test("abcde", relaxed[repeat(3, 5)[r]], v2));
+ BOOST_TEST(test("abcd", relaxed[repeat(3, 5)[r]], v3));
+ BOOST_TEST(!test("", relaxed[repeat(4, 5)[r]], v3));
+ BOOST_TEST(test("abcde", strict[repeat(3, 5)[r]], v2));
+ BOOST_TEST(test("abcd", strict[repeat(3, 5)[r]], v3));
+ BOOST_TEST(!test("", strict[repeat(5)[r]], v3));
+ }
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/karma/semantic_action_attribute.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/semantic_action_attribute.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,35 +0,0 @@
-// Copyright (c) 2010 Michael Caisse
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <string>
-#include <vector>
-#include <boost/spirit/include/karma.hpp>
-#include <boost/spirit/include/phoenix.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-namespace karma = boost::spirit::karma;
-namespace phx = boost::phoenix;
-
-int main()
-{
- using karma::int_;
- using karma::_1;
-
- BOOST_TEST(test("16909060", int_[ _1 = phx::val(0x01020304) ]));
-
- // make sure the passed attribute type does not enforce the attribute type
- // for the semantic action
- unsigned char char_value = 8;
- BOOST_TEST(test("16909060", int_[ _1 = phx::val(0x01020304) ], char_value));
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/karma/sequence.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/sequence.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,289 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-// #define KARMA_TEST_COMPILE_FAIL
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_numeric.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_action.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-#include <boost/spirit/include/karma_auxiliary.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/support_unused.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-#include <boost/spirit/include/phoenix_stl.hpp>
-#include <boost/fusion/include/vector.hpp>
-
-#include "test.hpp"
-
-using namespace spirit_test;
-
-///////////////////////////////////////////////////////////////////////////////
-// lazy version of fusion::size
-struct seqsize_impl
-{
- template <typename Sequence>
- struct result
- : boost::fusion::result_of::size<Sequence>
- {};
-
- template <typename Sequence>
- typename result<Sequence>::type
- operator()(Sequence const& seq) const
- {
- return boost::fusion::size(seq);
- }
-};
-
-boost::phoenix::function<seqsize_impl> const seqsize = seqsize_impl();
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- using namespace boost::spirit;
- using namespace boost::spirit::ascii;
- namespace fusion = boost::fusion;
-
- {
- {
- BOOST_TEST(test("xi", char_('x') << char_('i')));
- BOOST_TEST(!test("xi", char_('x') << char_('o')));
- }
-
- {
- BOOST_TEST(test_delimited("x i ", char_('x') << 'i', char(' ')));
- BOOST_TEST(!test_delimited("x i ",
- char_('x') << char_('o'), char(' ')));
- }
-
- {
- BOOST_TEST(test_delimited("Hello , World ",
- lit("Hello") << ',' << "World", char(' ')));
- }
-
- {
- // a single element
- char attr = 'a';
- BOOST_TEST((test("ab", char_ << 'b', attr)));
- }
-
- {
- // a single element fusion sequence
- fusion::vector<char> attr('a');
- BOOST_TEST((test("ab", char_ << 'b', attr)));
- }
-
- {
- fusion::vector<char, char, std::string> p ('a', 'b', "cdefg");
- BOOST_TEST(test("abcdefg", char_ << char_ << string, p));
- BOOST_TEST(test_delimited("a b cdefg ",
- char_ << char_ << string, p, char(' ')));
- }
-
- {
- fusion::vector<char, int, char> p ('a', 12, 'c');
- BOOST_TEST(test("a12c", char_ << int_ << char_, p));
- BOOST_TEST(test_delimited("a 12 c ",
- char_ << int_ << char_, p, char(' ')));
- }
-
- {
- // element sequence can be shorter and longer than the attribute
- // sequence
- using boost::spirit::karma::strict;
- using boost::spirit::karma::relaxed;
-
- fusion::vector<char, int, char> p ('a', 12, 'c');
- BOOST_TEST(test("a12", char_ << int_, p));
- BOOST_TEST(test_delimited("a 12 ", char_ << int_, p, char(' ')));
-
- BOOST_TEST(test("a12", relaxed[char_ << int_], p));
- BOOST_TEST(test_delimited("a 12 ", relaxed[char_ << int_], p, char(' ')));
-
- BOOST_TEST(!test("", strict[char_ << int_], p));
- BOOST_TEST(!test_delimited("", strict[char_ << int_], p, char(' ')));
-
- fusion::vector<char, int> p1 ('a', 12);
- BOOST_TEST(test("a12c", char_ << int_ << char_('c'), p1));
- BOOST_TEST(test_delimited("a 12 c ", char_ << int_ << char_('c'),
- p1, char(' ')));
-
- BOOST_TEST(test("a12c", relaxed[char_ << int_ << char_('c')], p1));
- BOOST_TEST(test_delimited("a 12 c ",
- relaxed[char_ << int_ << char_('c')], p1, char(' ')));
-
- BOOST_TEST(!test("", strict[char_ << int_ << char_('c')], p1));
- BOOST_TEST(!test_delimited("", strict[char_ << int_ << char_('c')],
- p1, char(' ')));
-
- BOOST_TEST(test("a12", strict[char_ << int_], p1));
- BOOST_TEST(test_delimited("a 12 ", strict[char_ << int_], p1, char(' ')));
-
- std::string value("foo ' bar");
- BOOST_TEST(test("\"foo ' bar\"", '"' << strict[*(~char_('*'))] << '"', value));
- BOOST_TEST(test("\"foo ' bar\"", strict['"' << *(~char_('*')) << '"'], value));
- }
-
- {
- // if all elements of a sequence have unused parameters, the whole
- // sequence has an unused parameter as well
- fusion::vector<char, char> p ('a', 'e');
- BOOST_TEST(test("abcde",
- char_ << (lit('b') << 'c' << 'd') << char_, p));
- BOOST_TEST(test_delimited("a b c d e ",
- char_ << (lit('b') << 'c' << 'd') << char_, p, char(' ')));
- }
-
- {
- // literal generators do not need an attribute
- fusion::vector<char, char> p('a', 'c');
- BOOST_TEST(test("abc", char_ << 'b' << char_, p));
- BOOST_TEST(test_delimited("a b c ",
- char_ << 'b' << char_, p, char(' ')));
- }
-
- {
- // literal generators do not need an attribute, not even at the end
- fusion::vector<char, char> p('a', 'c');
- BOOST_TEST(test("acb", char_ << char_ << 'b', p));
- BOOST_TEST(test_delimited("a c b ",
- char_ << char_ << 'b', p, char(' ')));
- }
-
- {
- std::list<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- BOOST_TEST(test("123", int_ << int_ << int_, v));
-// BOOST_TEST(test_delimited("1 2 3 ", int_ << int_ << int_, v, ' '));
-// BOOST_TEST(test("1,2,3", int_ << ',' << int_ << ',' << int_, v));
-// BOOST_TEST(test_delimited("1 , 2 , 3 ",
-// int_ << ',' << int_ << ',' << int_, v, ' '));
- }
-
- {
- BOOST_TEST(test("aa", lower[char_('A') << 'a']));
- BOOST_TEST(test_delimited("BEGIN END ",
- upper[lit("begin") << "end"], char(' ')));
- BOOST_TEST(!test_delimited("BEGIN END ",
- upper[lit("begin") << "nend"], char(' ')));
-
- BOOST_TEST(test("Aa ", left_align[char_('A') << 'a']));
- BOOST_TEST(test(" Aa ", center[char_('A') << 'a']));
- BOOST_TEST(test(" Aa", right_align[char_('A') << 'a']));
- }
-
- {
- // make sure single element tuples get passed through if the rhs
- // has a single element tuple as its attribute
- typedef spirit_test::output_iterator<char>::type iterator_type;
- fusion::vector<double, int> fv(2.0, 1);
- karma::rule<iterator_type, fusion::vector<double, int>()> r;
- r %= double_ << ',' << int_;
- BOOST_TEST(test("test:2.0,1", "test:" << r, fv));
- }
-
- // action tests
- {
- using namespace boost::phoenix;
-
- BOOST_TEST(test("abcdefg",
- (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"]));
- BOOST_TEST(test_delimited("a b cdefg ",
- (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"],
- char(' ')));
-
- BOOST_TEST(test_delimited("a 12 c ",
- (char_ << lit(12) << char_)[_1 = 'a', _2 = 'c'], char(' ')));
-
- char c = 'c';
- BOOST_TEST(test("abc",
- (char_[_1 = 'a'] << 'b' << char_)[_1 = 'x', _2 = ref(c)]));
- BOOST_TEST(test_delimited("a b c ",
- (char_[_1 = 'a'] << 'b' << char_)[_2 = ref(c)], char(' ')));
-
- BOOST_TEST(test("aa", lower[char_ << 'A'][_1 = 'A']));
- BOOST_TEST(test("AA", upper[char_ << 'a'][_1 = 'a']));
-
- BOOST_TEST(test("Aa ", left_align[char_ << 'a'][_1 = 'A']));
- BOOST_TEST(test(" Aa ", center[char_ << 'a'][_1 = 'A']));
- BOOST_TEST(test(" Aa", right_align[char_ << 'a'][_1 = 'A']));
- }
- }
-
- // test special case where sequence has a one element vector attribute
- // sequence and this element is a rule (attribute has to be passed through
- // without change)
- {
- typedef spirit_test::output_iterator<char>::type outiter_type;
- namespace karma = boost::spirit::karma;
-
- karma::rule<outiter_type, std::vector<int>()> r = -(int_ % ',');
- std::vector<int> v;
- BOOST_TEST(test(">", '>' << r, v));
-
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
- BOOST_TEST(test(">1,2,3,4", '>' << r, v));
- }
-
- {
- namespace karma = boost::spirit::karma;
- typedef spirit_test::output_iterator<char>::type outiter_type;
-
- karma::rule<outiter_type, std::string()> e = karma::string;
- karma::rule<outiter_type, std::vector<std::string>()> l = e << *(',' << e);
-
- std::vector<std::string> v;
- v.push_back("abc1");
- v.push_back("abc2");
- v.push_back("abc3");
- BOOST_TEST(test("abc1,abc2,abc3", l, v));
- }
-
- {
- namespace karma = boost::spirit::karma;
- namespace phoenix = boost::phoenix;
-
- typedef spirit_test::output_iterator<char>::type outiter_type;
- typedef fusion::vector<char, char, char> vector_type;
-
- vector_type p ('a', 'b', 'c');
- BOOST_TEST(test("ab", char_ << char_, p));
-
- karma::rule<outiter_type, vector_type()> r;
- r %= char_ << char_ << &karma::eps[seqsize(_val) == 3];
- BOOST_TEST(!test("", r, p));
-
- r %= char_ << char_ << char_ << &karma::eps[seqsize(_val) == 3];
- BOOST_TEST(test("abc", r, p));
- }
-
- {
- std::list<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
-
- BOOST_TEST(test("1234", repeat(2)[int_] << *int_, v));
- BOOST_TEST(test_delimited("1 2 3 4 ", repeat(2)[int_] << *int_, v, char(' ')));
- }
-
- return boost::report_errors();
-}
-
Copied: trunk/libs/spirit/test/karma/sequence1.cpp (from r67483, /trunk/libs/spirit/test/karma/sequence.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/sequence.cpp (original)
+++ trunk/libs/spirit/test/karma/sequence1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -30,259 +30,117 @@
using namespace spirit_test;
///////////////////////////////////////////////////////////////////////////////
-// lazy version of fusion::size
-struct seqsize_impl
+int main()
{
- template <typename Sequence>
- struct result
- : boost::fusion::result_of::size<Sequence>
- {};
+ using namespace boost::spirit;
+ using namespace boost::spirit::ascii;
+ namespace fusion = boost::fusion;
- template <typename Sequence>
- typename result<Sequence>::type
- operator()(Sequence const& seq) const
{
- return boost::fusion::size(seq);
+ BOOST_TEST(test("xi", char_('x') << char_('i')));
+ BOOST_TEST(!test("xi", char_('x') << char_('o')));
}
-};
-boost::phoenix::function<seqsize_impl> const seqsize = seqsize_impl();
+ {
+ BOOST_TEST(test_delimited("x i ", char_('x') << 'i', char(' ')));
+ BOOST_TEST(!test_delimited("x i ",
+ char_('x') << char_('o'), char(' ')));
+ }
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- using namespace boost::spirit;
- using namespace boost::spirit::ascii;
- namespace fusion = boost::fusion;
+ {
+ BOOST_TEST(test_delimited("Hello , World ",
+ lit("Hello") << ',' << "World", char(' ')));
+ }
+
+ {
+ // a single element
+ char attr = 'a';
+ BOOST_TEST((test("ab", char_ << 'b', attr)));
+ }
+
+ {
+ // a single element fusion sequence
+ fusion::vector<char> attr('a');
+ BOOST_TEST((test("ab", char_ << 'b', attr)));
+ }
+
+ {
+ fusion::vector<char, char, std::string> p ('a', 'b', "cdefg");
+ BOOST_TEST(test("abcdefg", char_ << char_ << string, p));
+ BOOST_TEST(test_delimited("a b cdefg ",
+ char_ << char_ << string, p, char(' ')));
+ }
+
+ {
+ fusion::vector<char, int, char> p ('a', 12, 'c');
+ BOOST_TEST(test("a12c", char_ << int_ << char_, p));
+ BOOST_TEST(test_delimited("a 12 c ",
+ char_ << int_ << char_, p, char(' ')));
+ }
{
- {
- BOOST_TEST(test("xi", char_('x') << char_('i')));
- BOOST_TEST(!test("xi", char_('x') << char_('o')));
- }
-
- {
- BOOST_TEST(test_delimited("x i ", char_('x') << 'i', char(' ')));
- BOOST_TEST(!test_delimited("x i ",
- char_('x') << char_('o'), char(' ')));
- }
-
- {
- BOOST_TEST(test_delimited("Hello , World ",
- lit("Hello") << ',' << "World", char(' ')));
- }
-
- {
- // a single element
- char attr = 'a';
- BOOST_TEST((test("ab", char_ << 'b', attr)));
- }
-
- {
- // a single element fusion sequence
- fusion::vector<char> attr('a');
- BOOST_TEST((test("ab", char_ << 'b', attr)));
- }
-
- {
- fusion::vector<char, char, std::string> p ('a', 'b', "cdefg");
- BOOST_TEST(test("abcdefg", char_ << char_ << string, p));
- BOOST_TEST(test_delimited("a b cdefg ",
- char_ << char_ << string, p, char(' ')));
- }
-
- {
- fusion::vector<char, int, char> p ('a', 12, 'c');
- BOOST_TEST(test("a12c", char_ << int_ << char_, p));
- BOOST_TEST(test_delimited("a 12 c ",
- char_ << int_ << char_, p, char(' ')));
- }
-
- {
- // element sequence can be shorter and longer than the attribute
- // sequence
- using boost::spirit::karma::strict;
- using boost::spirit::karma::relaxed;
-
- fusion::vector<char, int, char> p ('a', 12, 'c');
- BOOST_TEST(test("a12", char_ << int_, p));
- BOOST_TEST(test_delimited("a 12 ", char_ << int_, p, char(' ')));
-
- BOOST_TEST(test("a12", relaxed[char_ << int_], p));
- BOOST_TEST(test_delimited("a 12 ", relaxed[char_ << int_], p, char(' ')));
-
- BOOST_TEST(!test("", strict[char_ << int_], p));
- BOOST_TEST(!test_delimited("", strict[char_ << int_], p, char(' ')));
-
- fusion::vector<char, int> p1 ('a', 12);
- BOOST_TEST(test("a12c", char_ << int_ << char_('c'), p1));
- BOOST_TEST(test_delimited("a 12 c ", char_ << int_ << char_('c'),
- p1, char(' ')));
-
- BOOST_TEST(test("a12c", relaxed[char_ << int_ << char_('c')], p1));
- BOOST_TEST(test_delimited("a 12 c ",
- relaxed[char_ << int_ << char_('c')], p1, char(' ')));
-
- BOOST_TEST(!test("", strict[char_ << int_ << char_('c')], p1));
- BOOST_TEST(!test_delimited("", strict[char_ << int_ << char_('c')],
- p1, char(' ')));
-
- BOOST_TEST(test("a12", strict[char_ << int_], p1));
- BOOST_TEST(test_delimited("a 12 ", strict[char_ << int_], p1, char(' ')));
-
- std::string value("foo ' bar");
- BOOST_TEST(test("\"foo ' bar\"", '"' << strict[*(~char_('*'))] << '"', value));
- BOOST_TEST(test("\"foo ' bar\"", strict['"' << *(~char_('*')) << '"'], value));
- }
-
- {
- // if all elements of a sequence have unused parameters, the whole
- // sequence has an unused parameter as well
- fusion::vector<char, char> p ('a', 'e');
- BOOST_TEST(test("abcde",
- char_ << (lit('b') << 'c' << 'd') << char_, p));
- BOOST_TEST(test_delimited("a b c d e ",
- char_ << (lit('b') << 'c' << 'd') << char_, p, char(' ')));
- }
-
- {
- // literal generators do not need an attribute
- fusion::vector<char, char> p('a', 'c');
- BOOST_TEST(test("abc", char_ << 'b' << char_, p));
- BOOST_TEST(test_delimited("a b c ",
- char_ << 'b' << char_, p, char(' ')));
- }
-
- {
- // literal generators do not need an attribute, not even at the end
- fusion::vector<char, char> p('a', 'c');
- BOOST_TEST(test("acb", char_ << char_ << 'b', p));
- BOOST_TEST(test_delimited("a c b ",
- char_ << char_ << 'b', p, char(' ')));
- }
-
- {
- std::list<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- BOOST_TEST(test("123", int_ << int_ << int_, v));
-// BOOST_TEST(test_delimited("1 2 3 ", int_ << int_ << int_, v, ' '));
-// BOOST_TEST(test("1,2,3", int_ << ',' << int_ << ',' << int_, v));
-// BOOST_TEST(test_delimited("1 , 2 , 3 ",
-// int_ << ',' << int_ << ',' << int_, v, ' '));
- }
-
- {
- BOOST_TEST(test("aa", lower[char_('A') << 'a']));
- BOOST_TEST(test_delimited("BEGIN END ",
- upper[lit("begin") << "end"], char(' ')));
- BOOST_TEST(!test_delimited("BEGIN END ",
- upper[lit("begin") << "nend"], char(' ')));
-
- BOOST_TEST(test("Aa ", left_align[char_('A') << 'a']));
- BOOST_TEST(test(" Aa ", center[char_('A') << 'a']));
- BOOST_TEST(test(" Aa", right_align[char_('A') << 'a']));
- }
-
- {
- // make sure single element tuples get passed through if the rhs
- // has a single element tuple as its attribute
- typedef spirit_test::output_iterator<char>::type iterator_type;
- fusion::vector<double, int> fv(2.0, 1);
- karma::rule<iterator_type, fusion::vector<double, int>()> r;
- r %= double_ << ',' << int_;
- BOOST_TEST(test("test:2.0,1", "test:" << r, fv));
- }
-
- // action tests
- {
- using namespace boost::phoenix;
-
- BOOST_TEST(test("abcdefg",
- (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"]));
- BOOST_TEST(test_delimited("a b cdefg ",
- (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"],
- char(' ')));
-
- BOOST_TEST(test_delimited("a 12 c ",
- (char_ << lit(12) << char_)[_1 = 'a', _2 = 'c'], char(' ')));
-
- char c = 'c';
- BOOST_TEST(test("abc",
- (char_[_1 = 'a'] << 'b' << char_)[_1 = 'x', _2 = ref(c)]));
- BOOST_TEST(test_delimited("a b c ",
- (char_[_1 = 'a'] << 'b' << char_)[_2 = ref(c)], char(' ')));
-
- BOOST_TEST(test("aa", lower[char_ << 'A'][_1 = 'A']));
- BOOST_TEST(test("AA", upper[char_ << 'a'][_1 = 'a']));
-
- BOOST_TEST(test("Aa ", left_align[char_ << 'a'][_1 = 'A']));
- BOOST_TEST(test(" Aa ", center[char_ << 'a'][_1 = 'A']));
- BOOST_TEST(test(" Aa", right_align[char_ << 'a'][_1 = 'A']));
- }
- }
-
- // test special case where sequence has a one element vector attribute
- // sequence and this element is a rule (attribute has to be passed through
- // without change)
- {
- typedef spirit_test::output_iterator<char>::type outiter_type;
- namespace karma = boost::spirit::karma;
-
- karma::rule<outiter_type, std::vector<int>()> r = -(int_ % ',');
- std::vector<int> v;
- BOOST_TEST(test(">", '>' << r, v));
-
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
- BOOST_TEST(test(">1,2,3,4", '>' << r, v));
- }
-
- {
- namespace karma = boost::spirit::karma;
- typedef spirit_test::output_iterator<char>::type outiter_type;
-
- karma::rule<outiter_type, std::string()> e = karma::string;
- karma::rule<outiter_type, std::vector<std::string>()> l = e << *(',' << e);
-
- std::vector<std::string> v;
- v.push_back("abc1");
- v.push_back("abc2");
- v.push_back("abc3");
- BOOST_TEST(test("abc1,abc2,abc3", l, v));
- }
-
- {
- namespace karma = boost::spirit::karma;
- namespace phoenix = boost::phoenix;
-
- typedef spirit_test::output_iterator<char>::type outiter_type;
- typedef fusion::vector<char, char, char> vector_type;
-
- vector_type p ('a', 'b', 'c');
- BOOST_TEST(test("ab", char_ << char_, p));
-
- karma::rule<outiter_type, vector_type()> r;
- r %= char_ << char_ << &karma::eps[seqsize(_val) == 3];
- BOOST_TEST(!test("", r, p));
-
- r %= char_ << char_ << char_ << &karma::eps[seqsize(_val) == 3];
- BOOST_TEST(test("abc", r, p));
- }
-
- {
- std::list<int> v;
- v.push_back(1);
- v.push_back(2);
- v.push_back(3);
- v.push_back(4);
+ // element sequence can be shorter and longer than the attribute
+ // sequence
+ using boost::spirit::karma::strict;
+ using boost::spirit::karma::relaxed;
+
+ fusion::vector<char, int, char> p ('a', 12, 'c');
+ BOOST_TEST(test("a12", char_ << int_, p));
+ BOOST_TEST(test_delimited("a 12 ", char_ << int_, p, char(' ')));
+
+ BOOST_TEST(test("a12", relaxed[char_ << int_], p));
+ BOOST_TEST(test_delimited("a 12 ", relaxed[char_ << int_], p, char(' ')));
+
+ BOOST_TEST(!test("", strict[char_ << int_], p));
+ BOOST_TEST(!test_delimited("", strict[char_ << int_], p, char(' ')));
+
+ fusion::vector<char, int> p1 ('a', 12);
+ BOOST_TEST(test("a12c", char_ << int_ << char_('c'), p1));
+ BOOST_TEST(test_delimited("a 12 c ", char_ << int_ << char_('c'),
+ p1, char(' ')));
+
+ BOOST_TEST(test("a12c", relaxed[char_ << int_ << char_('c')], p1));
+ BOOST_TEST(test_delimited("a 12 c ",
+ relaxed[char_ << int_ << char_('c')], p1, char(' ')));
+
+ BOOST_TEST(!test("", strict[char_ << int_ << char_('c')], p1));
+ BOOST_TEST(!test_delimited("", strict[char_ << int_ << char_('c')],
+ p1, char(' ')));
- BOOST_TEST(test("1234", repeat(2)[int_] << *int_, v));
- BOOST_TEST(test_delimited("1 2 3 4 ", repeat(2)[int_] << *int_, v, char(' ')));
+ BOOST_TEST(test("a12", strict[char_ << int_], p1));
+ BOOST_TEST(test_delimited("a 12 ", strict[char_ << int_], p1, char(' ')));
+
+ std::string value("foo ' bar");
+ BOOST_TEST(test("\"foo ' bar\"", '"' << strict[*(~char_('*'))] << '"', value));
+ BOOST_TEST(test("\"foo ' bar\"", strict['"' << *(~char_('*')) << '"'], value));
+ }
+
+ {
+ // if all elements of a sequence have unused parameters, the whole
+ // sequence has an unused parameter as well
+ fusion::vector<char, char> p ('a', 'e');
+ BOOST_TEST(test("abcde",
+ char_ << (lit('b') << 'c' << 'd') << char_, p));
+ BOOST_TEST(test_delimited("a b c d e ",
+ char_ << (lit('b') << 'c' << 'd') << char_, p, char(' ')));
+ }
+
+ {
+ // literal generators do not need an attribute
+ fusion::vector<char, char> p('a', 'c');
+ BOOST_TEST(test("abc", char_ << 'b' << char_, p));
+ BOOST_TEST(test_delimited("a b c ",
+ char_ << 'b' << char_, p, char(' ')));
}
+
+ {
+ // literal generators do not need an attribute, not even at the end
+ fusion::vector<char, char> p('a', 'c');
+ BOOST_TEST(test("acb", char_ << char_ << 'b', p));
+ BOOST_TEST(test_delimited("a c b ",
+ char_ << char_ << 'b', p, char(' ')));
+ }
+
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/sequence2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/sequence2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,182 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+// #define KARMA_TEST_COMPILE_FAIL
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_numeric.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_action.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+#include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/support_unused.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+///////////////////////////////////////////////////////////////////////////////
+// lazy version of fusion::size
+struct seqsize_impl
+{
+ template <typename Sequence>
+ struct result
+ : boost::fusion::result_of::size<Sequence>
+ {};
+
+ template <typename Sequence>
+ typename result<Sequence>::type
+ operator()(Sequence const& seq) const
+ {
+ return boost::fusion::size(seq);
+ }
+};
+
+boost::phoenix::function<seqsize_impl> const seqsize = seqsize_impl();
+
+///////////////////////////////////////////////////////////////////////////////
+int main()
+{
+ using namespace boost::spirit;
+ using namespace boost::spirit::ascii;
+ namespace fusion = boost::fusion;
+
+
+ {
+ std::list<int> v;
+ v.push_back(1);
+ v.push_back(2);
+ v.push_back(3);
+ BOOST_TEST(test("123", int_ << int_ << int_, v));
+ BOOST_TEST(test_delimited("1 2 3 ", int_ << int_ << int_, v, ' '));
+ BOOST_TEST(test("1,2,3", int_ << ',' << int_ << ',' << int_, v));
+ BOOST_TEST(test_delimited("1 , 2 , 3 ", int_ << ',' << int_ << ',' << int_, v, ' '));
+ }
+
+ {
+ BOOST_TEST(test("aa", lower[char_('A') << 'a']));
+ BOOST_TEST(test_delimited("BEGIN END ",
+ upper[lit("begin") << "end"], char(' ')));
+ BOOST_TEST(!test_delimited("BEGIN END ",
+ upper[lit("begin") << "nend"], char(' ')));
+
+ BOOST_TEST(test("Aa ", left_align[char_('A') << 'a']));
+ BOOST_TEST(test(" Aa ", center[char_('A') << 'a']));
+ BOOST_TEST(test(" Aa", right_align[char_('A') << 'a']));
+ }
+
+ {
+ // make sure single element tuples get passed through if the rhs
+ // has a single element tuple as its attribute
+ typedef spirit_test::output_iterator<char>::type iterator_type;
+ fusion::vector<double, int> fv(2.0, 1);
+ karma::rule<iterator_type, fusion::vector<double, int>()> r;
+ r %= double_ << ',' << int_;
+ BOOST_TEST(test("test:2.0,1", "test:" << r, fv));
+ }
+
+ // action tests
+ {
+ using namespace boost::phoenix;
+
+ BOOST_TEST(test("abcdefg",
+ (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"]));
+ BOOST_TEST(test_delimited("a b cdefg ",
+ (char_ << char_ << string)[_1 = 'a', _2 = 'b', _3 = "cdefg"],
+ char(' ')));
+
+ BOOST_TEST(test_delimited("a 12 c ",
+ (char_ << lit(12) << char_)[_1 = 'a', _2 = 'c'], char(' ')));
+
+ char c = 'c';
+ BOOST_TEST(test("abc",
+ (char_[_1 = 'a'] << 'b' << char_)[_1 = 'x', _2 = ref(c)]));
+ BOOST_TEST(test_delimited("a b c ",
+ (char_[_1 = 'a'] << 'b' << char_)[_2 = ref(c)], char(' ')));
+
+ BOOST_TEST(test("aa", lower[char_ << 'A'][_1 = 'A']));
+ BOOST_TEST(test("AA", upper[char_ << 'a'][_1 = 'a']));
+
+ BOOST_TEST(test("Aa ", left_align[char_ << 'a'][_1 = 'A']));
+ BOOST_TEST(test(" Aa ", center[char_ << 'a'][_1 = 'A']));
+ BOOST_TEST(test(" Aa", right_align[char_ << 'a'][_1 = 'A']));
+ }
+
+ // test special case where sequence has a one element vector attribute
+ // sequence and this element is a rule (attribute has to be passed through
+ // without change)
+ {
+ typedef spirit_test::output_iterator<char>::type outiter_type;
+ namespace karma = boost::spirit::karma;
+
+ karma::rule<outiter_type, std::vector<int>()> r = -(int_ % ',');
+ std::vector<int> v;
+ BOOST_TEST(test(">", '>' << r, v));
+
+ v.push_back(1);
+ v.push_back(2);
+ v.push_back(3);
+ v.push_back(4);
+ BOOST_TEST(test(">1,2,3,4", '>' << r, v));
+ }
+
+ {
+ namespace karma = boost::spirit::karma;
+ typedef spirit_test::output_iterator<char>::type outiter_type;
+
+ karma::rule<outiter_type, std::string()> e = karma::string;
+ karma::rule<outiter_type, std::vector<std::string>()> l = e << *(',' << e);
+
+ std::vector<std::string> v;
+ v.push_back("abc1");
+ v.push_back("abc2");
+ v.push_back("abc3");
+ BOOST_TEST(test("abc1,abc2,abc3", l, v));
+ }
+
+ {
+ namespace karma = boost::spirit::karma;
+ namespace phoenix = boost::phoenix;
+
+ typedef spirit_test::output_iterator<char>::type outiter_type;
+ typedef fusion::vector<char, char, char> vector_type;
+
+ vector_type p ('a', 'b', 'c');
+ BOOST_TEST(test("ab", char_ << char_, p));
+
+ karma::rule<outiter_type, vector_type()> r;
+ r %= char_ << char_ << &karma::eps[seqsize(_val) == 3];
+ BOOST_TEST(!test("", r, p));
+
+ r %= char_ << char_ << char_ << &karma::eps[seqsize(_val) == 3];
+ BOOST_TEST(test("abc", r, p));
+ }
+
+ {
+ std::list<int> v;
+ v.push_back(1);
+ v.push_back(2);
+ v.push_back(3);
+ v.push_back(4);
+
+ BOOST_TEST(test("1234", repeat(2)[int_] << *int_, v));
+ BOOST_TEST(test_delimited("1 2 3 4 ", repeat(2)[int_] << *int_, v, char(' ')));
+ }
+
+ return boost::report_errors();
+}
+
Modified: trunk/libs/spirit/test/karma/stream.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/stream.cpp (original)
+++ trunk/libs/spirit/test/karma/stream.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -3,6 +3,9 @@
// Distributed under 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)
+#include <stdint.h>
+#include <cwchar>
+#include <streambuf>
#include <iostream>
#include <boost/config/warning_disable.hpp>
@@ -51,13 +54,6 @@
BOOST_TEST(test("1", stream, 1));
BOOST_TEST(test("1.1", stream, 1.1));
BOOST_TEST(test("{1.2,2.4}", stream, complex(1.2, 2.4)));
-
- BOOST_TEST(test(L"x", wstream, L'x'));
- BOOST_TEST(test(L"xyz", wstream, L"xyz"));
- BOOST_TEST(test(L"xyz", wstream, std::basic_string<wchar_t>(L"xyz")));
- BOOST_TEST(test(L"1", wstream, 1));
- BOOST_TEST(test(L"1.1", wstream, 1.1));
- BOOST_TEST(test(L"{1.2,2.4}", wstream, complex(1.2, 2.4)));
}
{
@@ -67,13 +63,6 @@
BOOST_TEST(test("1", stream(1)));
BOOST_TEST(test("1.1", stream(1.1)));
BOOST_TEST(test("{1.2,2.4}", stream(complex(1.2, 2.4))));
-
- BOOST_TEST(test(L"x", wstream(L'x')));
- BOOST_TEST(test(L"xyz", wstream(L"xyz")));
- BOOST_TEST(test(L"xyz", wstream(std::basic_string<wchar_t>(L"xyz"))));
- BOOST_TEST(test(L"1", wstream(1)));
- BOOST_TEST(test(L"1.1", wstream(1.1)));
- BOOST_TEST(test(L"{1.2,2.4}", wstream(complex(1.2, 2.4))));
}
{
@@ -85,13 +74,6 @@
BOOST_TEST(test("X", upper[stream], 'x'));
BOOST_TEST(test("XYZ", upper[stream], "xyz"));
BOOST_TEST(test("XYZ", upper[stream], std::string("xyz")));
-
- BOOST_TEST(test(L"x", lower[wstream], L'X'));
- BOOST_TEST(test(L"xyz", lower[wstream], L"XYZ"));
- BOOST_TEST(test(L"xyz", lower[wstream], std::basic_string<wchar_t>(L"XYZ")));
- BOOST_TEST(test(L"X", upper[wstream], L'x'));
- BOOST_TEST(test(L"XYZ", upper[wstream], L"xyz"));
- BOOST_TEST(test(L"XYZ", upper[wstream], std::basic_string<wchar_t>(L"xyz")));
}
{
@@ -101,13 +83,6 @@
BOOST_TEST(test_delimited("1 ", stream, 1, ' '));
BOOST_TEST(test_delimited("1.1 ", stream, 1.1, ' '));
BOOST_TEST(test_delimited("{1.2,2.4} ", stream, complex(1.2, 2.4), ' '));
-
- BOOST_TEST(test_delimited(L"x ", wstream, L'x', L' '));
- BOOST_TEST(test_delimited(L"xyz ", wstream, L"xyz", L' '));
- BOOST_TEST(test_delimited(L"xyz ", wstream, std::basic_string<wchar_t>(L"xyz"), L' '));
- BOOST_TEST(test_delimited(L"1 ", wstream, 1, ' '));
- BOOST_TEST(test_delimited(L"1.1 ", wstream, 1.1, ' '));
- BOOST_TEST(test_delimited(L"{1.2,2.4} ", wstream, complex(1.2, 2.4), ' '));
}
{
@@ -138,13 +113,6 @@
BOOST_TEST(test_delimited("X ", upper[stream], 'x', ' '));
BOOST_TEST(test_delimited("XYZ ", upper[stream], "xyz", ' '));
BOOST_TEST(test_delimited("XYZ ", upper[stream], std::string("xyz"), ' '));
-
- BOOST_TEST(test_delimited(L"x ", lower[wstream], L'X', L' '));
- BOOST_TEST(test_delimited(L"xyz ", lower[wstream], L"XYZ", L' '));
- BOOST_TEST(test_delimited(L"xyz ", lower[wstream], std::basic_string<wchar_t>(L"XYZ"), L' '));
- BOOST_TEST(test_delimited(L"X ", upper[wstream], L'x', L' '));
- BOOST_TEST(test_delimited(L"XYZ ", upper[wstream], L"xyz", ' '));
- BOOST_TEST(test_delimited(L"XYZ ", upper[wstream], std::basic_string<wchar_t>(L"xyz"), L' '));
}
{ // lazy streams
@@ -153,10 +121,6 @@
std::basic_string<char> s("abc");
BOOST_TEST((test("abc", stream(phx::val(s)))));
BOOST_TEST((test("abc", stream(phx::ref(s)))));
-
- std::basic_string<wchar_t> ws(L"abc");
- BOOST_TEST((test(L"abc", wstream(phx::val(ws)))));
- BOOST_TEST((test(L"abc", wstream(phx::ref(ws)))));
}
{
Deleted: trunk/libs/spirit/test/karma/symbols.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/symbols.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,314 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/karma_auxiliary.hpp>
-#include <boost/spirit/include/karma_char.hpp>
-#include <boost/spirit/include/karma_string.hpp>
-#include <boost/spirit/include/karma_operator.hpp>
-#include <boost/spirit/include/karma_directive.hpp>
-#include <boost/spirit/include/karma_generate.hpp>
-#include <boost/spirit/include/karma_nonterminal.hpp>
-
-#include "test.hpp"
-
-namespace fusion = boost::fusion;
-
-template <typename T>
-inline std::vector<T>
-make_vector(T const& t1, T const& t2)
-{
- std::vector<T> v;
- v.push_back(t1);
- v.push_back(t2);
- return v;
-}
-
-int main()
-{
- using spirit_test::test;
- using boost::spirit::karma::symbols;
-
- { // basics
- symbols<char, std::string> sym;
-
- sym.add
- ('j', "Joel")
- ('h', "Hartmut")
- ('t', "Tom")
- ('k', "Kim")
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, std::string> >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, 'j')));
- BOOST_TEST((test("Hartmut", sym, 'h')));
- BOOST_TEST((test("Tom", sym, 't')));
- BOOST_TEST((test("Kim", sym, 'k')));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, std::string> sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, 'j')));
- BOOST_TEST((test("Hartmut", sym2, 'h')));
- BOOST_TEST((test("Tom", sym2, 't')));
- BOOST_TEST((test("Kim", sym2, 'k')));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", 'j')));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // advanced
- using boost::spirit::karma::rule;
- using boost::spirit::karma::lit;
-
- typedef spirit_test::output_iterator<char>::type output_iterator_type;
-
- symbols<char, rule<output_iterator_type> > sym;
-
- rule<output_iterator_type> r1 = lit("Joel");
- rule<output_iterator_type> r2 = lit("Hartmut");
- rule<output_iterator_type> r3 = lit("Tom");
- rule<output_iterator_type> r4 = lit("Kim");
-
- sym.add
- ('j', r1.alias())
- ('h', r2.alias())
- ('t', r3.alias())
- ('k', r4.alias())
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, rule<output_iterator_type> > >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, 'j')));
- BOOST_TEST((test("Hartmut", sym, 'h')));
- BOOST_TEST((test("Tom", sym, 't')));
- BOOST_TEST((test("Kim", sym, 'k')));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, rule<output_iterator_type> > sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, 'j')));
- BOOST_TEST((test("Hartmut", sym2, 'h')));
- BOOST_TEST((test("Tom", sym2, 't')));
- BOOST_TEST((test("Kim", sym2, 'k')));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", 'j')));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // more advanced
- using boost::spirit::karma::rule;
- using boost::spirit::karma::lit;
- using boost::spirit::karma::string;
-
- typedef spirit_test::output_iterator<char>::type output_iterator_type;
-
- symbols<char, rule<output_iterator_type, std::string()> > sym;
- rule<output_iterator_type, std::string()> r1 = string;
-
- sym.add
- ('j', r1.alias())
- ('h', r1.alias())
- ('t', r1.alias())
- ('k', r1.alias())
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, std::string> >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, fusion::make_vector('j', "Joel"))));
- BOOST_TEST((test("Hartmut", sym, fusion::make_vector('h', "Hartmut"))));
- BOOST_TEST((test("Tom", sym, fusion::make_vector('t', "Tom"))));
- BOOST_TEST((test("Kim", sym, fusion::make_vector('k', "Kim"))));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, rule<output_iterator_type, std::string()> > sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, fusion::make_vector('j', "Joel"))));
- BOOST_TEST((test("Hartmut", sym2, fusion::make_vector('h', "Hartmut"))));
- BOOST_TEST((test("Tom", sym2, fusion::make_vector('t', "Tom"))));
- BOOST_TEST((test("Kim", sym2, fusion::make_vector('k', "Kim"))));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", fusion::make_vector('j', "Joel"))));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // more advanced
- using boost::spirit::karma::rule;
- using boost::spirit::karma::lit;
- using boost::spirit::karma::char_;
-
- typedef spirit_test::output_iterator<char>::type output_iterator_type;
-
- symbols<char, rule<output_iterator_type, char()> > sym;
- rule<output_iterator_type, char()> r1 = char_;
-
- sym.add
- ('j', r1.alias())
- ('h', r1.alias())
- ('t', r1.alias())
- ('k', r1.alias())
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, rule<output_iterator_type, char()> > >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("J", sym, make_vector('j', 'J'))));
- BOOST_TEST((test("H", sym, make_vector('h', 'H'))));
- BOOST_TEST((test("T", sym, make_vector('t', 'T'))));
- BOOST_TEST((test("K", sym, make_vector('k', 'K'))));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, rule<output_iterator_type, char()> > sym2;
- sym2 = sym;
- BOOST_TEST((test("J", sym2, make_vector('j', 'J'))));
- BOOST_TEST((test("H", sym2, make_vector('h', 'H'))));
- BOOST_TEST((test("T", sym2, make_vector('t', 'T'))));
- BOOST_TEST((test("K", sym2, make_vector('k', 'K'))));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Jyo", sym << "yo", make_vector('j', 'J'))));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // basics
- symbols<std::string> sym;
-
- sym.add
- ("Joel")
- ("Hartmut")
- ("Tom")
- ("Kim")
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, std::string> >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, "Joel")));
- BOOST_TEST((test("Hartmut", sym, "Hartmut")));
- BOOST_TEST((test("Tom", sym, "Tom")));
- BOOST_TEST((test("Kim", sym, "Kim")));
- BOOST_TEST((!test("", sym, "X")));
-
- // test copy
- symbols<std::string> sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, "Joel")));
- BOOST_TEST((test("Hartmut", sym2, "Hartmut")));
- BOOST_TEST((test("Tom", sym2, "Tom")));
- BOOST_TEST((test("Kim", sym2, "Kim")));
- BOOST_TEST((!test("", sym2, "X")));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", "Joel")));
-
- sym.remove
- ("Joel")
- ("Hartmut")
- ;
-
- BOOST_TEST((!test("", sym, "Joel")));
- BOOST_TEST((!test("", sym, "Hartmut")));
- }
-
- { // lower/upper handling
- using namespace boost::spirit::ascii;
- using boost::spirit::karma::lower;
- using boost::spirit::karma::upper;
-
- symbols<char, std::string> sym;
- sym.add
- ('j', "Joel")
- ('h', "Hartmut")
- ('t', "Tom")
- ('k', "Kim")
- ;
-
- BOOST_TEST((test("joel", lower[sym], 'j')));
- BOOST_TEST((test("hartmut", lower[sym], 'h')));
- BOOST_TEST((test("tom", lower[sym], 't')));
- BOOST_TEST((test("kim", lower[sym], 'k')));
-
- BOOST_TEST((test("JOEL", upper[sym], 'j')));
- BOOST_TEST((test("HARTMUT", upper[sym], 'h')));
- BOOST_TEST((test("TOM", upper[sym], 't')));
- BOOST_TEST((test("KIM", upper[sym], 'k')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("joelyo", lower[sym] << "yo", 'j')));
- BOOST_TEST((test("JOELyo", upper[sym] << "yo", 'j')));
- }
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/karma/symbols1.cpp (from r67483, /trunk/libs/spirit/test/karma/symbols.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/symbols.cpp (original)
+++ trunk/libs/spirit/test/karma/symbols1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -78,210 +78,6 @@
BOOST_TEST((!test("", sym, 'h')));
}
- { // advanced
- using boost::spirit::karma::rule;
- using boost::spirit::karma::lit;
-
- typedef spirit_test::output_iterator<char>::type output_iterator_type;
-
- symbols<char, rule<output_iterator_type> > sym;
-
- rule<output_iterator_type> r1 = lit("Joel");
- rule<output_iterator_type> r2 = lit("Hartmut");
- rule<output_iterator_type> r3 = lit("Tom");
- rule<output_iterator_type> r4 = lit("Kim");
-
- sym.add
- ('j', r1.alias())
- ('h', r2.alias())
- ('t', r3.alias())
- ('k', r4.alias())
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, rule<output_iterator_type> > >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, 'j')));
- BOOST_TEST((test("Hartmut", sym, 'h')));
- BOOST_TEST((test("Tom", sym, 't')));
- BOOST_TEST((test("Kim", sym, 'k')));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, rule<output_iterator_type> > sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, 'j')));
- BOOST_TEST((test("Hartmut", sym2, 'h')));
- BOOST_TEST((test("Tom", sym2, 't')));
- BOOST_TEST((test("Kim", sym2, 'k')));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", 'j')));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // more advanced
- using boost::spirit::karma::rule;
- using boost::spirit::karma::lit;
- using boost::spirit::karma::string;
-
- typedef spirit_test::output_iterator<char>::type output_iterator_type;
-
- symbols<char, rule<output_iterator_type, std::string()> > sym;
- rule<output_iterator_type, std::string()> r1 = string;
-
- sym.add
- ('j', r1.alias())
- ('h', r1.alias())
- ('t', r1.alias())
- ('k', r1.alias())
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, std::string> >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, fusion::make_vector('j', "Joel"))));
- BOOST_TEST((test("Hartmut", sym, fusion::make_vector('h', "Hartmut"))));
- BOOST_TEST((test("Tom", sym, fusion::make_vector('t', "Tom"))));
- BOOST_TEST((test("Kim", sym, fusion::make_vector('k', "Kim"))));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, rule<output_iterator_type, std::string()> > sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, fusion::make_vector('j', "Joel"))));
- BOOST_TEST((test("Hartmut", sym2, fusion::make_vector('h', "Hartmut"))));
- BOOST_TEST((test("Tom", sym2, fusion::make_vector('t', "Tom"))));
- BOOST_TEST((test("Kim", sym2, fusion::make_vector('k', "Kim"))));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", fusion::make_vector('j', "Joel"))));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // more advanced
- using boost::spirit::karma::rule;
- using boost::spirit::karma::lit;
- using boost::spirit::karma::char_;
-
- typedef spirit_test::output_iterator<char>::type output_iterator_type;
-
- symbols<char, rule<output_iterator_type, char()> > sym;
- rule<output_iterator_type, char()> r1 = char_;
-
- sym.add
- ('j', r1.alias())
- ('h', r1.alias())
- ('t', r1.alias())
- ('k', r1.alias())
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, rule<output_iterator_type, char()> > >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("J", sym, make_vector('j', 'J'))));
- BOOST_TEST((test("H", sym, make_vector('h', 'H'))));
- BOOST_TEST((test("T", sym, make_vector('t', 'T'))));
- BOOST_TEST((test("K", sym, make_vector('k', 'K'))));
- BOOST_TEST((!test("", sym, 'x')));
-
- // test copy
- symbols<char, rule<output_iterator_type, char()> > sym2;
- sym2 = sym;
- BOOST_TEST((test("J", sym2, make_vector('j', 'J'))));
- BOOST_TEST((test("H", sym2, make_vector('h', 'H'))));
- BOOST_TEST((test("T", sym2, make_vector('t', 'T'))));
- BOOST_TEST((test("K", sym2, make_vector('k', 'K'))));
- BOOST_TEST((!test("", sym2, 'x')));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Jyo", sym << "yo", make_vector('j', 'J'))));
-
- sym.remove
- ('j')
- ('h')
- ;
-
- BOOST_TEST((!test("", sym, 'j')));
- BOOST_TEST((!test("", sym, 'h')));
- }
-
- { // basics
- symbols<std::string> sym;
-
- sym.add
- ("Joel")
- ("Hartmut")
- ("Tom")
- ("Kim")
- ;
-
- boost::mpl::true_ f =
- boost::mpl::bool_<boost::spirit::traits::is_generator<
- symbols<char, std::string> >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym, "Joel")));
- BOOST_TEST((test("Hartmut", sym, "Hartmut")));
- BOOST_TEST((test("Tom", sym, "Tom")));
- BOOST_TEST((test("Kim", sym, "Kim")));
- BOOST_TEST((!test("", sym, "X")));
-
- // test copy
- symbols<std::string> sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2, "Joel")));
- BOOST_TEST((test("Hartmut", sym2, "Hartmut")));
- BOOST_TEST((test("Tom", sym2, "Tom")));
- BOOST_TEST((test("Kim", sym2, "Kim")));
- BOOST_TEST((!test("", sym2, "X")));
-
- // make sure it plays well with other generators
- BOOST_TEST((test("Joelyo", sym << "yo", "Joel")));
-
- sym.remove
- ("Joel")
- ("Hartmut")
- ;
-
- BOOST_TEST((!test("", sym, "Joel")));
- BOOST_TEST((!test("", sym, "Hartmut")));
- }
-
{ // lower/upper handling
using namespace boost::spirit::ascii;
using boost::spirit::karma::lower;
Added: trunk/libs/spirit/test/karma/symbols2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/symbols2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,144 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+
+#include "test.hpp"
+
+namespace fusion = boost::fusion;
+
+template <typename T>
+inline std::vector<T>
+make_vector(T const& t1, T const& t2)
+{
+ std::vector<T> v;
+ v.push_back(t1);
+ v.push_back(t2);
+ return v;
+}
+
+int main()
+{
+ using spirit_test::test;
+ using boost::spirit::karma::symbols;
+
+ { // advanced
+ using boost::spirit::karma::rule;
+ using boost::spirit::karma::lit;
+
+ typedef spirit_test::output_iterator<char>::type output_iterator_type;
+
+ symbols<char, rule<output_iterator_type> > sym;
+
+ rule<output_iterator_type> r1 = lit("Joel");
+ rule<output_iterator_type> r2 = lit("Hartmut");
+ rule<output_iterator_type> r3 = lit("Tom");
+ rule<output_iterator_type> r4 = lit("Kim");
+
+ sym.add
+ ('j', r1.alias())
+ ('h', r2.alias())
+ ('t', r3.alias())
+ ('k', r4.alias())
+ ;
+
+ boost::mpl::true_ f =
+ boost::mpl::bool_<boost::spirit::traits::is_generator<
+ symbols<char, rule<output_iterator_type> > >::value>();
+
+ // silence stupid compiler warnings
+ // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
+ BOOST_TEST((f.value));
+
+ BOOST_TEST((test("Joel", sym, 'j')));
+ BOOST_TEST((test("Hartmut", sym, 'h')));
+ BOOST_TEST((test("Tom", sym, 't')));
+ BOOST_TEST((test("Kim", sym, 'k')));
+ BOOST_TEST((!test("", sym, 'x')));
+
+ // test copy
+ symbols<char, rule<output_iterator_type> > sym2;
+ sym2 = sym;
+ BOOST_TEST((test("Joel", sym2, 'j')));
+ BOOST_TEST((test("Hartmut", sym2, 'h')));
+ BOOST_TEST((test("Tom", sym2, 't')));
+ BOOST_TEST((test("Kim", sym2, 'k')));
+ BOOST_TEST((!test("", sym2, 'x')));
+
+ // make sure it plays well with other generators
+ BOOST_TEST((test("Joelyo", sym << "yo", 'j')));
+
+ sym.remove
+ ('j')
+ ('h')
+ ;
+
+ BOOST_TEST((!test("", sym, 'j')));
+ BOOST_TEST((!test("", sym, 'h')));
+ }
+
+ { // more advanced
+ using boost::spirit::karma::rule;
+ using boost::spirit::karma::lit;
+ using boost::spirit::karma::string;
+
+ typedef spirit_test::output_iterator<char>::type output_iterator_type;
+
+ symbols<char, rule<output_iterator_type, std::string()> > sym;
+ rule<output_iterator_type, std::string()> r1 = string;
+
+ sym.add
+ ('j', r1.alias())
+ ('h', r1.alias())
+ ('t', r1.alias())
+ ('k', r1.alias())
+ ;
+
+ boost::mpl::true_ f =
+ boost::mpl::bool_<boost::spirit::traits::is_generator<
+ symbols<char, std::string> >::value>();
+
+ // silence stupid compiler warnings
+ // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
+ BOOST_TEST((f.value));
+
+ BOOST_TEST((test("Joel", sym, fusion::make_vector('j', "Joel"))));
+ BOOST_TEST((test("Hartmut", sym, fusion::make_vector('h', "Hartmut"))));
+ BOOST_TEST((test("Tom", sym, fusion::make_vector('t', "Tom"))));
+ BOOST_TEST((test("Kim", sym, fusion::make_vector('k', "Kim"))));
+ BOOST_TEST((!test("", sym, 'x')));
+
+ // test copy
+ symbols<char, rule<output_iterator_type, std::string()> > sym2;
+ sym2 = sym;
+ BOOST_TEST((test("Joel", sym2, fusion::make_vector('j', "Joel"))));
+ BOOST_TEST((test("Hartmut", sym2, fusion::make_vector('h', "Hartmut"))));
+ BOOST_TEST((test("Tom", sym2, fusion::make_vector('t', "Tom"))));
+ BOOST_TEST((test("Kim", sym2, fusion::make_vector('k', "Kim"))));
+ BOOST_TEST((!test("", sym2, 'x')));
+
+ // make sure it plays well with other generators
+ BOOST_TEST((test("Joelyo", sym << "yo", fusion::make_vector('j', "Joel"))));
+
+ sym.remove
+ ('j')
+ ('h')
+ ;
+
+ BOOST_TEST((!test("", sym, 'j')));
+ BOOST_TEST((!test("", sym, 'h')));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/karma/symbols3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/symbols3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,134 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_auxiliary.hpp>
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_operator.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/karma_generate.hpp>
+#include <boost/spirit/include/karma_nonterminal.hpp>
+
+#include "test.hpp"
+
+namespace fusion = boost::fusion;
+
+template <typename T>
+inline std::vector<T>
+make_vector(T const& t1, T const& t2)
+{
+ std::vector<T> v;
+ v.push_back(t1);
+ v.push_back(t2);
+ return v;
+}
+
+int main()
+{
+ using spirit_test::test;
+ using boost::spirit::karma::symbols;
+
+ { // more advanced
+ using boost::spirit::karma::rule;
+ using boost::spirit::karma::lit;
+ using boost::spirit::karma::char_;
+
+ typedef spirit_test::output_iterator<char>::type output_iterator_type;
+
+ symbols<char, rule<output_iterator_type, char()> > sym;
+ rule<output_iterator_type, char()> r1 = char_;
+
+ sym.add
+ ('j', r1.alias())
+ ('h', r1.alias())
+ ('t', r1.alias())
+ ('k', r1.alias())
+ ;
+
+ boost::mpl::true_ f =
+ boost::mpl::bool_<boost::spirit::traits::is_generator<
+ symbols<char, rule<output_iterator_type, char()> > >::value>();
+
+ // silence stupid compiler warnings
+ // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
+ BOOST_TEST((f.value));
+
+ BOOST_TEST((test("J", sym, make_vector('j', 'J'))));
+ BOOST_TEST((test("H", sym, make_vector('h', 'H'))));
+ BOOST_TEST((test("T", sym, make_vector('t', 'T'))));
+ BOOST_TEST((test("K", sym, make_vector('k', 'K'))));
+ BOOST_TEST((!test("", sym, 'x')));
+
+ // test copy
+ symbols<char, rule<output_iterator_type, char()> > sym2;
+ sym2 = sym;
+ BOOST_TEST((test("J", sym2, make_vector('j', 'J'))));
+ BOOST_TEST((test("H", sym2, make_vector('h', 'H'))));
+ BOOST_TEST((test("T", sym2, make_vector('t', 'T'))));
+ BOOST_TEST((test("K", sym2, make_vector('k', 'K'))));
+ BOOST_TEST((!test("", sym2, 'x')));
+
+ // make sure it plays well with other generators
+ BOOST_TEST((test("Jyo", sym << "yo", make_vector('j', 'J'))));
+
+ sym.remove
+ ('j')
+ ('h')
+ ;
+
+ BOOST_TEST((!test("", sym, 'j')));
+ BOOST_TEST((!test("", sym, 'h')));
+ }
+
+ { // basics
+ symbols<std::string> sym;
+
+ sym.add
+ ("Joel")
+ ("Hartmut")
+ ("Tom")
+ ("Kim")
+ ;
+
+ boost::mpl::true_ f =
+ boost::mpl::bool_<boost::spirit::traits::is_generator<
+ symbols<char, std::string> >::value>();
+
+ // silence stupid compiler warnings
+ // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
+ BOOST_TEST((f.value));
+
+ BOOST_TEST((test("Joel", sym, "Joel")));
+ BOOST_TEST((test("Hartmut", sym, "Hartmut")));
+ BOOST_TEST((test("Tom", sym, "Tom")));
+ BOOST_TEST((test("Kim", sym, "Kim")));
+ BOOST_TEST((!test("", sym, "X")));
+
+ // test copy
+ symbols<std::string> sym2;
+ sym2 = sym;
+ BOOST_TEST((test("Joel", sym2, "Joel")));
+ BOOST_TEST((test("Hartmut", sym2, "Hartmut")));
+ BOOST_TEST((test("Tom", sym2, "Tom")));
+ BOOST_TEST((test("Kim", sym2, "Kim")));
+ BOOST_TEST((!test("", sym2, "X")));
+
+ // make sure it plays well with other generators
+ BOOST_TEST((test("Joelyo", sym << "yo", "Joel")));
+
+ sym.remove
+ ("Joel")
+ ("Hartmut")
+ ;
+
+ BOOST_TEST((!test("", sym, "Joel")));
+ BOOST_TEST((!test("", sym, "Hartmut")));
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/karma/utree.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/utree.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,335 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2001-2010 Joel de Guzman
-// Copyright (c) 2010 Bryce Lelbach
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/mpl/print.hpp>
-
-#include <boost/spirit/include/support_utree.hpp>
-#include <boost/spirit/include/karma.hpp>
-
-#include <sstream>
-
-#include "test.hpp"
-
-int main()
-{
- using spirit_test::test;
- using spirit_test::test_delimited;
- using boost::spirit::utree;
- using boost::spirit::utree_type;
- using boost::spirit::utf8_string_range_type;
- using boost::spirit::utf8_string_type;
- using boost::spirit::utf8_symbol_type;
-
- using boost::spirit::karma::char_;
- using boost::spirit::karma::bool_;
- using boost::spirit::karma::int_;
- using boost::spirit::karma::double_;
- using boost::spirit::karma::string;
- using boost::spirit::karma::space;
- using boost::spirit::karma::rule;
-
- typedef spirit_test::output_iterator<char>::type output_iterator;
-
- // primitive data types
- {
- utree ut('x');
- BOOST_TEST(test("x", char_, ut));
-
- ut = false;
- BOOST_TEST(test("false", bool_, ut));
-
- ut = 123;
- BOOST_TEST(test("123", int_, ut));
-
- ut = 123.45;
- BOOST_TEST(test("123.45", double_, ut));
-
- ut = "abc";
- BOOST_TEST(test("abc", string, ut));
-
- ut = utf8_symbol_type("xyz");
- BOOST_TEST(test("xyz", string, ut));
- }
-
- // sequences
- {
- using boost::spirit::karma::digit;
- using boost::spirit::karma::repeat;
-
- utree ut;
- ut.push_back('x');
- ut.push_back('y');
- BOOST_TEST(test("xy", char_ << char_, ut));
-
- ut.clear();
- ut.push_back(123);
- ut.push_back(456);
- BOOST_TEST(test_delimited("123 456 ", int_ << int_, ut, space));
-
- ut.clear();
- ut.push_back(1.23);
- ut.push_back(4.56);
- BOOST_TEST(test_delimited("1.23 4.56 ", double_ << double_, ut, space));
-
- ut.clear();
- ut.push_back(1.23);
- ut.push_back("ab");
- BOOST_TEST(test("1.23ab", double_ << string, ut));
-
- ut.clear();
-
- rule<output_iterator, double()> r1 = double_;
- rule<output_iterator, utree()> r2 = double_;
-
- // ( 1.23 "a" "b" )
- ut.push_back(1.23);
- ut.push_back('a');
- ut.push_back('b');
- BOOST_TEST(test("1.23ab", double_ << *char_, ut));
- BOOST_TEST(test("1.23ab", r1 << *char_, ut));
- BOOST_TEST(test("1.23ab", r2 << *char_, ut));
-
- // ( ( 1.23 ) "a" "b" )
- ut.clear();
- utree ut1;
- ut1.push_back(1.23);
- ut.push_back(ut1);
- ut.push_back('a');
- ut.push_back('b');
- BOOST_TEST(test("1.23ab", r1 << *char_, ut));
- BOOST_TEST(test("1.23ab", r2 << *char_, ut));
-
- // ( "a" "b" 1.23 )
- ut.clear();
- ut.push_back('a');
- ut.push_back('b');
- ut.push_back(1.23);
- BOOST_TEST(test("ab1.23", repeat(2)[~digit] << double_, ut));
- BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r1, ut));
- BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut));
-
- // ( "a" "b" ( 1.23 ) )
- ut.clear();
- ut.push_back('a');
- ut.push_back('b');
- ut.push_back(ut1);
- BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r1, ut));
- BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut));
- }
-
- // kleene star
- {
- utree ut;
- ut.push_back('a');
- ut.push_back('b');
- BOOST_TEST(test("ab", *char_, ut));
-
- ut.clear();
- ut.push_back(123);
- ut.push_back(456);
- BOOST_TEST(test_delimited("123 456 ", *int_, ut, space));
-
- ut.clear();
- ut.push_back(1.23);
- ut.push_back(4.56);
- BOOST_TEST(test_delimited("1.23 4.56 ", *double_, ut, space));
- }
-
- // lists
- {
- rule<output_iterator, utree()> r1, r1ref;
- rule<output_iterator, utf8_string_range_type()> r1str;
- rule<output_iterator, utree::const_range()> r1list;
-
- r1 = double_ | int_ | r1str | r1list | r1ref;
-
- r1ref = r1;
-
- r1str = string;
-
- r1list = '(' << -(r1 % ',') << ')';
-
- // ( "abc" "def" )
- utree ut;
- ut.push_back("abc");
- ut.push_back("def");
- BOOST_TEST(test("abc,def", string % ',', ut));
- BOOST_TEST(test("(abc,def)", r1, ut));
-
- // ( ( "abc" "def" ) )
- utree ut1;
- ut1.push_back(ut);
- BOOST_TEST(test("((abc,def))", r1, ut1));
-
-// rule<output_iterator, std::vector<char>()> r2 = char_ % ',';
-// BOOST_TEST(test("abc,def", r2, ut));
-// BOOST_TEST(test("abc,def", r2, ut1));
-
- // ( ( "abc" "def" ) ( "abc" "def" ) )
- ut1.push_back(ut);
- BOOST_TEST(test("(abc,def) (abc,def)", r1 << ' ' << r1, ut1));
-
- // ( 123 456 )
- ut.clear();
- ut.push_back(123);
- ut.push_back(456);
- BOOST_TEST(test("123,456", int_ % ',', ut));
- BOOST_TEST(test("(123,456)", r1, ut));
-
- // ( ( 123 456 ) )
- ut1.clear();
- ut1.push_back(ut);
- BOOST_TEST(test("((123,456))", r1, ut1));
-
-// rule<output_iterator, std::vector<int>()> r4 = int_ % ',';
-// BOOST_TEST(test("123,456", r4, ut));
-// BOOST_TEST(test("123,456", r4, ut1));
-
- // ( ( 123 456 ) ( 123 456 ) )
- ut1.push_back(ut);
- BOOST_TEST(test("(123,456) (123,456)", r1 << ' ' << r1, ut1));
-
- // ( 1.23 4.56 )
- ut.clear();
- ut.push_back(1.23);
- ut.push_back(4.56);
- BOOST_TEST(test("1.23,4.56", double_ % ',', ut));
- BOOST_TEST(test("(1.23,4.56)", r1, ut));
-
- // ( ( 1.23 4.56 ) )
- ut1.clear();
- ut1.push_back(ut);
- BOOST_TEST(test("((1.23,4.56))", r1, ut1));
-
-// rule<output_iterator, std::vector<double>()> r6 = double_ % ',';
-// BOOST_TEST(test("1.23,4.56", r6, ut));
-// BOOST_TEST(test("1.23,4.56", r6, ut1));
-
- // ( ( 1.23 4.56 ) ( 1.23 4.56 ) )
- ut1.push_back(ut);
- BOOST_TEST(test("(1.23,4.56) (1.23,4.56)", r1 <<' ' << r1, ut1));
- }
-
- // alternatives
- {
- rule<output_iterator, utree()> r1 = int_ | double_;
- utree ut(10);
- BOOST_TEST(test("10", int_ | double_, ut));
- BOOST_TEST(test("10", r1, ut));
-
- ut = 10.2;
- BOOST_TEST(test("10.2", int_ | double_, ut));
- BOOST_TEST(test("10.2", r1, ut));
- }
-
- // optionals
- {
- utree ut('x');
- BOOST_TEST(test("x", -char_, ut));
-
- ut.clear();
- BOOST_TEST(test("", -char_, ut));
- }
-
- // as_string
- {
- using boost::spirit::karma::digit;
- using boost::spirit::karma::as_string;
-
- utree ut("xy");
- BOOST_TEST(test("xy", string, ut));
- BOOST_TEST(test("xy", as_string[*char_], ut));
- BOOST_TEST(test("x,y", as_string[char_ << ',' << char_], ut));
-
- ut.clear();
- ut.push_back("ab");
- ut.push_back(1.2);
- BOOST_TEST(test("ab1.2", as_string[*~digit] << double_, ut));
- BOOST_TEST(test("a,b1.2", as_string[~digit % ','] << double_, ut));
- }
-
- // as
- {
- using boost::spirit::karma::digit;
- using boost::spirit::karma::as;
-
- typedef as<std::string> as_string_type;
- as_string_type const as_string = as_string_type();
-
- typedef as<utf8_symbol_type> as_symbol_type;
- as_symbol_type const as_symbol = as_symbol_type();
-
- utree ut("xy");
- BOOST_TEST(test("xy", string, ut));
- BOOST_TEST(test("xy", as_string[*char_], ut));
- BOOST_TEST(test("x,y", as_string[char_ << ',' << char_], ut));
-
- ut.clear();
- ut.push_back("ab");
- ut.push_back(1.2);
- BOOST_TEST(test("ab1.2", as_string[*~digit] << double_, ut));
- BOOST_TEST(test("a,b1.2", as_string[~digit % ','] << double_, ut));
-
- ut = utf8_symbol_type("xy");
- BOOST_TEST(test("xy", string, ut));
- BOOST_TEST(test("xy", as_symbol[*char_], ut));
- BOOST_TEST(test("x,y", as_symbol[char_ << ',' << char_], ut));
-
- ut.clear();
- ut.push_back(utf8_symbol_type("ab"));
- ut.push_back(1.2);
- BOOST_TEST(test("ab1.2", as_symbol[*~digit] << double_, ut));
- BOOST_TEST(test("a,b1.2", as_symbol[~digit % ','] << double_, ut));
- }
-
- // typed basic_string rules
- {
- utree ut("buzz");
-
- rule<output_iterator, utf8_string_type()> r1 = string;
- rule<output_iterator, utf8_symbol_type()> r2 = string;
-
- BOOST_TEST(test("buzz", r1, ut));
-
- ut = utf8_symbol_type("bar");
- BOOST_TEST(test("bar", r2, ut));
- }
-
- // parameterized karma::string
- {
- utree ut("foo");
-
- rule<output_iterator, utf8_string_type()> r1 = string("foo");
- BOOST_TEST(test("foo", string("foo"), ut));
- BOOST_TEST(test("foo", r1, ut));
- }
-
- {
- using boost::spirit::karma::verbatim;
- using boost::spirit::karma::repeat;
- using boost::spirit::karma::space;
- using boost::spirit::karma::digit;
-
- utree ut;
- ut.push_back('x');
- ut.push_back('y');
- ut.push_back('c');
- BOOST_TEST(test_delimited("xy c ", verbatim[repeat(2)[char_]] << char_, ut, space));
- BOOST_TEST(test_delimited("x yc ", char_ << verbatim[*char_], ut, space));
-
- ut.clear();
- ut.push_back('a');
- ut.push_back('b');
- ut.push_back(1.2);
- BOOST_TEST(test_delimited("ab 1.2 ", verbatim[repeat(2)[~digit]] << double_, ut, space));
- }
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/karma/utree1.cpp (from r67483, /trunk/libs/spirit/test/karma/utree.cpp)
==============================================================================
--- /trunk/libs/spirit/test/karma/utree.cpp (original)
+++ trunk/libs/spirit/test/karma/utree1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -124,212 +124,5 @@
BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut));
}
- // kleene star
- {
- utree ut;
- ut.push_back('a');
- ut.push_back('b');
- BOOST_TEST(test("ab", *char_, ut));
-
- ut.clear();
- ut.push_back(123);
- ut.push_back(456);
- BOOST_TEST(test_delimited("123 456 ", *int_, ut, space));
-
- ut.clear();
- ut.push_back(1.23);
- ut.push_back(4.56);
- BOOST_TEST(test_delimited("1.23 4.56 ", *double_, ut, space));
- }
-
- // lists
- {
- rule<output_iterator, utree()> r1, r1ref;
- rule<output_iterator, utf8_string_range_type()> r1str;
- rule<output_iterator, utree::const_range()> r1list;
-
- r1 = double_ | int_ | r1str | r1list | r1ref;
-
- r1ref = r1;
-
- r1str = string;
-
- r1list = '(' << -(r1 % ',') << ')';
-
- // ( "abc" "def" )
- utree ut;
- ut.push_back("abc");
- ut.push_back("def");
- BOOST_TEST(test("abc,def", string % ',', ut));
- BOOST_TEST(test("(abc,def)", r1, ut));
-
- // ( ( "abc" "def" ) )
- utree ut1;
- ut1.push_back(ut);
- BOOST_TEST(test("((abc,def))", r1, ut1));
-
-// rule<output_iterator, std::vector<char>()> r2 = char_ % ',';
-// BOOST_TEST(test("abc,def", r2, ut));
-// BOOST_TEST(test("abc,def", r2, ut1));
-
- // ( ( "abc" "def" ) ( "abc" "def" ) )
- ut1.push_back(ut);
- BOOST_TEST(test("(abc,def) (abc,def)", r1 << ' ' << r1, ut1));
-
- // ( 123 456 )
- ut.clear();
- ut.push_back(123);
- ut.push_back(456);
- BOOST_TEST(test("123,456", int_ % ',', ut));
- BOOST_TEST(test("(123,456)", r1, ut));
-
- // ( ( 123 456 ) )
- ut1.clear();
- ut1.push_back(ut);
- BOOST_TEST(test("((123,456))", r1, ut1));
-
-// rule<output_iterator, std::vector<int>()> r4 = int_ % ',';
-// BOOST_TEST(test("123,456", r4, ut));
-// BOOST_TEST(test("123,456", r4, ut1));
-
- // ( ( 123 456 ) ( 123 456 ) )
- ut1.push_back(ut);
- BOOST_TEST(test("(123,456) (123,456)", r1 << ' ' << r1, ut1));
-
- // ( 1.23 4.56 )
- ut.clear();
- ut.push_back(1.23);
- ut.push_back(4.56);
- BOOST_TEST(test("1.23,4.56", double_ % ',', ut));
- BOOST_TEST(test("(1.23,4.56)", r1, ut));
-
- // ( ( 1.23 4.56 ) )
- ut1.clear();
- ut1.push_back(ut);
- BOOST_TEST(test("((1.23,4.56))", r1, ut1));
-
-// rule<output_iterator, std::vector<double>()> r6 = double_ % ',';
-// BOOST_TEST(test("1.23,4.56", r6, ut));
-// BOOST_TEST(test("1.23,4.56", r6, ut1));
-
- // ( ( 1.23 4.56 ) ( 1.23 4.56 ) )
- ut1.push_back(ut);
- BOOST_TEST(test("(1.23,4.56) (1.23,4.56)", r1 <<' ' << r1, ut1));
- }
-
- // alternatives
- {
- rule<output_iterator, utree()> r1 = int_ | double_;
- utree ut(10);
- BOOST_TEST(test("10", int_ | double_, ut));
- BOOST_TEST(test("10", r1, ut));
-
- ut = 10.2;
- BOOST_TEST(test("10.2", int_ | double_, ut));
- BOOST_TEST(test("10.2", r1, ut));
- }
-
- // optionals
- {
- utree ut('x');
- BOOST_TEST(test("x", -char_, ut));
-
- ut.clear();
- BOOST_TEST(test("", -char_, ut));
- }
-
- // as_string
- {
- using boost::spirit::karma::digit;
- using boost::spirit::karma::as_string;
-
- utree ut("xy");
- BOOST_TEST(test("xy", string, ut));
- BOOST_TEST(test("xy", as_string[*char_], ut));
- BOOST_TEST(test("x,y", as_string[char_ << ',' << char_], ut));
-
- ut.clear();
- ut.push_back("ab");
- ut.push_back(1.2);
- BOOST_TEST(test("ab1.2", as_string[*~digit] << double_, ut));
- BOOST_TEST(test("a,b1.2", as_string[~digit % ','] << double_, ut));
- }
-
- // as
- {
- using boost::spirit::karma::digit;
- using boost::spirit::karma::as;
-
- typedef as<std::string> as_string_type;
- as_string_type const as_string = as_string_type();
-
- typedef as<utf8_symbol_type> as_symbol_type;
- as_symbol_type const as_symbol = as_symbol_type();
-
- utree ut("xy");
- BOOST_TEST(test("xy", string, ut));
- BOOST_TEST(test("xy", as_string[*char_], ut));
- BOOST_TEST(test("x,y", as_string[char_ << ',' << char_], ut));
-
- ut.clear();
- ut.push_back("ab");
- ut.push_back(1.2);
- BOOST_TEST(test("ab1.2", as_string[*~digit] << double_, ut));
- BOOST_TEST(test("a,b1.2", as_string[~digit % ','] << double_, ut));
-
- ut = utf8_symbol_type("xy");
- BOOST_TEST(test("xy", string, ut));
- BOOST_TEST(test("xy", as_symbol[*char_], ut));
- BOOST_TEST(test("x,y", as_symbol[char_ << ',' << char_], ut));
-
- ut.clear();
- ut.push_back(utf8_symbol_type("ab"));
- ut.push_back(1.2);
- BOOST_TEST(test("ab1.2", as_symbol[*~digit] << double_, ut));
- BOOST_TEST(test("a,b1.2", as_symbol[~digit % ','] << double_, ut));
- }
-
- // typed basic_string rules
- {
- utree ut("buzz");
-
- rule<output_iterator, utf8_string_type()> r1 = string;
- rule<output_iterator, utf8_symbol_type()> r2 = string;
-
- BOOST_TEST(test("buzz", r1, ut));
-
- ut = utf8_symbol_type("bar");
- BOOST_TEST(test("bar", r2, ut));
- }
-
- // parameterized karma::string
- {
- utree ut("foo");
-
- rule<output_iterator, utf8_string_type()> r1 = string("foo");
- BOOST_TEST(test("foo", string("foo"), ut));
- BOOST_TEST(test("foo", r1, ut));
- }
-
- {
- using boost::spirit::karma::verbatim;
- using boost::spirit::karma::repeat;
- using boost::spirit::karma::space;
- using boost::spirit::karma::digit;
-
- utree ut;
- ut.push_back('x');
- ut.push_back('y');
- ut.push_back('c');
- BOOST_TEST(test_delimited("xy c ", verbatim[repeat(2)[char_]] << char_, ut, space));
- BOOST_TEST(test_delimited("x yc ", char_ << verbatim[*char_], ut, space));
-
- ut.clear();
- ut.push_back('a');
- ut.push_back('b');
- ut.push_back(1.2);
- BOOST_TEST(test_delimited("ab 1.2 ", verbatim[repeat(2)[~digit]] << double_, ut, space));
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/karma/utree2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/utree2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,155 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 Joel de Guzman
+// Copyright (c) 2010 Bryce Lelbach
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/mpl/print.hpp>
+
+#include <boost/spirit/include/support_utree.hpp>
+#include <boost/spirit/include/karma.hpp>
+
+#include <sstream>
+
+#include "test.hpp"
+
+int main()
+{
+ using spirit_test::test;
+ using spirit_test::test_delimited;
+ using boost::spirit::utree;
+ using boost::spirit::utree_type;
+ using boost::spirit::utf8_string_range_type;
+ using boost::spirit::utf8_string_type;
+ using boost::spirit::utf8_symbol_type;
+
+ using boost::spirit::karma::char_;
+ using boost::spirit::karma::bool_;
+ using boost::spirit::karma::int_;
+ using boost::spirit::karma::double_;
+ using boost::spirit::karma::string;
+ using boost::spirit::karma::space;
+ using boost::spirit::karma::rule;
+
+ typedef spirit_test::output_iterator<char>::type output_iterator;
+
+ // kleene star
+ {
+ utree ut;
+ ut.push_back('a');
+ ut.push_back('b');
+ BOOST_TEST(test("ab", *char_, ut));
+
+ ut.clear();
+ ut.push_back(123);
+ ut.push_back(456);
+ BOOST_TEST(test_delimited("123 456 ", *int_, ut, space));
+
+ ut.clear();
+ ut.push_back(1.23);
+ ut.push_back(4.56);
+ BOOST_TEST(test_delimited("1.23 4.56 ", *double_, ut, space));
+ }
+
+ // lists
+ {
+ rule<output_iterator, utree()> r1, r1ref;
+ rule<output_iterator, utf8_string_range_type()> r1str;
+ rule<output_iterator, utree::const_range()> r1list;
+
+ r1 = double_ | int_ | r1str | r1list | r1ref;
+
+ r1ref = r1;
+
+ r1str = string;
+
+ r1list = '(' << -(r1 % ',') << ')';
+
+ // ( "abc" "def" )
+ utree ut;
+ ut.push_back("abc");
+ ut.push_back("def");
+ BOOST_TEST(test("abc,def", string % ',', ut));
+ BOOST_TEST(test("(abc,def)", r1, ut));
+
+ // ( ( "abc" "def" ) )
+ utree ut1;
+ ut1.push_back(ut);
+ BOOST_TEST(test("((abc,def))", r1, ut1));
+
+// rule<output_iterator, std::vector<char>()> r2 = char_ % ',';
+// BOOST_TEST(test("abc,def", r2, ut));
+// BOOST_TEST(test("abc,def", r2, ut1));
+
+ // ( ( "abc" "def" ) ( "abc" "def" ) )
+ ut1.push_back(ut);
+ BOOST_TEST(test("(abc,def) (abc,def)", r1 << ' ' << r1, ut1));
+
+ // ( 123 456 )
+ ut.clear();
+ ut.push_back(123);
+ ut.push_back(456);
+ BOOST_TEST(test("123,456", int_ % ',', ut));
+ BOOST_TEST(test("(123,456)", r1, ut));
+
+ // ( ( 123 456 ) )
+ ut1.clear();
+ ut1.push_back(ut);
+ BOOST_TEST(test("((123,456))", r1, ut1));
+
+// rule<output_iterator, std::vector<int>()> r4 = int_ % ',';
+// BOOST_TEST(test("123,456", r4, ut));
+// BOOST_TEST(test("123,456", r4, ut1));
+
+ // ( ( 123 456 ) ( 123 456 ) )
+ ut1.push_back(ut);
+ BOOST_TEST(test("(123,456) (123,456)", r1 << ' ' << r1, ut1));
+
+ // ( 1.23 4.56 )
+ ut.clear();
+ ut.push_back(1.23);
+ ut.push_back(4.56);
+ BOOST_TEST(test("1.23,4.56", double_ % ',', ut));
+ BOOST_TEST(test("(1.23,4.56)", r1, ut));
+
+ // ( ( 1.23 4.56 ) )
+ ut1.clear();
+ ut1.push_back(ut);
+ BOOST_TEST(test("((1.23,4.56))", r1, ut1));
+
+// rule<output_iterator, std::vector<double>()> r6 = double_ % ',';
+// BOOST_TEST(test("1.23,4.56", r6, ut));
+// BOOST_TEST(test("1.23,4.56", r6, ut1));
+
+ // ( ( 1.23 4.56 ) ( 1.23 4.56 ) )
+ ut1.push_back(ut);
+ BOOST_TEST(test("(1.23,4.56) (1.23,4.56)", r1 <<' ' << r1, ut1));
+ }
+
+ // alternatives
+ {
+ rule<output_iterator, utree()> r1 = int_ | double_;
+ utree ut(10);
+ BOOST_TEST(test("10", int_ | double_, ut));
+ BOOST_TEST(test("10", r1, ut));
+
+ ut = 10.2;
+ BOOST_TEST(test("10.2", int_ | double_, ut));
+ BOOST_TEST(test("10.2", r1, ut));
+ }
+
+ // optionals
+ {
+ utree ut('x');
+ BOOST_TEST(test("x", -char_, ut));
+
+ ut.clear();
+ BOOST_TEST(test("", -char_, ut));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/karma/utree3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/utree3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,134 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 Joel de Guzman
+// Copyright (c) 2010 Bryce Lelbach
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/mpl/print.hpp>
+
+#include <boost/spirit/include/support_utree.hpp>
+#include <boost/spirit/include/karma.hpp>
+
+#include <sstream>
+
+#include "test.hpp"
+
+int main()
+{
+ using spirit_test::test;
+ using spirit_test::test_delimited;
+ using boost::spirit::utree;
+ using boost::spirit::utree_type;
+ using boost::spirit::utf8_string_range_type;
+ using boost::spirit::utf8_string_type;
+ using boost::spirit::utf8_symbol_type;
+
+ using boost::spirit::karma::char_;
+ using boost::spirit::karma::bool_;
+ using boost::spirit::karma::int_;
+ using boost::spirit::karma::double_;
+ using boost::spirit::karma::string;
+ using boost::spirit::karma::space;
+ using boost::spirit::karma::rule;
+
+ typedef spirit_test::output_iterator<char>::type output_iterator;
+
+ // as_string
+ {
+ using boost::spirit::karma::digit;
+ using boost::spirit::karma::as_string;
+
+ utree ut("xy");
+ BOOST_TEST(test("xy", string, ut));
+ BOOST_TEST(test("xy", as_string[*char_], ut));
+ BOOST_TEST(test("x,y", as_string[char_ << ',' << char_], ut));
+
+ ut.clear();
+ ut.push_back("ab");
+ ut.push_back(1.2);
+ BOOST_TEST(test("ab1.2", as_string[*~digit] << double_, ut));
+ BOOST_TEST(test("a,b1.2", as_string[~digit % ','] << double_, ut));
+ }
+
+ // as
+ {
+ using boost::spirit::karma::digit;
+ using boost::spirit::karma::as;
+
+ typedef as<std::string> as_string_type;
+ as_string_type const as_string = as_string_type();
+
+ typedef as<utf8_symbol_type> as_symbol_type;
+ as_symbol_type const as_symbol = as_symbol_type();
+
+ utree ut("xy");
+ BOOST_TEST(test("xy", string, ut));
+ BOOST_TEST(test("xy", as_string[*char_], ut));
+ BOOST_TEST(test("x,y", as_string[char_ << ',' << char_], ut));
+
+ ut.clear();
+ ut.push_back("ab");
+ ut.push_back(1.2);
+ BOOST_TEST(test("ab1.2", as_string[*~digit] << double_, ut));
+ BOOST_TEST(test("a,b1.2", as_string[~digit % ','] << double_, ut));
+
+ ut = utf8_symbol_type("xy");
+ BOOST_TEST(test("xy", string, ut));
+ BOOST_TEST(test("xy", as_symbol[*char_], ut));
+ BOOST_TEST(test("x,y", as_symbol[char_ << ',' << char_], ut));
+
+ ut.clear();
+ ut.push_back(utf8_symbol_type("ab"));
+ ut.push_back(1.2);
+ BOOST_TEST(test("ab1.2", as_symbol[*~digit] << double_, ut));
+ BOOST_TEST(test("a,b1.2", as_symbol[~digit % ','] << double_, ut));
+ }
+
+ // typed basic_string rules
+ {
+ utree ut("buzz");
+
+ rule<output_iterator, utf8_string_type()> r1 = string;
+ rule<output_iterator, utf8_symbol_type()> r2 = string;
+
+ BOOST_TEST(test("buzz", r1, ut));
+
+ ut = utf8_symbol_type("bar");
+ BOOST_TEST(test("bar", r2, ut));
+ }
+
+ // parameterized karma::string
+ {
+ utree ut("foo");
+
+ rule<output_iterator, utf8_string_type()> r1 = string("foo");
+ BOOST_TEST(test("foo", string("foo"), ut));
+ BOOST_TEST(test("foo", r1, ut));
+ }
+
+ {
+ using boost::spirit::karma::verbatim;
+ using boost::spirit::karma::repeat;
+ using boost::spirit::karma::space;
+ using boost::spirit::karma::digit;
+
+ utree ut;
+ ut.push_back('x');
+ ut.push_back('y');
+ ut.push_back('c');
+ BOOST_TEST(test_delimited("xy c ", verbatim[repeat(2)[char_]] << char_, ut, space));
+ BOOST_TEST(test_delimited("x yc ", char_ << verbatim[*char_], ut, space));
+
+ ut.clear();
+ ut.push_back('a');
+ ut.push_back('b');
+ ut.push_back(1.2);
+ BOOST_TEST(test_delimited("ab 1.2 ", verbatim[repeat(2)[~digit]] << double_, ut, space));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/karma/wstream.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/karma/wstream.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,115 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+//
+// Distributed under 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)
+
+#include <stdint.h>
+#include <cwchar>
+#include <streambuf>
+#include <iostream>
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/karma_char.hpp>
+#include <boost/spirit/include/karma_string.hpp>
+#include <boost/spirit/include/karma_stream.hpp>
+#include <boost/spirit/include/karma_directive.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include "test.hpp"
+
+using namespace spirit_test;
+
+// a simple complex number representation z = a + bi
+struct complex
+{
+ complex (double a, double b)
+ : a(a), b(b)
+ {}
+
+ double a;
+ double b;
+
+ template <typename Char>
+ friend std::basic_ostream<Char>&
+ operator<< (std::basic_ostream<Char>& os, complex z)
+ {
+ os << "{" << z.a << "," << z.b << "}";
+ return os;
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using namespace boost::spirit;
+
+ {
+ BOOST_TEST(test(L"x", wstream, L'x'));
+ BOOST_TEST(test(L"xyz", wstream, L"xyz"));
+ BOOST_TEST(test(L"xyz", wstream, std::basic_string<wchar_t>(L"xyz")));
+ BOOST_TEST(test(L"1", wstream, 1));
+ BOOST_TEST(test(L"1.1", wstream, 1.1));
+ BOOST_TEST(test(L"{1.2,2.4}", wstream, complex(1.2, 2.4)));
+ }
+
+ {
+ BOOST_TEST(test(L"x", wstream(L'x')));
+ BOOST_TEST(test(L"xyz", wstream(L"xyz")));
+ BOOST_TEST(test(L"xyz", wstream(std::basic_string<wchar_t>(L"xyz"))));
+ BOOST_TEST(test(L"1", wstream(1)));
+ BOOST_TEST(test(L"1.1", wstream(1.1)));
+ BOOST_TEST(test(L"{1.2,2.4}", wstream(complex(1.2, 2.4))));
+ }
+
+ {
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test(L"x", lower[wstream], L'X'));
+ BOOST_TEST(test(L"xyz", lower[wstream], L"XYZ"));
+ BOOST_TEST(test(L"xyz", lower[wstream], std::basic_string<wchar_t>(L"XYZ")));
+ BOOST_TEST(test(L"X", upper[wstream], L'x'));
+ BOOST_TEST(test(L"XYZ", upper[wstream], L"xyz"));
+ BOOST_TEST(test(L"XYZ", upper[wstream], std::basic_string<wchar_t>(L"xyz")));
+ }
+
+ {
+ BOOST_TEST(test_delimited(L"x ", wstream, L'x', L' '));
+ BOOST_TEST(test_delimited(L"xyz ", wstream, L"xyz", L' '));
+ BOOST_TEST(test_delimited(L"xyz ", wstream, std::basic_string<wchar_t>(L"xyz"), L' '));
+ BOOST_TEST(test_delimited(L"1 ", wstream, 1, ' '));
+ BOOST_TEST(test_delimited(L"1.1 ", wstream, 1.1, ' '));
+ BOOST_TEST(test_delimited(L"{1.2,2.4} ", wstream, complex(1.2, 2.4), ' '));
+ }
+
+ {
+ using namespace boost::spirit::ascii;
+
+ BOOST_TEST(test_delimited(L"x ", lower[wstream], L'X', L' '));
+ BOOST_TEST(test_delimited(L"xyz ", lower[wstream], L"XYZ", L' '));
+ BOOST_TEST(test_delimited(L"xyz ", lower[wstream], std::basic_string<wchar_t>(L"XYZ"), L' '));
+ BOOST_TEST(test_delimited(L"X ", upper[wstream], L'x', L' '));
+ BOOST_TEST(test_delimited(L"XYZ ", upper[wstream], L"xyz", ' '));
+ BOOST_TEST(test_delimited(L"XYZ ", upper[wstream], std::basic_string<wchar_t>(L"xyz"), L' '));
+ }
+
+ { // lazy streams
+ namespace phx = boost::phoenix;
+
+ std::basic_string<wchar_t> ws(L"abc");
+ BOOST_TEST((test(L"abc", wstream(phx::val(ws)))));
+ BOOST_TEST((test(L"abc", wstream(phx::ref(ws)))));
+ }
+
+ {
+ boost::optional<wchar_t> c;
+ BOOST_TEST(!test(L"", wstream, c));
+ c = L'x';
+ BOOST_TEST(test(L"x", wstream, c));
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/lex/regression001.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression001.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,64 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Pavel Baranov
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-
-#include <iostream>
-#include <string>
-
-using namespace boost::spirit;
-using namespace boost::spirit::lex;
-
-typedef const char * base_iterator;
-
-///////////////////////////////////////////////////////////////////////////////
-// Token definition
-///////////////////////////////////////////////////////////////////////////////
-template <typename Lexer>
-struct position_helper_tokens : lexer<Lexer>
-{
- position_helper_tokens()
- {
- // define tokens and associate them with the lexer
- eol = "\n";
- any = "[^\n]+";
-
- // associate tokens with the lexer
- this->self
- = eol
- | any
- ;
- }
-
- token_def<> any, eol;
-};
-
-int main()
-{
- // read input from the given file
- std::string str ("test");
-
- // token type
- typedef lexertl::token<base_iterator, lex::omit, boost::mpl::false_> token_type;
-
- // lexer type
- typedef lexertl::actor_lexer<token_type> lexer_type;
-
- // create the lexer object instance needed to invoke the lexical analysis
- position_helper_tokens<lexer_type> position_helper_lexer;
-
- // tokenize the given string, all generated tokens are discarded
- base_iterator first = str.c_str();
- base_iterator last = &first[str.size()];
-
- for(lexer_type::iterator_type i = position_helper_lexer.begin(first, last);
- i != position_helper_lexer.end() && (*i).is_valid(); i++ )
- {
- }
- return boost::report_errors();
-}
-
Deleted: trunk/libs/spirit/test/lex/regression002.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression002.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,44 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Carl Barron
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include <iostream>
-#include <algorithm>
-#include "matlib.h"
-
-void test_matrix(std::vector<std::vector<double> > const& x)
-{
- BOOST_TEST(x.size() == 3);
- BOOST_TEST(x[0].size() == 2 && x[0][0] == 1 && x[0][1] == 2);
- BOOST_TEST(x[1].size() == 1 && x[1][0] == 3);
- BOOST_TEST(x[2].size() == 3 && x[2][0] == 4 && x[2][1] == 5 && x[2][2] == 6);
-}
-
-int main ()
-{
- std::string input("[[1,2][3][4,5,6]]");
-
- std::vector<std::vector<double> > results;
- typedef std::string::iterator iter;
- typedef boost::spirit::lex::lexertl::actor_lexer<
- boost::spirit::lex::lexertl::token<iter>
- > lexer_type;
-
- typedef matlib_tokens<lexer_type> matlib_type;
- matlib_type matrix(results);
- iter first = input.begin();
-
- try {
- BOOST_TEST(boost::spirit::lex::tokenize(first, input.end(), matrix));
- test_matrix(results);
- }
- catch (std::runtime_error const& e) {
- std::cerr << "caught exception: " << e.what() << std::endl;
- BOOST_TEST(false);
- }
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression003.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression003.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,50 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Carl Barron
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_static_lexertl.hpp>
-
-#include <iostream>
-#include <string>
-#include <vector>
-#include <exception>
-
-#include "matlib_static.h"
-#include "matlib.h"
-
-void test_matrix(std::vector<std::vector<double> > const& x)
-{
- BOOST_TEST(x.size() == 3);
- BOOST_TEST(x[0].size() == 2 && x[0][0] == 1 && x[0][1] == 2);
- BOOST_TEST(x[1].size() == 1 && x[1][0] == 3);
- BOOST_TEST(x[2].size() == 3 && x[2][0] == 4 && x[2][1] == 5 && x[2][2] == 6);
-}
-
-int main()
-{
- std::string input("[[1,2][3][4,5,6]]");
- std::vector<std::vector<double> > results;
-
- typedef std::string::iterator iter;
- typedef boost::spirit::lex::lexertl::static_actor_lexer<
- boost::spirit::lex::lexertl::token<iter>,
- boost::spirit::lex::lexertl::static_::lexer_matlib
- > lexer_type;
-
- typedef matlib_tokens<lexer_type> matlib_type;
- matlib_type matrix(results);
- iter first = input.begin();
-
- try {
- BOOST_TEST(boost::spirit::lex::tokenize(first, input.end(), matrix));
- test_matrix(results);
- }
- catch (std::runtime_error const& e) {
- std::cerr << e.what() << '\n';
- BOOST_TEST(false);
- }
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression003_generate.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression003_generate.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,32 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Carl Barron
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include <boost/spirit/include/lex_generate_static_lexertl.hpp>
-
-#include <fstream>
-#include <vector>
-
-#include "matlib.h"
-
-int main(int argc, char* argv[])
-{
- std::vector<std::vector<double> > results;
-
- typedef std::string::iterator iter;
- typedef boost::spirit::lex::lexertl::actor_lexer<
- boost::spirit::lex::lexertl::token<iter>
- > lexer_type;
-
- typedef matlib_tokens<lexer_type> matlib_type;
- matlib_type matrix(results);
-
- std::ofstream out(argc < 2 ? "matlib_static.h" : argv[1]);
- BOOST_TEST(boost::spirit::lex::lexertl::generate_static_dfa(matrix, out, "matlib"));
- return boost::report_errors();
-}
-
Deleted: trunk/libs/spirit/test/lex/regression003_generate_switch.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression003_generate_switch.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,33 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Carl Barron
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include <boost/spirit/include/lex_generate_static_lexertl.hpp>
-
-#include <fstream>
-#include <vector>
-
-#include "matlib.h"
-
-int main(int argc, char* argv[])
-{
- std::vector<std::vector<double> > results;
-
- typedef std::string::iterator iter;
- typedef boost::spirit::lex::lexertl::actor_lexer<
- boost::spirit::lex::lexertl::token<iter>
- > lexer_type;
-
- typedef matlib_tokens<lexer_type> matlib_type;
- matlib_type matrix(results);
-
- std::ofstream out(argc < 2 ? "matlib_static_switch.h" : argv[1]);
- BOOST_TEST(boost::spirit::lex::lexertl::generate_static_switch(
- matrix, out, "matlib_switch"));
- return boost::report_errors();
-}
-
Deleted: trunk/libs/spirit/test/lex/regression003_switch.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression003_switch.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,50 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Carl Barron
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/lex_static_lexertl.hpp>
-
-#include <iostream>
-#include <string>
-#include <vector>
-#include <exception>
-
-#include "matlib_static_switch.h"
-#include "matlib.h"
-
-void test_matrix(std::vector<std::vector<double> > const& x)
-{
- BOOST_TEST(x.size() == 3);
- BOOST_TEST(x[0].size() == 2 && x[0][0] == 1 && x[0][1] == 2);
- BOOST_TEST(x[1].size() == 1 && x[1][0] == 3);
- BOOST_TEST(x[2].size() == 3 && x[2][0] == 4 && x[2][1] == 5 && x[2][2] == 6);
-}
-
-int main()
-{
- std::string input("[[1,2][3][4,5,6]]");
- std::vector<std::vector<double> > results;
-
- typedef std::string::iterator iter;
- typedef boost::spirit::lex::lexertl::static_actor_lexer<
- boost::spirit::lex::lexertl::token<iter>,
- boost::spirit::lex::lexertl::static_::lexer_matlib_switch
- > lexer_type;
-
- typedef matlib_tokens<lexer_type> matlib_type;
- matlib_type matrix(results);
- iter first = input.begin();
-
- try {
- BOOST_TEST(boost::spirit::lex::tokenize(first, input.end(), matrix));
- test_matrix(results);
- }
- catch (std::runtime_error const& e) {
- std::cerr << e.what() << '\n';
- BOOST_TEST(false);
- }
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression004.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression004.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,90 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Tor Brede Vekterli
-//
-// Distributed under 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)
-
-// #define BOOST_SPIRIT_LEXERTL_DEBUG
-#define BOOST_VARIANT_MINIMIZE_SIZE
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/config/warning_disable.hpp>
-
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-#include <boost/spirit/include/phoenix_container.hpp>
-
-#include <iostream>
-#include <string>
-
-namespace qi = boost::spirit::qi;
-namespace lex = boost::spirit::lex;
-
-enum tokenids
-{
- IDANY = lex::min_token_id + 10 // Lower 8 bits is 0x0a, same as '\n'
-};
-
-template <typename Lexer>
-struct word_count_tokens : lex::lexer<Lexer>
-{
- word_count_tokens()
- {
- this->self.add_pattern
- ("TEST", "A")
- ;
- word = "{TEST}";
- this->self.add
- (word)
- ('\n')
- (".", IDANY)
- ;
- }
- lex::token_def<std::string> word;
-};
-
-template <typename Iterator>
-struct word_count_grammar : qi::grammar<Iterator>
-{
- template <typename TokenDef>
- word_count_grammar(TokenDef const& tok)
- : word_count_grammar::base_type(start)
- , c(0), w(0), l(0)
- {
- using boost::phoenix::ref;
- using qi::lit;
- using qi::token;
-
- start = *( tok.word [++ref(w)]
- | lit('\n') [++ref(l)]
- | token(IDANY) [++ref(c)]
- )
- ;
- }
- std::size_t c, w, l;
- qi::rule<Iterator> start;
-};
-
-
-int main()
-{
- typedef lex::lexertl::token<
- const char*, boost::mpl::vector<std::string>
- > token_type;
-
- typedef lex::lexertl::lexer<token_type> lexer_type;
- typedef word_count_tokens<lexer_type>::iterator_type iterator_type;
- word_count_tokens<lexer_type> word_count; // Our lexer
- word_count_grammar<iterator_type> g (word_count); // Our parser
-
- std::string str ("A\nBCDEFGHI");
- char const* first = str.c_str();
- char const* last = &first[str.size()];
-
- BOOST_TEST(lex::tokenize_and_parse(first, last, word_count, g));
- BOOST_TEST(g.l == 1 && g.w == 1 && g.c == 8);
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression005.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression005.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,92 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2009 Jean-Francois Ostiguy
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/config/warning_disable.hpp>
-
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include <boost/spirit/include/qi.hpp>
-
-#include <string>
-#include <iostream>
-#include <sstream>
-
-namespace lex = boost::spirit::lex;
-namespace qi = boost::spirit::qi;
-namespace mpl = boost::mpl;
-
-template <typename Lexer>
-struct my_lexer : lex::lexer<Lexer>
-{
- my_lexer()
- {
- delimiter = "BEGIN|END";
- identifier = "[a-zA-Z][_\\.a-zA-Z0-9]*";
- ws = "[ \\t\\n]+";
- real = "([0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?)|([-+]?[1-9]+\\.?([eE][-+]?[0-9]+))";
- integer = "[0-9]+";
-
- this->self += ws[lex::_pass = lex::pass_flags::pass_ignore];
- this->self += delimiter;
- this->self += identifier;
- this->self += real;
- this->self += integer;
- this->self += '=';
- this->self += ';';
- }
-
- lex::token_def<> ws;
- lex::token_def<std::string> identifier;
- lex::token_def<int> integer;
- lex::token_def<double> real;
- lex::token_def<> delimiter;
-};
-
-template <typename Iterator>
-struct my_grammar : qi::grammar<Iterator>
-{
- template <typename TokenDef>
- my_grammar( TokenDef const& tok )
- : my_grammar::base_type(statement)
- {
- statement
- = qi::eoi
- | *(delimiter | declaration)
- ;
-
- delimiter = tok.delimiter >> tok.identifier;
- declaration = tok.identifier >> option >> ';';
- option = *(tok.identifier >> '=' >> (tok.real | tok.integer));
- }
-
- qi::rule<Iterator> statement, delimiter, declaration, option;
-};
-
-typedef lex::lexertl::token<char const*
- , mpl::vector<std::string, double, int> > token_type;
-typedef lex::lexertl::actor_lexer<token_type> lexer_type;
-typedef my_lexer<lexer_type>::iterator_type iterator_type;
-
-int main()
-{
- std::string test_string ("BEGIN section\n");
- // we introduce a syntax error: ";;" instead of ";" as a terminator.
- test_string += "Identity;;\n"; // this will make the parser fail
- test_string += "END section\n" ;
-
- char const* first = &test_string[0];
- char const* last = &first[test_string.size()];
-
- my_lexer<lexer_type> lexer;
- my_grammar<iterator_type> grammar(lexer);
-
- BOOST_TEST(lex::tokenize_and_parse(first, last, lexer, grammar));
- BOOST_TEST(first != last);
-
- return boost::report_errors();
-}
-
-
Deleted: trunk/libs/spirit/test/lex/regression006.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression006.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,132 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2010 Sergey "GooRoo" Olendarenko
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/config/warning_disable.hpp>
-
-#include <cstdlib>
-#include <iostream>
-#include <locale>
-#include <string>
-
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include <boost/spirit/include/phoenix_object.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-#include <boost/spirit/include/phoenix_container.hpp>
-
-namespace lex = boost::spirit::lex;
-namespace phoenix = boost::phoenix;
-
-typedef std::basic_string<wchar_t> wstring_type;
-
-///////////////////////////////////////////////////////////////////////////////
-enum tokenids
-{
- ID_IDENT = 1,
- ID_CONSTANT,
- ID_OPERATION,
- ID_BRACKET
-};
-
-///////////////////////////////////////////////////////////////////////////////
-struct test_data
-{
- int tokenid;
- wstring_type value;
-};
-
-// alpha+x1*(2.836-x2[i])
-test_data data[] =
-{
- { ID_IDENT, L"alpha" },
- { ID_OPERATION, L"+" },
- { ID_IDENT, L"x1" },
- { ID_OPERATION, L"*" },
- { ID_BRACKET, L"(" },
- { ID_CONSTANT, L"2.836" },
- { ID_OPERATION, L"-" },
- { ID_IDENT, L"x2" },
- { ID_BRACKET, L"[" },
- { ID_IDENT, L"i" },
- { ID_BRACKET, L"]" },
- { ID_BRACKET, L")" }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-struct test_impl
-{
- template <typename TokenId, typename Value>
- struct result { typedef void type; };
-
- template <typename TokenId, typename Value>
- void operator()(TokenId const& tokenid, Value const& val) const
- {
- BOOST_TEST(sequence_counter < sizeof(data)/sizeof(data[0]));
- BOOST_TEST(data[sequence_counter].tokenid == tokenid);
- BOOST_TEST(0 == val.which());
-
- typedef boost::iterator_range<wstring_type::iterator> iterator_range;
- iterator_range r = boost::get<iterator_range>(val);
- BOOST_TEST(data[sequence_counter].value ==
- wstring_type(r.begin(), r.end()));
-
- ++sequence_counter;
- }
-
- static int sequence_counter;
-};
-int test_impl::sequence_counter = 0;
-
-phoenix::function<test_impl> const test = test_impl();
-
-///////////////////////////////////////////////////////////////////////////////
-template <typename Lexer>
-struct mega_tokens : lex::lexer<Lexer>
-{
- mega_tokens()
- : identifier(L"[a-zA-Z_][a-zA-Z0-9_]*", ID_IDENT)
- , constant (L"[0-9]+(\\.[0-9]+)?", ID_CONSTANT)
- , operation (L"[\\+\\-\\*/]", ID_OPERATION)
- , bracket (L"[\\(\\)\\[\\]]", ID_BRACKET)
- {
- using lex::_tokenid;
- using lex::_val;
-
- this->self
- = operation [ test(_tokenid, _val) ]
- | identifier [ test(_tokenid, _val) ]
- | constant [ test(_tokenid, _val) ]
- | bracket [ test(_tokenid, _val) ]
- ;
- }
-
- lex::token_def<wchar_t, wchar_t> operation;
- lex::token_def<wstring_type, wchar_t> identifier;
- lex::token_def<double, wchar_t> constant;
- lex::token_def<wchar_t, wchar_t> bracket;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- typedef wstring_type::iterator base_iterator;
- typedef lex::lexertl::token<
- base_iterator, boost::mpl::vector<wchar_t, wstring_type, double>
- > token_type;
- typedef lex::lexertl::actor_lexer<token_type> lexer_type;
- typedef mega_tokens<lexer_type>::iterator_type iterator_type;
-
- mega_tokens<lexer_type> mega_lexer;
-
- wstring_type exampleStr = L"alpha+x1*(2.836-x2[i])";
- base_iterator first = exampleStr.begin();
-
- BOOST_TEST(lex::tokenize(first, exampleStr.end(), mega_lexer));
- BOOST_TEST(test_impl::sequence_counter == sizeof(data)/sizeof(data[0]));
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression007.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression007.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,108 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2010 Mathias Gaunard
-//
-// Distributed under 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)
-
-// #define BOOST_SPIRIT_LEXERTL_DEBUG
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/support_multi_pass.hpp>
-#include <boost/spirit/include/classic_position_iterator.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-
-#include <boost/spirit/home/phoenix/core.hpp>
-#include <boost/spirit/home/phoenix/operator.hpp>
-#include <boost/spirit/home/phoenix/statement.hpp>
-#include <boost/spirit/home/phoenix/object.hpp>
-#include <boost/spirit/home/phoenix/stl.hpp>
-
-namespace spirit = boost::spirit;
-namespace lex = spirit::lex;
-namespace phoenix = boost::phoenix;
-
-typedef spirit::classic::position_iterator2<
- spirit::multi_pass<std::istreambuf_iterator<char> >
-> file_iterator;
-
-typedef boost::iterator_range<file_iterator> file_range;
-
-inline file_iterator
-make_file_iterator(std::istream& input, const std::string& filename)
-{
- return file_iterator(
- spirit::make_default_multi_pass(
- std::istreambuf_iterator<char>(input)),
- spirit::multi_pass<std::istreambuf_iterator<char> >(),
- filename);
-}
-
-struct identifier
-{
- identifier(file_iterator begin, file_iterator end)
- {
- }
-};
-
-struct string_literal
-{
- string_literal(file_iterator begin, file_iterator end)
- {
- }
-};
-
-typedef lex::lexertl::token<
- file_iterator, boost::mpl::vector<identifier, string_literal>
-> token_type;
-
-struct lexer
- : lex::lexer<lex::lexertl::actor_lexer<token_type> >
-{
- lexer()
- : id("[a-zA-Z0-9]+", 1)
- , st("'[^'\\n]*'", 2)
- {
- self("ST") =
- st [ lex::_state = "INITIAL" ]
- ;
-
- self("*") =
- id [ lex::_state = "ST" ]
- | lex::token_def<>(".", 3) [ lex::_state = "ST" ]
- ;
- }
-
- lex::token_def<identifier> id;
- lex::token_def<string_literal> st;
-};
-
-typedef lexer::iterator_type token_iterator;
-
-int main()
-{
- std::stringstream ss;
- ss << "foo 'bar'";
-
- file_iterator begin = make_file_iterator(ss, "SS");
- file_iterator end;
-
- lexer l;
- token_iterator begin2 = l.begin(begin, end, "ST");
- token_iterator end2 = l.end();
-
- std::size_t test_data[] = { 1, 3, 2 };
- std::size_t const test_data_size = sizeof(test_data)/sizeof(test_data[0]);
-
- token_iterator it = begin2;
- std::size_t i = 0;
- for (/**/; it != end2 && i < test_data_size; ++it, ++i)
- {
- BOOST_TEST(it->id() == test_data[i]);
- }
- BOOST_TEST(it == end2);
- BOOST_TEST(i == test_data_size);
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression008.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression008.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,115 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2010 Mathias Gaunard
-//
-// Distributed under 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)
-
-// #define BOOST_SPIRIT_LEXERTL_DEBUG 1
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/support_multi_pass.hpp>
-#include <boost/spirit/include/classic_position_iterator.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-
-#include <boost/spirit/home/phoenix/core.hpp>
-#include <boost/spirit/home/phoenix/operator.hpp>
-#include <boost/spirit/home/phoenix/statement.hpp>
-#include <boost/spirit/home/phoenix/object.hpp>
-#include <boost/spirit/home/phoenix/stl.hpp>
-
-namespace spirit = boost::spirit;
-namespace lex = spirit::lex;
-namespace phoenix = boost::phoenix;
-
-typedef spirit::classic::position_iterator2<
- spirit::multi_pass<std::istreambuf_iterator<char> >
-> file_iterator;
-
-inline file_iterator
-make_file_iterator(std::istream& input, const std::string& filename)
-{
- return file_iterator(
- spirit::make_default_multi_pass(
- std::istreambuf_iterator<char>(input)),
- spirit::multi_pass<std::istreambuf_iterator<char> >(),
- filename);
-}
-
-struct identifier
-{
- identifier(file_iterator begin, file_iterator end)
- {
- }
-};
-
-struct string_literal
-{
- string_literal(file_iterator begin, file_iterator end)
- {
- }
-};
-
-typedef lex::lexertl::token<
- file_iterator, boost::mpl::vector<identifier, string_literal>
-> token_type;
-
-struct lexer
- : lex::lexer<lex::lexertl::actor_lexer<token_type> >
-{
- lexer()
- : id("[a-zA-Z0-9]+", 1)
- , st("'[^'\\n]*'", 2)
- {
- self = id [
- lex::_state = "ST"
- ]
- | lex::token_def<>(".", 3) [
- lex::_state = "ST"
- ]
- ;
-
- self("ST") =
- st [
- lex::_state = "INITIAL"
- ]
- | lex::token_def<>(".", 4) [
- lex::_state = "INITIAL"
- , lex::_pass = lex::pass_flags::pass_fail
- ]
- ;
- }
-
- lex::token_def<identifier> id;
- lex::token_def<string_literal> st;
-};
-
-typedef lexer::iterator_type token_iterator;
-
-int main()
-{
- std::stringstream ss;
- ss << "foo 'bar'";
-
- file_iterator begin = make_file_iterator(ss, "SS");
- file_iterator end;
-
- lexer l;
- token_iterator begin2 = l.begin(begin, end, "ST");
- token_iterator end2 = l.end();
-
- std::size_t test_data[] = { 1, 3, 2 };
- std::size_t const test_data_size = sizeof(test_data)/sizeof(test_data[0]);
-
- token_iterator it = begin2;
- std::size_t i = 0;
- for (/**/; it != end2 && i < test_data_size; ++it, ++i)
- {
- BOOST_TEST(it->id() == test_data[i]);
- }
- BOOST_TEST(it == end2);
- BOOST_TEST(i == test_data_size);
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression009.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression009.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,103 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2010 Mathias Gaunard
-//
-// Distributed under 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)
-
-#define BOOST_SPIRIT_DEBUG 1 // required for token streaming
-// #define BOOST_SPIRIT_LEXERTL_DEBUG 1
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/support_multi_pass.hpp>
-#include <boost/spirit/include/classic_position_iterator.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-
-#include <boost/spirit/home/phoenix/core.hpp>
-#include <boost/spirit/home/phoenix/operator.hpp>
-#include <boost/spirit/home/phoenix/statement.hpp>
-#include <boost/spirit/home/phoenix/object.hpp>
-
-#include <sstream>
-
-namespace spirit = boost::spirit;
-namespace lex = spirit::lex;
-namespace phoenix = boost::phoenix;
-
-typedef spirit::classic::position_iterator2<
- spirit::multi_pass<std::istreambuf_iterator<char> >
-> file_iterator;
-
-typedef boost::iterator_range<file_iterator> file_range;
-
-inline file_iterator
-make_file_iterator(std::istream& input, const std::string& filename)
-{
- return file_iterator(
- spirit::make_default_multi_pass(
- std::istreambuf_iterator<char>(input)),
- spirit::multi_pass<std::istreambuf_iterator<char> >(),
- filename);
-}
-
-struct string_literal
-{
- string_literal(file_iterator begin, file_iterator end)
- {
- }
-};
-
-typedef lex::lexertl::token<
- file_iterator, boost::mpl::vector<string_literal>
-> token_type;
-
-struct lexer
- : lex::lexer<lex::lexertl::actor_lexer<token_type> >
-{
- lexer() : st("'[^'\\n]*'", 1)
- {
- lex::token_def<> string_lookahead('\'');
- self("LA") = string_lookahead;
-
- // make sure lookahead is implicitly evaluated using the lexer state
- // the token_def has been associated with
- self = st [
- phoenix::if_(lex::lookahead(string_lookahead)) [ lex::more() ]
- ]
- ;
- }
-
- lex::token_def<string_literal> st;
-};
-
-typedef lexer::iterator_type token_iterator;
-
-int main()
-{
- std::stringstream ss;
- ss << "'foo''bar'";
-
- file_iterator begin = make_file_iterator(ss, "SS");
- file_iterator end;
-
- lexer l;
- token_iterator begin2 = l.begin(begin, end);
- token_iterator end2 = l.end();
-
- char const* test_data[] = { "1,'foo'", "1,'foo''bar'" };
- std::size_t const test_data_size = sizeof(test_data)/sizeof(test_data[0]);
-
- token_iterator it = begin2;
- std::size_t i = 0;
- for (/**/; it != end2 && i < test_data_size; ++it, ++i)
- {
- std::stringstream ss;
- ss << it->id() << "," << *it;
- BOOST_TEST(ss.str() == test_data[i]);
- }
- BOOST_TEST(it == end2);
- BOOST_TEST(i == test_data_size);
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/regression010.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/regression010.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,100 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2010 Mathias Gaunard
-//
-// Distributed under 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)
-
-// This test makes sure that the BOL state (begin of line) is properly reset
-// if a token matched at the beginning of a line is discarded using
-// lex::pass_fail.
-
-// #define BOOST_SPIRIT_LEXERTL_DEBUG 1
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/support_multi_pass.hpp>
-#include <boost/spirit/include/classic_position_iterator.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-
-#include <boost/spirit/home/phoenix/core.hpp>
-#include <boost/spirit/home/phoenix/operator.hpp>
-#include <boost/spirit/home/phoenix/statement.hpp>
-#include <boost/spirit/home/phoenix/object.hpp>
-
-namespace spirit = boost::spirit;
-namespace lex = spirit::lex;
-namespace phoenix = boost::phoenix;
-
-typedef spirit::classic::position_iterator2<
- spirit::multi_pass<std::istreambuf_iterator<char> >
-> file_iterator;
-
-inline file_iterator
-make_file_iterator(std::istream& input, const std::string& filename)
-{
- return file_iterator(
- spirit::make_default_multi_pass(
- std::istreambuf_iterator<char>(input)),
- spirit::multi_pass<std::istreambuf_iterator<char> >(),
- filename);
-}
-
-typedef lex::lexertl::token<file_iterator> token_type;
-
-struct lexer
- : lex::lexer<lex::lexertl::actor_lexer<token_type> >
-{
- lexer() : word("^[a-zA-Z0-9]+$", 1)
- {
- self = word [
- lex::_state = "O"
- ]
- | lex::token_def<>("!.*$") [
- lex::_state = "O"
- , lex::_pass = lex::pass_flags::pass_ignore
- ]
- | lex::token_def<>('\n', 2) [
- lex::_state = "O"
- ]
- ;
-
- self("O") =
- lex::token_def<>(".") [
- lex::_state = "INITIAL"
- , lex::_pass = lex::pass_flags::pass_fail
- ]
- ;
- }
-
- lex::token_def<> word;
-};
-
-typedef lexer::iterator_type token_iterator;
-
-int main()
-{
- std::stringstream ss;
- ss << "!foo\nbar\n!baz";
-
- file_iterator begin = make_file_iterator(ss, "SS");
- file_iterator end;
-
- lexer l;
- token_iterator begin2 = l.begin(begin, end);
- token_iterator end2 = l.end();
-
- std::size_t test_data[] = { 2, 1, 2 };
- std::size_t const test_data_size = sizeof(test_data)/sizeof(test_data[0]);
-
- token_iterator it = begin2;
- std::size_t i = 0;
- for (/**/; it != end2 && i < test_data_size; ++it, ++i)
- {
- BOOST_TEST(it->id() == test_data[i]);
- }
- BOOST_TEST(it == end2);
- BOOST_TEST(i == test_data_size);
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/lex/state_switcher_test.cpp
==============================================================================
--- trunk/libs/spirit/test/lex/state_switcher_test.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,90 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/lex_lexertl.hpp>
-#include "test_parser.hpp"
-
-///////////////////////////////////////////////////////////////////////////////
-// Token definition
-///////////////////////////////////////////////////////////////////////////////
-template <typename Lexer>
-struct switch_state_tokens : boost::spirit::lex::lexer<Lexer>
-{
- switch_state_tokens()
- {
- // define tokens and associate them with the lexer
- identifier = "[a-zA-Z_][a-zA-Z0-9_]*";
- this->self = identifier;
-
- // any token definition to be used as the skip parser during parsing
- // has to be associated with a separate lexer state (here 'WS')
- white_space = "[ \\t\\n]+";
- this->self("WS") = white_space;
-
- separators = "[,;]";
- this->self("SEP") = separators;
- }
-
- boost::spirit::lex::token_def<> identifier, white_space, separators;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-int main()
-{
- using namespace boost::spirit;
- using namespace boost::spirit::qi;
- using namespace spirit_test;
-
- typedef std::string::iterator base_iterator_type;
- typedef boost::spirit::lex::lexertl::token<base_iterator_type> token_type;
- typedef boost::spirit::lex::lexertl::lexer<token_type> lexer_type;
-
- {
- // the tokens class will be initialized inside the test_parser function
- switch_state_tokens<lexer_type> lex;
-
- BOOST_TEST(test_parser("ident", lex.identifier, lex));
- BOOST_TEST(!test_parser("ident", set_state("WS") >> lex.identifier, lex));
- BOOST_TEST(!test_parser("ident", in_state("WS")[lex.identifier], lex));
-
- BOOST_TEST(test_parser("\t \n", set_state("WS") >> lex.white_space, lex));
- BOOST_TEST(test_parser("\t \n", in_state("WS")[lex.white_space], lex));
- BOOST_TEST(!test_parser("\t \n", lex.white_space, lex));
- }
-
- {
- // the tokens class will be initialized inside the test_parser function
- switch_state_tokens<lexer_type> lex;
-
- BOOST_TEST(test_parser(",ident", lex.identifier, lex,
- in_state("SEP")[lex.separators]));
- BOOST_TEST(!test_parser(";ident", set_state("WS") >> lex.identifier,
- lex, in_state("SEP")[lex.separators]));
- BOOST_TEST(!test_parser(",ident", in_state("WS")[lex.identifier],
- lex, in_state("SEP")[lex.separators]));
-
- BOOST_TEST(test_parser(",\t \n", set_state("WS") >> lex.white_space,
- lex, in_state("SEP")[lex.separators]));
- BOOST_TEST(test_parser(";\t \n", in_state("WS")[lex.white_space],
- lex, in_state("SEP")[lex.separators]));
- BOOST_TEST(!test_parser(",\t \n", lex.white_space, lex,
- in_state("SEP")[lex.separators]));
- }
-
- {
- // the tokens class will be initialized inside the test_parser function
- switch_state_tokens<lexer_type> lex;
-
- BOOST_TEST(test_parser("ident\t \n",
- lex.identifier >> set_state("WS") >> lex.white_space, lex));
- BOOST_TEST(test_parser("\t \nident",
- in_state("WS")[lex.white_space] >> lex.identifier, lex));
- }
-
- return boost::report_errors();
-}
-
Deleted: trunk/libs/spirit/test/qi/attr_with_action.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/attr_with_action.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,27 +0,0 @@
-// Copyright (c) 2010 Daniel James
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-// this is a compile only regression test
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/qi.hpp>
-
-namespace qi = boost::spirit::qi;
-
-struct source_mode {};
-
-struct process_type
-{
- template <typename A, typename B, typename C>
- void operator()(A&, B&, C&) const {}
-};
-
-int main()
-{
- process_type process;
- qi::rule<char const*> x = qi::attr(source_mode()) [process];
- return 0;
-}
\ No newline at end of file
Deleted: trunk/libs/spirit/test/qi/attribute.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/attribute.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,267 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Hartmut Kaiser
- Copyright (c) 2001-2010 Joel de Guzman
-
- Distributed under 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)
-=============================================================================*/
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/fusion/include/struct.hpp>
-#include <boost/fusion/include/nview.hpp>
-
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_string.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_nonterminal.hpp>
-#include <boost/spirit/include/qi_auxiliary.hpp>
-
-#include <iostream>
-#include <vector>
-#include <string>
-#include "test.hpp"
-
-///////////////////////////////////////////////////////////////////////////////
-struct test_data
-{
- std::string s1;
- std::string s2;
- int i1;
- double d1;
- std::string s3;
-};
-
-BOOST_FUSION_ADAPT_STRUCT(
- test_data,
- (int, i1)
- (std::string, s1)
- (std::string, s2)
- (std::string, s3)
- (double, d1)
-)
-
-///////////////////////////////////////////////////////////////////////////////
-struct test_int_data1
-{
- int i;
-};
-
-// we provide a custom attribute transformation taking copy of the actual
-// attribute value, simulating more complex type transformations
-namespace boost { namespace spirit { namespace traits
-{
- template <>
- struct transform_attribute<test_int_data1, int, qi::domain>
- {
- typedef int type;
- static int pre(test_int_data1& d) { return d.i; }
- static void post(test_int_data1& d, int i) { d.i = i; }
- static void fail(test_int_data1&) {}
- };
-}}}
-
-///////////////////////////////////////////////////////////////////////////////
-struct test_int_data2
-{
- int i;
-};
-
-// we provide a simple custom attribute transformation utilizing passing the
-// actual attribute by reference
-namespace boost { namespace spirit { namespace traits
-{
- template <>
- struct transform_attribute<test_int_data2, int, qi::domain>
- {
- typedef int& type;
- static int& pre(test_int_data2& d) { return d.i; }
- static void post(test_int_data2&, int const&) {}
- static void fail(test_int_data2&) {}
- };
-}}}
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using spirit_test::test_attr;
- namespace qi = boost::spirit::qi;
- namespace fusion = boost::fusion;
-
- // testing attribute reordering in a fusion sequence as explicit attribute
- {
- typedef fusion::result_of::as_nview<test_data, 1, 0, 4>::type
- test_view;
-
- test_data d1 = { "", "", 0, 0.0, "" };
- test_view v1 = fusion::as_nview<1, 0, 4>(d1);
- BOOST_TEST(test_attr("s1,2,1.5",
- *(qi::char_ - ',') >> ',' >> qi::int_ >> ',' >> qi::double_, v1));
- BOOST_TEST(d1.i1 == 2 && d1.s1 == "s1" && d1.d1 == 1.5);
-
- test_data d2 = { "", "", 0, 0.0, "" };
- test_view v2 = fusion::as_nview<1, 0, 4>(d2);
- BOOST_TEST(test_attr("s1, 2, 1.5 ",
- *(qi::char_ - ',') >> ',' >> qi::int_ >> ',' >> qi::double_,
- v2, qi::space));
- BOOST_TEST(d2.i1 == 2 && d2.s1 == "s1" && d2.d1 == 1.5);
- }
-
- {
- // this won't work without the second template argument as *digit
- // exposes a vector<char> as its attribute
- std::string str;
- BOOST_TEST(test_attr("123"
- , qi::attr_cast<std::string, std::string>(*qi::digit), str));
- BOOST_TEST(str == "123");
- }
-
- // testing attribute reordering in a fusion sequence involving a rule
- {
- typedef fusion::result_of::as_nview<test_data, 1, 0, 4>::type
- test_view;
- std::vector<test_data> v;
-
- qi::rule<char const*, test_view()> r1 =
- *(qi::char_ - ',') >> ',' >> qi::int_ >> ',' >> qi::double_;
-
- BOOST_TEST(test_attr("s1,2,1.5\ns2,4,3.5", r1 % qi::eol, v));
- BOOST_TEST(v.size() == 2 &&
- v[0].i1 == 2 && v[0].s1 == "s1" && v[0].d1 == 1.5 &&
- v[1].i1 == 4 && v[1].s1 == "s2" && v[1].d1 == 3.5);
-
- qi::rule<char const*, test_view(), qi::blank_type> r2 =
- *(qi::char_ - ',') >> ',' >> qi::int_ >> ',' >> qi::double_;
-
- v.clear();
- BOOST_TEST(test_attr("s1, 2, 1.5 \n s2, 4, 3.5", r2 % qi::eol, v, qi::blank));
- BOOST_TEST(v.size() == 2 &&
- v[0].i1 == 2 && v[0].s1 == "s1" && v[0].d1 == 1.5 &&
- v[1].i1 == 4 && v[1].s1 == "s2" && v[1].d1 == 3.5);
- }
-
- // testing explicit transformation if attribute needs to be copied
- {
- test_int_data1 d = { 0 };
- BOOST_TEST(test_attr("1", qi::attr_cast(qi::int_), d));
- BOOST_TEST(d.i == 1);
- BOOST_TEST(test_attr("2", qi::attr_cast<test_int_data1>(qi::int_), d));
- BOOST_TEST(d.i == 2);
- BOOST_TEST(test_attr("3", qi::attr_cast<test_int_data1, int>(qi::int_), d));
- BOOST_TEST(d.i == 3);
- }
-
- {
- std::vector<test_int_data1> v;
-
- BOOST_TEST(test_attr("1,2", qi::attr_cast(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- v.clear();
- BOOST_TEST(test_attr("1,2"
- , qi::attr_cast<test_int_data1>(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- v.clear();
- BOOST_TEST(test_attr("1,2"
- , qi::attr_cast<test_int_data1, int>(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<test_int_data1> v;
- qi::rule<char const*, int()> r = qi::int_;
-
- BOOST_TEST(test_attr("1,2", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<double> v;
- qi::rule<char const*, int()> r = qi::int_;
-
- BOOST_TEST(test_attr("1,2", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0] == 1.0 && v[1] == 2.0);
- }
-
- {
- std::vector<test_int_data1> v;
-
-// this won't compile as there is no defined transformation for
-// test_int_data1 and double
-// BOOST_TEST(test_attr("1.0,2.2", qi::attr_cast(qi::double_) % ',', v));
-// BOOST_TEST(test_attr("1.0,2.2"
-// , qi::attr_cast<test_int_data1>(qi::double_) % ',', v));
-
- BOOST_TEST(test_attr("1.0,2.2"
- , qi::attr_cast<test_int_data1, int>(qi::double_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- qi::rule<char const*, int()> r = qi::double_;
-
- v.clear();
- BOOST_TEST(test_attr("1.0,2.0", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- // testing explicit transformation if attribute is taken by reference
- {
- test_int_data2 d = { 0 };
- BOOST_TEST(test_attr("1", qi::attr_cast(qi::int_), d));
- BOOST_TEST(d.i == 1);
- BOOST_TEST(test_attr("2", qi::attr_cast<test_int_data2>(qi::int_), d));
- BOOST_TEST(d.i == 2);
- BOOST_TEST(test_attr("3", qi::attr_cast<test_int_data2, int>(qi::int_), d));
- BOOST_TEST(d.i == 3);
- }
-
- {
- std::vector<test_int_data2> v;
-
- BOOST_TEST(test_attr("1,2", qi::attr_cast(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- v.clear();
- BOOST_TEST(test_attr("1,2"
- , qi::attr_cast<test_int_data2>(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- v.clear();
- BOOST_TEST(test_attr("1,2"
- , qi::attr_cast<test_int_data2, int>(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<test_int_data2> v;
- qi::rule<char const*, int()> r = qi::int_;
-
- BOOST_TEST(test_attr("1,2", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<test_int_data2> v;
-
-// this won't compile as there is no defined transformation for
-// test_int_data2 and double
-// BOOST_TEST(test_attr("1.0,2.2", qi::attr_cast(qi::double_) % ',', v));
-// BOOST_TEST(test_attr("1.0,2.2"
-// , qi::attr_cast<test_int_data2>(qi::double_) % ',', v));
-
- BOOST_TEST(test_attr("1.0,2.2"
- , qi::attr_cast<test_int_data2, int>(qi::double_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- qi::rule<char const*, int()> r = qi::double_;
-
- v.clear();
- BOOST_TEST(test_attr("1.0,2.0", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/qi/attribute1.cpp (from r67483, /trunk/libs/spirit/test/qi/attribute.cpp)
==============================================================================
--- /trunk/libs/spirit/test/qi/attribute.cpp (original)
+++ trunk/libs/spirit/test/qi/attribute1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -171,97 +171,5 @@
BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
}
- {
- std::vector<test_int_data1> v;
- qi::rule<char const*, int()> r = qi::int_;
-
- BOOST_TEST(test_attr("1,2", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<double> v;
- qi::rule<char const*, int()> r = qi::int_;
-
- BOOST_TEST(test_attr("1,2", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0] == 1.0 && v[1] == 2.0);
- }
-
- {
- std::vector<test_int_data1> v;
-
-// this won't compile as there is no defined transformation for
-// test_int_data1 and double
-// BOOST_TEST(test_attr("1.0,2.2", qi::attr_cast(qi::double_) % ',', v));
-// BOOST_TEST(test_attr("1.0,2.2"
-// , qi::attr_cast<test_int_data1>(qi::double_) % ',', v));
-
- BOOST_TEST(test_attr("1.0,2.2"
- , qi::attr_cast<test_int_data1, int>(qi::double_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- qi::rule<char const*, int()> r = qi::double_;
-
- v.clear();
- BOOST_TEST(test_attr("1.0,2.0", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- // testing explicit transformation if attribute is taken by reference
- {
- test_int_data2 d = { 0 };
- BOOST_TEST(test_attr("1", qi::attr_cast(qi::int_), d));
- BOOST_TEST(d.i == 1);
- BOOST_TEST(test_attr("2", qi::attr_cast<test_int_data2>(qi::int_), d));
- BOOST_TEST(d.i == 2);
- BOOST_TEST(test_attr("3", qi::attr_cast<test_int_data2, int>(qi::int_), d));
- BOOST_TEST(d.i == 3);
- }
-
- {
- std::vector<test_int_data2> v;
-
- BOOST_TEST(test_attr("1,2", qi::attr_cast(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- v.clear();
- BOOST_TEST(test_attr("1,2"
- , qi::attr_cast<test_int_data2>(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- v.clear();
- BOOST_TEST(test_attr("1,2"
- , qi::attr_cast<test_int_data2, int>(qi::int_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<test_int_data2> v;
- qi::rule<char const*, int()> r = qi::int_;
-
- BOOST_TEST(test_attr("1,2", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
- {
- std::vector<test_int_data2> v;
-
-// this won't compile as there is no defined transformation for
-// test_int_data2 and double
-// BOOST_TEST(test_attr("1.0,2.2", qi::attr_cast(qi::double_) % ',', v));
-// BOOST_TEST(test_attr("1.0,2.2"
-// , qi::attr_cast<test_int_data2>(qi::double_) % ',', v));
-
- BOOST_TEST(test_attr("1.0,2.2"
- , qi::attr_cast<test_int_data2, int>(qi::double_) % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
-
- qi::rule<char const*, int()> r = qi::double_;
-
- v.clear();
- BOOST_TEST(test_attr("1.0,2.0", r % ',', v));
- BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/qi/attribute2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/attribute2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,187 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/fusion/include/struct.hpp>
+#include <boost/fusion/include/nview.hpp>
+
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include "test.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+struct test_data
+{
+ std::string s1;
+ std::string s2;
+ int i1;
+ double d1;
+ std::string s3;
+};
+
+BOOST_FUSION_ADAPT_STRUCT(
+ test_data,
+ (int, i1)
+ (std::string, s1)
+ (std::string, s2)
+ (std::string, s3)
+ (double, d1)
+)
+
+///////////////////////////////////////////////////////////////////////////////
+struct test_int_data1
+{
+ int i;
+};
+
+// we provide a custom attribute transformation taking copy of the actual
+// attribute value, simulating more complex type transformations
+namespace boost { namespace spirit { namespace traits
+{
+ template <>
+ struct transform_attribute<test_int_data1, int, qi::domain>
+ {
+ typedef int type;
+ static int pre(test_int_data1& d) { return d.i; }
+ static void post(test_int_data1& d, int i) { d.i = i; }
+ static void fail(test_int_data1&) {}
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+struct test_int_data2
+{
+ int i;
+};
+
+// we provide a simple custom attribute transformation utilizing passing the
+// actual attribute by reference
+namespace boost { namespace spirit { namespace traits
+{
+ template <>
+ struct transform_attribute<test_int_data2, int, qi::domain>
+ {
+ typedef int& type;
+ static int& pre(test_int_data2& d) { return d.i; }
+ static void post(test_int_data2&, int const&) {}
+ static void fail(test_int_data2&) {}
+ };
+}}}
+
+///////////////////////////////////////////////////////////////////////////////
+int
+main()
+{
+ using spirit_test::test_attr;
+ namespace qi = boost::spirit::qi;
+ namespace fusion = boost::fusion;
+
+ {
+ std::vector<test_int_data1> v;
+ qi::rule<char const*, int()> r = qi::int_;
+
+ BOOST_TEST(test_attr("1,2", r % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+ }
+
+ {
+ std::vector<double> v;
+ qi::rule<char const*, int()> r = qi::int_;
+
+ BOOST_TEST(test_attr("1,2", r % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0] == 1.0 && v[1] == 2.0);
+ }
+
+ {
+ std::vector<test_int_data1> v;
+
+// this won't compile as there is no defined transformation for
+// test_int_data1 and double
+// BOOST_TEST(test_attr("1.0,2.2", qi::attr_cast(qi::double_) % ',', v));
+// BOOST_TEST(test_attr("1.0,2.2"
+// , qi::attr_cast<test_int_data1>(qi::double_) % ',', v));
+
+ BOOST_TEST(test_attr("1.0,2.2"
+ , qi::attr_cast<test_int_data1, int>(qi::double_) % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+
+ qi::rule<char const*, int()> r = qi::double_;
+
+ v.clear();
+ BOOST_TEST(test_attr("1.0,2.0", r % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+ }
+
+ // testing explicit transformation if attribute is taken by reference
+ {
+ test_int_data2 d = { 0 };
+ BOOST_TEST(test_attr("1", qi::attr_cast(qi::int_), d));
+ BOOST_TEST(d.i == 1);
+ BOOST_TEST(test_attr("2", qi::attr_cast<test_int_data2>(qi::int_), d));
+ BOOST_TEST(d.i == 2);
+ BOOST_TEST(test_attr("3", qi::attr_cast<test_int_data2, int>(qi::int_), d));
+ BOOST_TEST(d.i == 3);
+ }
+
+ {
+ std::vector<test_int_data2> v;
+
+ BOOST_TEST(test_attr("1,2", qi::attr_cast(qi::int_) % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+
+ v.clear();
+ BOOST_TEST(test_attr("1,2"
+ , qi::attr_cast<test_int_data2>(qi::int_) % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+
+ v.clear();
+ BOOST_TEST(test_attr("1,2"
+ , qi::attr_cast<test_int_data2, int>(qi::int_) % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+ }
+
+ {
+ std::vector<test_int_data2> v;
+ qi::rule<char const*, int()> r = qi::int_;
+
+ BOOST_TEST(test_attr("1,2", r % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+ }
+
+ {
+ std::vector<test_int_data2> v;
+
+// this won't compile as there is no defined transformation for
+// test_int_data2 and double
+// BOOST_TEST(test_attr("1.0,2.2", qi::attr_cast(qi::double_) % ',', v));
+// BOOST_TEST(test_attr("1.0,2.2"
+// , qi::attr_cast<test_int_data2>(qi::double_) % ',', v));
+
+ BOOST_TEST(test_attr("1.0,2.2"
+ , qi::attr_cast<test_int_data2, int>(qi::double_) % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+
+ qi::rule<char const*, int()> r = qi::double_;
+
+ v.clear();
+ BOOST_TEST(test_attr("1.0,2.0", r % ',', v));
+ BOOST_TEST(v.size() == 2 && v[0].i == 1 && v[1].i == 2);
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/qi/clear_test.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/clear_test.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,38 +0,0 @@
-// Copyright (c) 2010 Daniel James
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/qi.hpp>
-#include <vector>
-
-int main()
-{
- typedef char const* Iterator;
- namespace qi = boost::spirit::qi;
-
- qi::rule<Iterator, std::vector<boost::iterator_range<Iterator> >()> list;
- list = *qi::raw[qi::char_]; // This fails to compile
-
- char const* test = "abcdef";
- int test_length = 6;
- char const* test_begin = test;
- char const* test_end = test + test_length;
- std::vector<boost::iterator_range<Iterator> > result;
- bool r = qi::parse(test_begin, test_end, list, result);
-
- BOOST_TEST(r);
- BOOST_TEST(test_begin == test_end);
- BOOST_TEST(result.size() == test_length);
-
- for(int i = 0; i < test_length; ++i) {
- BOOST_TEST(result[i].begin() == test + i);
- BOOST_TEST(result[i].end() == test + i + 1);
- }
-
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/qi/debug_optional.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/debug_optional.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,24 +0,0 @@
-// Copyright (c) 2010 Carl Philipp Reh
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-// make sure optionals play well with debug output
-
-#define BOOST_SPIRIT_DEBUG
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/home/support/attributes.hpp>
-#include <boost/optional.hpp>
-
-int main()
-{
- boost::spirit::qi::rule<
- char const *,
- boost::optional<int>()
- > foo;
-
- BOOST_SPIRIT_DEBUG_NODE(foo);
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/qi/match_manip.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/match_manip.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,328 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Hartmut Kaiser
- Copyright (c) 2001-2010 Joel de Guzman
-
- Distributed under 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)
-=============================================================================*/
-#include <boost/config/warning_disable.hpp>
-
-#include <boost/spirit/include/support_argument.hpp>
-#include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_stream.hpp>
-#include <boost/spirit/include/qi_match.hpp>
-#include <boost/spirit/include/qi_match_auto.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include <string>
-#include <sstream>
-#include <vector>
-#include <list>
-
-#include <boost/detail/lightweight_test.hpp>
-
-///////////////////////////////////////////////////////////////////////////////
-template <typename Char, typename Expr>
-bool test(Char const *toparse, Expr const& expr)
-{
- namespace spirit = boost::spirit;
- BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, Expr);
-
- std::istringstream istrm(toparse);
- istrm.unsetf(std::ios::skipws);
- istrm >> spirit::qi::compile<spirit::qi::domain>(expr);
- return istrm.good() || istrm.eof();
-}
-
-template <typename Char, typename Expr, typename CopyExpr, typename CopyAttr
- , typename Skipper, typename Attribute>
-bool test(Char const *toparse,
- boost::spirit::qi::detail::match_manip<
- Expr, CopyExpr, CopyAttr, Skipper, Attribute> const& mm)
-{
- std::istringstream istrm(toparse);
- istrm.unsetf(std::ios::skipws);
- istrm >> mm;
- return istrm.good() || istrm.eof();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-bool is_list_ok(std::list<char> const& l)
-{
- std::list<char>::const_iterator cit = l.begin();
- if (cit == l.end() || *cit != 'a')
- return false;
- if (++cit == l.end() || *cit != 'b')
- return false;
-
- return ++cit != l.end() && *cit == 'c';
-}
-
-///////////////////////////////////////////////////////////////////////////////
-int
-main()
-{
- using boost::spirit::qi::_1;
- using boost::spirit::qi::_2;
- using boost::spirit::qi::match;
- using boost::spirit::qi::phrase_match;
- using boost::spirit::qi::typed_stream;
- using boost::spirit::qi::stream;
- using boost::spirit::qi::int_;
-
- using namespace boost::spirit::ascii;
- namespace fusion = boost::fusion;
- namespace phx = boost::phoenix;
-
- {
- char c = '\0';
- BOOST_TEST(test( "a",
- char_[phx::ref(c) = _1]
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( "a",
- match(char_[phx::ref(c) = _1])
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( " a",
- phrase_match(char_[phx::ref(c) = _1], space)
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( "a",
- match(char_, c)
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( " a",
- phrase_match(char_, space, c)
- ) && c == 'a');
- }
-
- {
- ///////////////////////////////////////////////////////////////////////
- typedef typed_stream<char> char_stream_type;
- char_stream_type const char_stream = char_stream_type();
-
- typedef typed_stream<int> int_stream_type;
- int_stream_type const int_stream = int_stream_type();
-
- ///////////////////////////////////////////////////////////////////////
- char c = '\0';
- BOOST_TEST(test( "a",
- char_stream[phx::ref(c) = _1]
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( "a",
- match(char_stream[phx::ref(c) = _1])
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( " a",
- phrase_match(char_stream[phx::ref(c) = _1], space)
- ) && c == 'a');
-
- int i = 0;
- BOOST_TEST(test( "42",
- int_stream[phx::ref(i) = _1]
- ) && i == 42);
-
- i = 0;
- BOOST_TEST(test( "42",
- match(int_stream[phx::ref(i) = _1])
- ) && i == 42);
-
- i = 0;
- BOOST_TEST(test( " 42",
- phrase_match(int_stream[phx::ref(i) = _1], space)
- ) && i == 42);
-
- ///////////////////////////////////////////////////////////////////////
- c = '\0';
- BOOST_TEST(test( "a",
- match(stream, c)
- ) && c == 'a');
-
- c = '\0';
- BOOST_TEST(test( " a",
- phrase_match(stream, space, c)
- ) && c == 'a');
-
- i = 0;
- BOOST_TEST(test( "42",
- match(stream, i)
- ) && i == 42);
-
- i = 0;
- BOOST_TEST(test( " 42",
- phrase_match(stream, space, i)
- ) && i == 42);
- }
-
- {
- char a = '\0', b = '\0';
- BOOST_TEST(test( "ab",
- char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1]
- ) && a == 'a' && b == 'b');
-
- a = '\0', b = '\0';
- BOOST_TEST(test( "ab",
- match(char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1])
- ) && a == 'a' && b == 'b');
-
- a = '\0', b = '\0';
- BOOST_TEST(test( " a b",
- phrase_match(char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1], space)
- ) && a == 'a' && b == 'b');
-
- fusion::vector<char, char> t;
- BOOST_TEST(test( "ab",
- match(char_ >> char_, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
-
- t = fusion::vector<char, char>();
- BOOST_TEST(test( " a b",
- phrase_match(char_ >> char_, space, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
- }
-
- {
- char a = '\0', b = '\0', c = '\0';
- BOOST_TEST(test( "abc",
- char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1] >> char_[phx::ref(c) = _1]
- ) && a == 'a' && b == 'b' && c == 'c');
-
- BOOST_TEST(test( "abc",
- match(char_('a') >> char_('b') >> char_('c'))
- ));
-
- BOOST_TEST(test( " a b c",
- phrase_match(char_('a') >> char_('b') >> char_('c'), space)
- ));
-
- BOOST_TEST(!test( "abc",
- match(char_('a') >> char_('b') >> char_('d'))
- ));
-
- BOOST_TEST(!test( " a b c",
- phrase_match(char_('a') >> char_('b') >> char_('d'), space)
- ));
-
- fusion::vector<char, char, char> t;
- BOOST_TEST(test( "abc",
- match(char_ >> char_ >> char_, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
-
- t = fusion::vector<char, char, char>();
- BOOST_TEST(test( " a b c",
- phrase_match(char_ >> char_ >> char_, space, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
-
- t = fusion::vector<char, char, char>();
- BOOST_TEST(test( "abc",
- match(t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
-
- t = fusion::vector<char, char, char>();
- BOOST_TEST(test( " a b c",
- phrase_match(t, space)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
- }
-
- {
- char a = '\0';
- int i = 0;
- BOOST_TEST(test( "a2",
- (char_ >> int_)[phx::ref(a) = _1, phx::ref(i) = _2]
- ) && a == 'a' && i == 2);
-
- fusion::vector<char, int> t;
- BOOST_TEST(test( "a2",
- match(char_ >> int_, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
-
- t = fusion::vector<char, int>();
- BOOST_TEST(test( " a 2",
- phrase_match(char_ >> int_, space, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
-
- BOOST_TEST(!test( "a2",
- match(char_ >> alpha, t)
- ));
- BOOST_TEST(!test( " a 2",
- phrase_match(char_ >> alpha, space, t)
- ));
- }
-
- {
- // parse elements of a vector
- std::vector<char> v;
- BOOST_TEST(test( "abc",
- (*char_)[phx::ref(v) = _1]
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( "abc",
- match(*char_, v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(*char_, space, v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( "abc",
- match(v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(v, space)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- // parse a comma separated list of vector elements
- v.clear();
- BOOST_TEST(test( "a,b,c",
- match(char_ % ',', v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( " a , b , c",
- phrase_match(char_ % ',', space, v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- // output all elements of a list
- std::list<char> l;
- BOOST_TEST(test( "abc",
- match(*char_, l)
- ) && 3 == l.size() && is_list_ok(l));
-
- l.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(*char_, space, l)
- ) && 3 == l.size() && is_list_ok(l));
-
- l.clear();
- BOOST_TEST(test( "abc",
- match(l)
- ) && 3 == l.size() && is_list_ok(l));
-
- l.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(l, space)
- ) && 3 == l.size() && is_list_ok(l));
- }
-
- return boost::report_errors();
-}
-
Added: trunk/libs/spirit/test/qi/match_manip.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/match_manip.hpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,70 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_TEST_MATCH_MANIP_HPP)
+#define BOOST_SPIRIT_TEST_MATCH_MANIP_HPP
+
+#include <boost/config/warning_disable.hpp>
+
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_stream.hpp>
+#include <boost/spirit/include/qi_match.hpp>
+#include <boost/spirit/include/qi_match_auto.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_statement.hpp>
+
+#include <string>
+#include <sstream>
+#include <vector>
+#include <list>
+
+#include <boost/detail/lightweight_test.hpp>
+
+///////////////////////////////////////////////////////////////////////////////
+template <typename Char, typename Expr>
+bool test(Char const *toparse, Expr const& expr)
+{
+ namespace spirit = boost::spirit;
+ BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, Expr);
+
+ std::istringstream istrm(toparse);
+ istrm.unsetf(std::ios::skipws);
+ istrm >> spirit::qi::compile<spirit::qi::domain>(expr);
+ return istrm.good() || istrm.eof();
+}
+
+template <typename Char, typename Expr, typename CopyExpr, typename CopyAttr
+ , typename Skipper, typename Attribute>
+bool test(Char const *toparse,
+ boost::spirit::qi::detail::match_manip<
+ Expr, CopyExpr, CopyAttr, Skipper, Attribute> const& mm)
+{
+ std::istringstream istrm(toparse);
+ istrm.unsetf(std::ios::skipws);
+ istrm >> mm;
+ return istrm.good() || istrm.eof();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+bool is_list_ok(std::list<char> const& l)
+{
+ std::list<char>::const_iterator cit = l.begin();
+ if (cit == l.end() || *cit != 'a')
+ return false;
+ if (++cit == l.end() || *cit != 'b')
+ return false;
+
+ return ++cit != l.end() && *cit == 'c';
+}
+
+#endif
Copied: trunk/libs/spirit/test/qi/match_manip1.cpp (from r67483, /trunk/libs/spirit/test/qi/match_manip.cpp)
==============================================================================
--- /trunk/libs/spirit/test/qi/match_manip.cpp (original)
+++ trunk/libs/spirit/test/qi/match_manip1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -5,66 +5,9 @@
Distributed under 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)
=============================================================================*/
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/support_argument.hpp>
-#include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_stream.hpp>
-#include <boost/spirit/include/qi_match.hpp>
-#include <boost/spirit/include/qi_match_auto.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_statement.hpp>
-
-#include <string>
-#include <sstream>
-#include <vector>
-#include <list>
-
-#include <boost/detail/lightweight_test.hpp>
-
-///////////////////////////////////////////////////////////////////////////////
-template <typename Char, typename Expr>
-bool test(Char const *toparse, Expr const& expr)
-{
- namespace spirit = boost::spirit;
- BOOST_SPIRIT_ASSERT_MATCH(spirit::qi::domain, Expr);
-
- std::istringstream istrm(toparse);
- istrm.unsetf(std::ios::skipws);
- istrm >> spirit::qi::compile<spirit::qi::domain>(expr);
- return istrm.good() || istrm.eof();
-}
-
-template <typename Char, typename Expr, typename CopyExpr, typename CopyAttr
- , typename Skipper, typename Attribute>
-bool test(Char const *toparse,
- boost::spirit::qi::detail::match_manip<
- Expr, CopyExpr, CopyAttr, Skipper, Attribute> const& mm)
-{
- std::istringstream istrm(toparse);
- istrm.unsetf(std::ios::skipws);
- istrm >> mm;
- return istrm.good() || istrm.eof();
-}
+#include "match_manip.hpp"
-///////////////////////////////////////////////////////////////////////////////
-bool is_list_ok(std::list<char> const& l)
-{
- std::list<char>::const_iterator cit = l.begin();
- if (cit == l.end() || *cit != 'a')
- return false;
- if (++cit == l.end() || *cit != 'b')
- return false;
-
- return ++cit != l.end() && *cit == 'c';
-}
-
-///////////////////////////////////////////////////////////////////////////////
int
main()
{
@@ -168,161 +111,6 @@
) && i == 42);
}
- {
- char a = '\0', b = '\0';
- BOOST_TEST(test( "ab",
- char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1]
- ) && a == 'a' && b == 'b');
-
- a = '\0', b = '\0';
- BOOST_TEST(test( "ab",
- match(char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1])
- ) && a == 'a' && b == 'b');
-
- a = '\0', b = '\0';
- BOOST_TEST(test( " a b",
- phrase_match(char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1], space)
- ) && a == 'a' && b == 'b');
-
- fusion::vector<char, char> t;
- BOOST_TEST(test( "ab",
- match(char_ >> char_, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
-
- t = fusion::vector<char, char>();
- BOOST_TEST(test( " a b",
- phrase_match(char_ >> char_, space, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
- }
-
- {
- char a = '\0', b = '\0', c = '\0';
- BOOST_TEST(test( "abc",
- char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1] >> char_[phx::ref(c) = _1]
- ) && a == 'a' && b == 'b' && c == 'c');
-
- BOOST_TEST(test( "abc",
- match(char_('a') >> char_('b') >> char_('c'))
- ));
-
- BOOST_TEST(test( " a b c",
- phrase_match(char_('a') >> char_('b') >> char_('c'), space)
- ));
-
- BOOST_TEST(!test( "abc",
- match(char_('a') >> char_('b') >> char_('d'))
- ));
-
- BOOST_TEST(!test( " a b c",
- phrase_match(char_('a') >> char_('b') >> char_('d'), space)
- ));
-
- fusion::vector<char, char, char> t;
- BOOST_TEST(test( "abc",
- match(char_ >> char_ >> char_, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
-
- t = fusion::vector<char, char, char>();
- BOOST_TEST(test( " a b c",
- phrase_match(char_ >> char_ >> char_, space, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
-
- t = fusion::vector<char, char, char>();
- BOOST_TEST(test( "abc",
- match(t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
-
- t = fusion::vector<char, char, char>();
- BOOST_TEST(test( " a b c",
- phrase_match(t, space)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
- }
-
- {
- char a = '\0';
- int i = 0;
- BOOST_TEST(test( "a2",
- (char_ >> int_)[phx::ref(a) = _1, phx::ref(i) = _2]
- ) && a == 'a' && i == 2);
-
- fusion::vector<char, int> t;
- BOOST_TEST(test( "a2",
- match(char_ >> int_, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
-
- t = fusion::vector<char, int>();
- BOOST_TEST(test( " a 2",
- phrase_match(char_ >> int_, space, t)
- ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
-
- BOOST_TEST(!test( "a2",
- match(char_ >> alpha, t)
- ));
- BOOST_TEST(!test( " a 2",
- phrase_match(char_ >> alpha, space, t)
- ));
- }
-
- {
- // parse elements of a vector
- std::vector<char> v;
- BOOST_TEST(test( "abc",
- (*char_)[phx::ref(v) = _1]
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( "abc",
- match(*char_, v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(*char_, space, v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( "abc",
- match(v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(v, space)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- // parse a comma separated list of vector elements
- v.clear();
- BOOST_TEST(test( "a,b,c",
- match(char_ % ',', v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- v.clear();
- BOOST_TEST(test( " a , b , c",
- phrase_match(char_ % ',', space, v)
- ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
-
- // output all elements of a list
- std::list<char> l;
- BOOST_TEST(test( "abc",
- match(*char_, l)
- ) && 3 == l.size() && is_list_ok(l));
-
- l.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(*char_, space, l)
- ) && 3 == l.size() && is_list_ok(l));
-
- l.clear();
- BOOST_TEST(test( "abc",
- match(l)
- ) && 3 == l.size() && is_list_ok(l));
-
- l.clear();
- BOOST_TEST(test( " a b c",
- phrase_match(l, space)
- ) && 3 == l.size() && is_list_ok(l));
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/qi/match_manip2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/match_manip2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,98 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+
+#include "match_manip.hpp"
+
+int
+main()
+{
+ using boost::spirit::qi::_1;
+ using boost::spirit::qi::_2;
+ using boost::spirit::qi::match;
+ using boost::spirit::qi::phrase_match;
+ using boost::spirit::qi::typed_stream;
+ using boost::spirit::qi::stream;
+ using boost::spirit::qi::int_;
+
+ using namespace boost::spirit::ascii;
+ namespace fusion = boost::fusion;
+ namespace phx = boost::phoenix;
+
+ {
+ char a = '\0', b = '\0';
+ BOOST_TEST(test( "ab",
+ char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1]
+ ) && a == 'a' && b == 'b');
+
+ a = '\0', b = '\0';
+ BOOST_TEST(test( "ab",
+ match(char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1])
+ ) && a == 'a' && b == 'b');
+
+ a = '\0', b = '\0';
+ BOOST_TEST(test( " a b",
+ phrase_match(char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1], space)
+ ) && a == 'a' && b == 'b');
+
+ fusion::vector<char, char> t;
+ BOOST_TEST(test( "ab",
+ match(char_ >> char_, t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
+
+ t = fusion::vector<char, char>();
+ BOOST_TEST(test( " a b",
+ phrase_match(char_ >> char_, space, t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b');
+ }
+
+ {
+ char a = '\0', b = '\0', c = '\0';
+ BOOST_TEST(test( "abc",
+ char_[phx::ref(a) = _1] >> char_[phx::ref(b) = _1] >> char_[phx::ref(c) = _1]
+ ) && a == 'a' && b == 'b' && c == 'c');
+
+ BOOST_TEST(test( "abc",
+ match(char_('a') >> char_('b') >> char_('c'))
+ ));
+
+ BOOST_TEST(test( " a b c",
+ phrase_match(char_('a') >> char_('b') >> char_('c'), space)
+ ));
+
+ BOOST_TEST(!test( "abc",
+ match(char_('a') >> char_('b') >> char_('d'))
+ ));
+
+ BOOST_TEST(!test( " a b c",
+ phrase_match(char_('a') >> char_('b') >> char_('d'), space)
+ ));
+
+ fusion::vector<char, char, char> t;
+ BOOST_TEST(test( "abc",
+ match(char_ >> char_ >> char_, t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
+
+ t = fusion::vector<char, char, char>();
+ BOOST_TEST(test( " a b c",
+ phrase_match(char_ >> char_ >> char_, space, t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
+
+ t = fusion::vector<char, char, char>();
+ BOOST_TEST(test( "abc",
+ match(t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
+
+ t = fusion::vector<char, char, char>();
+ BOOST_TEST(test( " a b c",
+ phrase_match(t, space)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 'b' && fusion::at_c<2>(t) == 'c');
+ }
+
+ return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/qi/match_manip3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/match_manip3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,113 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Hartmut Kaiser
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+
+#include "match_manip.hpp"
+
+int
+main()
+{
+ using boost::spirit::qi::_1;
+ using boost::spirit::qi::_2;
+ using boost::spirit::qi::match;
+ using boost::spirit::qi::phrase_match;
+ using boost::spirit::qi::typed_stream;
+ using boost::spirit::qi::stream;
+ using boost::spirit::qi::int_;
+
+ using namespace boost::spirit::ascii;
+ namespace fusion = boost::fusion;
+ namespace phx = boost::phoenix;
+
+ {
+ char a = '\0';
+ int i = 0;
+ BOOST_TEST(test( "a2",
+ (char_ >> int_)[phx::ref(a) = _1, phx::ref(i) = _2]
+ ) && a == 'a' && i == 2);
+
+ fusion::vector<char, int> t;
+ BOOST_TEST(test( "a2",
+ match(char_ >> int_, t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
+
+ t = fusion::vector<char, int>();
+ BOOST_TEST(test( " a 2",
+ phrase_match(char_ >> int_, space, t)
+ ) && fusion::at_c<0>(t) == 'a' && fusion::at_c<1>(t) == 2);
+
+ BOOST_TEST(!test( "a2",
+ match(char_ >> alpha, t)
+ ));
+ BOOST_TEST(!test( " a 2",
+ phrase_match(char_ >> alpha, space, t)
+ ));
+ }
+
+ {
+ // parse elements of a vector
+ std::vector<char> v;
+ BOOST_TEST(test( "abc",
+ (*char_)[phx::ref(v) = _1]
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ v.clear();
+ BOOST_TEST(test( "abc",
+ match(*char_, v)
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ v.clear();
+ BOOST_TEST(test( " a b c",
+ phrase_match(*char_, space, v)
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ v.clear();
+ BOOST_TEST(test( "abc",
+ match(v)
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ v.clear();
+ BOOST_TEST(test( " a b c",
+ phrase_match(v, space)
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ // parse a comma separated list of vector elements
+ v.clear();
+ BOOST_TEST(test( "a,b,c",
+ match(char_ % ',', v)
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ v.clear();
+ BOOST_TEST(test( " a , b , c",
+ phrase_match(char_ % ',', space, v)
+ ) && 3 == v.size() && v[0] == 'a' && v[1] == 'b' && v[2] == 'c');
+
+ // output all elements of a list
+ std::list<char> l;
+ BOOST_TEST(test( "abc",
+ match(*char_, l)
+ ) && 3 == l.size() && is_list_ok(l));
+
+ l.clear();
+ BOOST_TEST(test( " a b c",
+ phrase_match(*char_, space, l)
+ ) && 3 == l.size() && is_list_ok(l));
+
+ l.clear();
+ BOOST_TEST(test( "abc",
+ match(l)
+ ) && 3 == l.size() && is_list_ok(l));
+
+ l.clear();
+ BOOST_TEST(test( " a b c",
+ phrase_match(l, space)
+ ) && 3 == l.size() && is_list_ok(l));
+ }
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/qi/one_element_fusion_sequence.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/one_element_fusion_sequence.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,27 +0,0 @@
-// Copyright (c) 2001-2011 Hartmut Kaiser
-// Copyright (c) 2010 Daniel James
-//
-// Distributed under 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)
-
-// This compilation test fails if proto expressions are not properly
-// distinguished from 'normal' Fusion sequences.
-
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/phoenix.hpp>
-#include <string>
-
-int main()
-{
- namespace qi = boost::spirit::qi;
- typedef std::string::const_iterator iterator;
-
- qi::symbols<char, qi::rule<iterator> > phrase_keyword_rules;
- qi::rule<iterator, qi::locals<qi::rule<iterator> > > phrase_markup_impl;
-
- phrase_markup_impl
- = (phrase_keyword_rules >> !qi::alnum) [qi::_a = qi::_1]
- ;
-
- return 0;
-}
Deleted: trunk/libs/spirit/test/qi/real.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/real.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,425 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Joel de Guzman
- Copyright (c) 2001-2010 Hartmut Kaiser
-
- Use, modification and distribution is 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)
-=============================================================================*/
-#include <climits>
-#include <boost/math/concepts/real_concept.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/math/special_functions/fpclassify.hpp>
-#include <boost/math/special_functions/sign.hpp>
-
-#include "test.hpp"
-
-///////////////////////////////////////////////////////////////////////////////
-// These policies can be used to parse thousand separated
-// numbers with at most 2 decimal digits after the decimal
-// point. e.g. 123,456,789.01
-///////////////////////////////////////////////////////////////////////////////
-template <typename T>
-struct ts_real_policies : boost::spirit::qi::ureal_policies<T>
-{
- // 2 decimal places Max
- template <typename Iterator, typename Attribute>
- static bool
- parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr)
- {
- namespace qi = boost::spirit::qi;
- return qi::extract_uint<T, 10, 1, 2, true>::call(first, last, attr);
- }
-
- // No exponent
- template <typename Iterator>
- static bool
- parse_exp(Iterator&, Iterator const&)
- {
- return false;
- }
-
- // No exponent
- template <typename Iterator, typename Attribute>
- static bool
- parse_exp_n(Iterator&, Iterator const&, Attribute&)
- {
- return false;
- }
-
- // Thousands separated numbers
- template <typename Iterator, typename Attribute>
- static bool
- parse_n(Iterator& first, Iterator const& last, Attribute& attr)
- {
- using boost::spirit::qi::uint_parser;
- namespace qi = boost::spirit::qi;
-
- uint_parser<unsigned, 10, 1, 3> uint3;
- uint_parser<unsigned, 10, 3, 3> uint3_3;
-
- T result = 0;
- if (parse(first, last, uint3, result))
- {
- bool hit = false;
- T n;
- Iterator save = first;
-
- while (qi::parse(first, last, ',') && qi::parse(first, last, uint3_3, n))
- {
- result = result * 1000 + n;
- save = first;
- hit = true;
- }
-
- first = save;
- if (hit)
- attr = result;
- return hit;
- }
- return false;
- }
-};
-
-template <typename T>
-struct no_trailing_dot_policy : boost::spirit::qi::real_policies<T>
-{
- static bool const allow_trailing_dot = false;
-};
-
-template <typename T>
-struct no_leading_dot_policy : boost::spirit::qi::real_policies<T>
-{
- static bool const allow_leading_dot = false;
-};
-
-template <typename T>
-bool
-compare(T n, double expected)
-{
- T const eps = std::pow(10.0, -std::numeric_limits<T>::digits10);
- T delta = n - expected;
- return (delta >= -eps) && (delta <= eps);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// A custom real type
-struct custom_real
-{
- double n;
- custom_real() : n(0) {}
- custom_real(double n_) : n(n_) {}
- friend custom_real operator*(custom_real a, custom_real b)
- { return custom_real(a.n * b.n); }
- friend custom_real operator+(custom_real a, custom_real b)
- { return custom_real(a.n + b.n); }
- friend custom_real operator-(custom_real a, custom_real b)
- { return custom_real(a.n - b.n); }
-};
-
-int
-main()
-{
- using spirit_test::test;
- using spirit_test::test_attr;
-
- ///////////////////////////////////////////////////////////////////////////////
- // thousand separated numbers
- ///////////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::uint_parser;
- using boost::spirit::qi::parse;
-
- uint_parser<unsigned, 10, 1, 3> uint3;
- uint_parser<unsigned, 10, 3, 3> uint3_3;
-
- #define r (uint3 >> *(',' >> uint3_3))
-
- BOOST_TEST(test("1,234,567,890", r));
- BOOST_TEST(test("12,345,678,900", r));
- BOOST_TEST(test("123,456,789,000", r));
- BOOST_TEST(!test("1000,234,567,890", r));
- BOOST_TEST(!test("1,234,56,890", r));
- BOOST_TEST(!test("1,66", r));
- }
-
- ///////////////////////////////////////////////////////////////////////////////
- // unsigned real number tests
- ///////////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::parse;
- using boost::spirit::qi::ureal_policies;
-
- real_parser<double, ureal_policies<double> > udouble;
- double d;
-
- BOOST_TEST(test("1234", udouble));
- BOOST_TEST(test_attr("1234", udouble, d) && compare(d, 1234));
-
- BOOST_TEST(test("1.2e3", udouble));
- BOOST_TEST(test_attr("1.2e3", udouble, d) && compare(d, 1.2e3));
-
- BOOST_TEST(test("1.2e-3", udouble));
- BOOST_TEST(test_attr("1.2e-3", udouble, d) && compare(d, 1.2e-3));
-
- BOOST_TEST(test("1.e2", udouble));
- BOOST_TEST(test_attr("1.e2", udouble, d) && compare(d, 1.e2));
-
- BOOST_TEST(test("1.", udouble));
- BOOST_TEST(test_attr("1.", udouble, d) && compare(d, 1.));
-
- BOOST_TEST(test(".2e3", udouble));
- BOOST_TEST(test_attr(".2e3", udouble, d) && compare(d, .2e3));
-
- BOOST_TEST(test("2e3", udouble));
- BOOST_TEST(test_attr("2e3", udouble, d) && compare(d, 2e3));
-
- BOOST_TEST(test("2", udouble));
- BOOST_TEST(test_attr("2", udouble, d) && compare(d, 2));
-
- using boost::math::fpclassify;
- BOOST_TEST(test("inf", udouble));
- BOOST_TEST(test("infinity", udouble));
- BOOST_TEST(test("INF", udouble));
- BOOST_TEST(test("INFINITY", udouble));
- BOOST_TEST(test_attr("inf", udouble, d) && FP_INFINITE == fpclassify(d));
- BOOST_TEST(test_attr("INF", udouble, d) && FP_INFINITE == fpclassify(d));
- BOOST_TEST(test_attr("infinity", udouble, d) && FP_INFINITE == fpclassify(d));
- BOOST_TEST(test_attr("INFINITY", udouble, d) && FP_INFINITE == fpclassify(d));
-
- BOOST_TEST(test("nan", udouble));
- BOOST_TEST(test_attr("nan", udouble, d) && FP_NAN == fpclassify(d));
- BOOST_TEST(test("NAN", udouble));
- BOOST_TEST(test_attr("NAN", udouble, d) && FP_NAN == fpclassify(d));
-
- BOOST_TEST(test("nan(...)", udouble));
- BOOST_TEST(test_attr("nan(...)", udouble, d) && FP_NAN == fpclassify(d));
- BOOST_TEST(test("NAN(...)", udouble));
- BOOST_TEST(test_attr("NAN(...)", udouble, d) && FP_NAN == fpclassify(d));
-
- BOOST_TEST(!test("e3", udouble));
- BOOST_TEST(!test_attr("e3", udouble, d));
-
- BOOST_TEST(!test("-1.2e3", udouble));
- BOOST_TEST(!test_attr("-1.2e3", udouble, d));
-
- BOOST_TEST(!test("+1.2e3", udouble));
- BOOST_TEST(!test_attr("+1.2e3", udouble, d));
-
- BOOST_TEST(!test("1.2e", udouble));
- BOOST_TEST(!test_attr("1.2e", udouble, d));
-
- BOOST_TEST(!test("-.3", udouble));
- BOOST_TEST(!test_attr("-.3", udouble, d));
- }
-
-///////////////////////////////////////////////////////////////////////////////
-// signed real number tests
-///////////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::double_;
- using boost::spirit::qi::parse;
- double d;
-
- BOOST_TEST(test("-1234", double_));
- BOOST_TEST(test_attr("-1234", double_, d) && compare(d, -1234));
-
- BOOST_TEST(test("-1.2e3", double_));
- BOOST_TEST(test_attr("-1.2e3", double_, d) && compare(d, -1.2e3));
-
- BOOST_TEST(test("+1.2e3", double_));
- BOOST_TEST(test_attr("+1.2e3", double_, d) && compare(d, 1.2e3));
-
- BOOST_TEST(test("-0.1", double_));
- BOOST_TEST(test_attr("-0.1", double_, d) && compare(d, -0.1));
-
- BOOST_TEST(test("-1.2e-3", double_));
- BOOST_TEST(test_attr("-1.2e-3", double_, d) && compare(d, -1.2e-3));
-
- BOOST_TEST(test("-1.e2", double_));
- BOOST_TEST(test_attr("-1.e2", double_, d) && compare(d, -1.e2));
-
- BOOST_TEST(test("-.2e3", double_));
- BOOST_TEST(test_attr("-.2e3", double_, d) && compare(d, -.2e3));
-
- BOOST_TEST(test("-2e3", double_));
- BOOST_TEST(test_attr("-2e3", double_, d) && compare(d, -2e3));
-
- BOOST_TEST(!test("-e3", double_));
- BOOST_TEST(!test_attr("-e3", double_, d));
-
- BOOST_TEST(!test("-1.2e", double_));
- BOOST_TEST(!test_attr("-1.2e", double_, d));
-
-#if defined(BOOST_SPIRIT_TEST_REAL_PRECISION)
- BOOST_TEST(test_attr("-5.7222349715140557e+307", double_, d));
- BOOST_TEST(d == -5.7222349715140557e+307); // exact!
-
- BOOST_TEST(test_attr("2.0332938517515416e-308", double_, d));
- BOOST_TEST(d == 2.0332938517515416e-308); // exact!
-
- BOOST_TEST(test_attr("20332938517515416e291", double_, d));
- BOOST_TEST(d == 20332938517515416e291); // exact!
-
- BOOST_TEST(test_attr("2.0332938517515416e307", double_, d));
- BOOST_TEST(d == 2.0332938517515416e307); // exact!
-#endif
-
- using boost::math::fpclassify;
- using boost::spirit::detail::signbit; // Boost version is broken
-
- BOOST_TEST(test("-inf", double_));
- BOOST_TEST(test("-infinity", double_));
- BOOST_TEST(test_attr("-inf", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
- BOOST_TEST(test_attr("-infinity", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
- BOOST_TEST(test("-INF", double_));
- BOOST_TEST(test("-INFINITY", double_));
- BOOST_TEST(test_attr("-INF", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
- BOOST_TEST(test_attr("-INFINITY", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
-
- BOOST_TEST(test("-nan", double_));
- BOOST_TEST(test_attr("-nan", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
- BOOST_TEST(test("-NAN", double_));
- BOOST_TEST(test_attr("-NAN", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
-
- BOOST_TEST(test("-nan(...)", double_));
- BOOST_TEST(test_attr("-nan(...)", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
- BOOST_TEST(test("-NAN(...)", double_));
- BOOST_TEST(test_attr("-NAN(...)", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
- }
-
- ///////////////////////////////////////////////////////////////////////////////
- // strict real number tests
- ///////////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::parse;
- using boost::spirit::qi::strict_ureal_policies;
- using boost::spirit::qi::strict_real_policies;
-
- real_parser<double, strict_ureal_policies<double> > strict_udouble;
- real_parser<double, strict_real_policies<double> > strict_double;
- double d;
-
- BOOST_TEST(!test("1234", strict_udouble));
- BOOST_TEST(!test_attr("1234", strict_udouble, d));
-
- BOOST_TEST(test("1.2", strict_udouble));
- BOOST_TEST(test_attr("1.2", strict_udouble, d) && compare(d, 1.2));
-
- BOOST_TEST(!test("-1234", strict_double));
- BOOST_TEST(!test_attr("-1234", strict_double, d));
-
- BOOST_TEST(test("123.", strict_double));
- BOOST_TEST(test_attr("123.", strict_double, d) && compare(d, 123));
-
- BOOST_TEST(test("3.E6", strict_double));
- BOOST_TEST(test_attr("3.E6", strict_double, d) && compare(d, 3e6));
-
- real_parser<double, no_trailing_dot_policy<double> > notrdot_real;
- real_parser<double, no_leading_dot_policy<double> > nolddot_real;
-
- BOOST_TEST(!test("1234.", notrdot_real)); // Bad trailing dot
- BOOST_TEST(!test(".1234", nolddot_real)); // Bad leading dot
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // Special thousands separated numbers
- ///////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::parse;
- real_parser<double, ts_real_policies<double> > ts_real;
- double d;
-
- BOOST_TEST(test("123,456,789.01", ts_real));
- BOOST_TEST(test_attr("123,456,789.01", ts_real, d) && compare(d, 123456789.01));
-
- BOOST_TEST(test("12,345,678.90", ts_real));
- BOOST_TEST(test_attr("12,345,678.90", ts_real, d) && compare(d, 12345678.90));
-
- BOOST_TEST(test("1,234,567.89", ts_real));
- BOOST_TEST(test_attr("1,234,567.89", ts_real, d) && compare(d, 1234567.89));
-
- BOOST_TEST(!test("1234,567,890", ts_real));
- BOOST_TEST(!test("1,234,5678,9", ts_real));
- BOOST_TEST(!test("1,234,567.89e6", ts_real));
- BOOST_TEST(!test("1,66", ts_real));
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // Custom data type
- ///////////////////////////////////////////////////////////////////////////
- {
- using boost::math::concepts::real_concept;
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::real_policies;
- using boost::spirit::qi::parse;
-
- real_parser<real_concept, real_policies<real_concept> > custom_real;
- real_concept d;
-
- BOOST_TEST(test("-1234", custom_real));
- BOOST_TEST(test_attr("-1234", custom_real, d) && compare(d, -1234));
-
- BOOST_TEST(test("-1.2e3", custom_real));
- BOOST_TEST(test_attr("-1.2e3", custom_real, d) && compare(d, -1.2e3));
-
- BOOST_TEST(test("+1.2e3", custom_real));
- BOOST_TEST(test_attr("+1.2e3", custom_real, d) && compare(d, 1.2e3));
-
- BOOST_TEST(test("-0.1", custom_real));
- BOOST_TEST(test_attr("-0.1", custom_real, d) && compare(d, -0.1));
-
- BOOST_TEST(test("-1.2e-3", custom_real));
- BOOST_TEST(test_attr("-1.2e-3", custom_real, d) && compare(d, -1.2e-3));
-
- BOOST_TEST(test("-1.e2", custom_real));
- BOOST_TEST(test_attr("-1.e2", custom_real, d) && compare(d, -1.e2));
-
- BOOST_TEST(test("-.2e3", custom_real));
- BOOST_TEST(test_attr("-.2e3", custom_real, d) && compare(d, -.2e3));
-
- BOOST_TEST(test("-2e3", custom_real));
- BOOST_TEST(test_attr("-2e3", custom_real, d) && compare(d, -2e3));
-
- BOOST_TEST(!test("-e3", custom_real));
- BOOST_TEST(!test_attr("-e3", custom_real, d));
-
- BOOST_TEST(!test("-1.2e", custom_real));
- BOOST_TEST(!test_attr("-1.2e", custom_real, d));
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // custom real tests
- ///////////////////////////////////////////////////////////////////////////
- //~ {
- //~ using boost::spirit::qi::double_;
- //~ custom_real n;
-
- //~ BOOST_TEST(test_attr("-123456e6", double_, n));
- //~ }
-
- // this should pass, but currently doesn't because of the way the real
- // parser handles the fractional part of a number
- {
- using boost::spirit::qi::float_;
-
- float f;
- BOOST_TEST(test_attr("123233.4124", float_, f) && f == 123233.4140625f);
- }
-
- return boost::report_errors();
-}
Added: trunk/libs/spirit/test/qi/real.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/real.hpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,126 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+
+ Use, modification and distribution is 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)
+=============================================================================*/
+#if !defined(BOOST_SPIRIT_TEST_QI_REAL_HPP)
+#define BOOST_SPIRIT_TEST_QI_REAL_HPP
+
+#include <climits>
+#include <boost/math/concepts/real_concept.hpp>
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/special_functions/sign.hpp>
+
+#include "test.hpp"
+
+///////////////////////////////////////////////////////////////////////////////
+// These policies can be used to parse thousand separated
+// numbers with at most 2 decimal digits after the decimal
+// point. e.g. 123,456,789.01
+///////////////////////////////////////////////////////////////////////////////
+template <typename T>
+struct ts_real_policies : boost::spirit::qi::ureal_policies<T>
+{
+ // 2 decimal places Max
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ namespace qi = boost::spirit::qi;
+ return qi::extract_uint<T, 10, 1, 2, true>::call(first, last, attr);
+ }
+
+ // No exponent
+ template <typename Iterator>
+ static bool
+ parse_exp(Iterator&, Iterator const&)
+ {
+ return false;
+ }
+
+ // No exponent
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_exp_n(Iterator&, Iterator const&, Attribute&)
+ {
+ return false;
+ }
+
+ // Thousands separated numbers
+ template <typename Iterator, typename Attribute>
+ static bool
+ parse_n(Iterator& first, Iterator const& last, Attribute& attr)
+ {
+ using boost::spirit::qi::uint_parser;
+ namespace qi = boost::spirit::qi;
+
+ uint_parser<unsigned, 10, 1, 3> uint3;
+ uint_parser<unsigned, 10, 3, 3> uint3_3;
+
+ T result = 0;
+ if (parse(first, last, uint3, result))
+ {
+ bool hit = false;
+ T n;
+ Iterator save = first;
+
+ while (qi::parse(first, last, ',') && qi::parse(first, last, uint3_3, n))
+ {
+ result = result * 1000 + n;
+ save = first;
+ hit = true;
+ }
+
+ first = save;
+ if (hit)
+ attr = result;
+ return hit;
+ }
+ return false;
+ }
+};
+
+template <typename T>
+struct no_trailing_dot_policy : boost::spirit::qi::real_policies<T>
+{
+ static bool const allow_trailing_dot = false;
+};
+
+template <typename T>
+struct no_leading_dot_policy : boost::spirit::qi::real_policies<T>
+{
+ static bool const allow_leading_dot = false;
+};
+
+template <typename T>
+bool
+compare(T n, double expected)
+{
+ T const eps = std::pow(10.0, -std::numeric_limits<T>::digits10);
+ T delta = n - expected;
+ return (delta >= -eps) && (delta <= eps);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// A custom real type
+struct custom_real
+{
+ double n;
+ custom_real() : n(0) {}
+ custom_real(double n_) : n(n_) {}
+ friend custom_real operator*(custom_real a, custom_real b)
+ { return custom_real(a.n * b.n); }
+ friend custom_real operator+(custom_real a, custom_real b)
+ { return custom_real(a.n + b.n); }
+ friend custom_real operator-(custom_real a, custom_real b)
+ { return custom_real(a.n - b.n); }
+};
+
+#endif
Copied: trunk/libs/spirit/test/qi/real1.cpp (from r67483, /trunk/libs/spirit/test/qi/real.cpp)
==============================================================================
--- /trunk/libs/spirit/test/qi/real.cpp (original)
+++ trunk/libs/spirit/test/qi/real1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -6,119 +6,8 @@
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
-#include <climits>
-#include <boost/math/concepts/real_concept.hpp>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/math/special_functions/fpclassify.hpp>
-#include <boost/math/special_functions/sign.hpp>
-
-#include "test.hpp"
-
-///////////////////////////////////////////////////////////////////////////////
-// These policies can be used to parse thousand separated
-// numbers with at most 2 decimal digits after the decimal
-// point. e.g. 123,456,789.01
-///////////////////////////////////////////////////////////////////////////////
-template <typename T>
-struct ts_real_policies : boost::spirit::qi::ureal_policies<T>
-{
- // 2 decimal places Max
- template <typename Iterator, typename Attribute>
- static bool
- parse_frac_n(Iterator& first, Iterator const& last, Attribute& attr)
- {
- namespace qi = boost::spirit::qi;
- return qi::extract_uint<T, 10, 1, 2, true>::call(first, last, attr);
- }
-
- // No exponent
- template <typename Iterator>
- static bool
- parse_exp(Iterator&, Iterator const&)
- {
- return false;
- }
-
- // No exponent
- template <typename Iterator, typename Attribute>
- static bool
- parse_exp_n(Iterator&, Iterator const&, Attribute&)
- {
- return false;
- }
-
- // Thousands separated numbers
- template <typename Iterator, typename Attribute>
- static bool
- parse_n(Iterator& first, Iterator const& last, Attribute& attr)
- {
- using boost::spirit::qi::uint_parser;
- namespace qi = boost::spirit::qi;
- uint_parser<unsigned, 10, 1, 3> uint3;
- uint_parser<unsigned, 10, 3, 3> uint3_3;
-
- T result = 0;
- if (parse(first, last, uint3, result))
- {
- bool hit = false;
- T n;
- Iterator save = first;
-
- while (qi::parse(first, last, ',') && qi::parse(first, last, uint3_3, n))
- {
- result = result * 1000 + n;
- save = first;
- hit = true;
- }
-
- first = save;
- if (hit)
- attr = result;
- return hit;
- }
- return false;
- }
-};
-
-template <typename T>
-struct no_trailing_dot_policy : boost::spirit::qi::real_policies<T>
-{
- static bool const allow_trailing_dot = false;
-};
-
-template <typename T>
-struct no_leading_dot_policy : boost::spirit::qi::real_policies<T>
-{
- static bool const allow_leading_dot = false;
-};
-
-template <typename T>
-bool
-compare(T n, double expected)
-{
- T const eps = std::pow(10.0, -std::numeric_limits<T>::digits10);
- T delta = n - expected;
- return (delta >= -eps) && (delta <= eps);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// A custom real type
-struct custom_real
-{
- double n;
- custom_real() : n(0) {}
- custom_real(double n_) : n(n_) {}
- friend custom_real operator*(custom_real a, custom_real b)
- { return custom_real(a.n * b.n); }
- friend custom_real operator+(custom_real a, custom_real b)
- { return custom_real(a.n + b.n); }
- friend custom_real operator-(custom_real a, custom_real b)
- { return custom_real(a.n - b.n); }
-};
+#include "real.hpp"
int
main()
@@ -217,209 +106,5 @@
BOOST_TEST(!test_attr("-.3", udouble, d));
}
-///////////////////////////////////////////////////////////////////////////////
-// signed real number tests
-///////////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::double_;
- using boost::spirit::qi::parse;
- double d;
-
- BOOST_TEST(test("-1234", double_));
- BOOST_TEST(test_attr("-1234", double_, d) && compare(d, -1234));
-
- BOOST_TEST(test("-1.2e3", double_));
- BOOST_TEST(test_attr("-1.2e3", double_, d) && compare(d, -1.2e3));
-
- BOOST_TEST(test("+1.2e3", double_));
- BOOST_TEST(test_attr("+1.2e3", double_, d) && compare(d, 1.2e3));
-
- BOOST_TEST(test("-0.1", double_));
- BOOST_TEST(test_attr("-0.1", double_, d) && compare(d, -0.1));
-
- BOOST_TEST(test("-1.2e-3", double_));
- BOOST_TEST(test_attr("-1.2e-3", double_, d) && compare(d, -1.2e-3));
-
- BOOST_TEST(test("-1.e2", double_));
- BOOST_TEST(test_attr("-1.e2", double_, d) && compare(d, -1.e2));
-
- BOOST_TEST(test("-.2e3", double_));
- BOOST_TEST(test_attr("-.2e3", double_, d) && compare(d, -.2e3));
-
- BOOST_TEST(test("-2e3", double_));
- BOOST_TEST(test_attr("-2e3", double_, d) && compare(d, -2e3));
-
- BOOST_TEST(!test("-e3", double_));
- BOOST_TEST(!test_attr("-e3", double_, d));
-
- BOOST_TEST(!test("-1.2e", double_));
- BOOST_TEST(!test_attr("-1.2e", double_, d));
-
-#if defined(BOOST_SPIRIT_TEST_REAL_PRECISION)
- BOOST_TEST(test_attr("-5.7222349715140557e+307", double_, d));
- BOOST_TEST(d == -5.7222349715140557e+307); // exact!
-
- BOOST_TEST(test_attr("2.0332938517515416e-308", double_, d));
- BOOST_TEST(d == 2.0332938517515416e-308); // exact!
-
- BOOST_TEST(test_attr("20332938517515416e291", double_, d));
- BOOST_TEST(d == 20332938517515416e291); // exact!
-
- BOOST_TEST(test_attr("2.0332938517515416e307", double_, d));
- BOOST_TEST(d == 2.0332938517515416e307); // exact!
-#endif
-
- using boost::math::fpclassify;
- using boost::spirit::detail::signbit; // Boost version is broken
-
- BOOST_TEST(test("-inf", double_));
- BOOST_TEST(test("-infinity", double_));
- BOOST_TEST(test_attr("-inf", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
- BOOST_TEST(test_attr("-infinity", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
- BOOST_TEST(test("-INF", double_));
- BOOST_TEST(test("-INFINITY", double_));
- BOOST_TEST(test_attr("-INF", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
- BOOST_TEST(test_attr("-INFINITY", double_, d) &&
- FP_INFINITE == fpclassify(d) && signbit(d));
-
- BOOST_TEST(test("-nan", double_));
- BOOST_TEST(test_attr("-nan", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
- BOOST_TEST(test("-NAN", double_));
- BOOST_TEST(test_attr("-NAN", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
-
- BOOST_TEST(test("-nan(...)", double_));
- BOOST_TEST(test_attr("-nan(...)", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
- BOOST_TEST(test("-NAN(...)", double_));
- BOOST_TEST(test_attr("-NAN(...)", double_, d) &&
- FP_NAN == fpclassify(d) && signbit(d));
- }
-
- ///////////////////////////////////////////////////////////////////////////////
- // strict real number tests
- ///////////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::parse;
- using boost::spirit::qi::strict_ureal_policies;
- using boost::spirit::qi::strict_real_policies;
-
- real_parser<double, strict_ureal_policies<double> > strict_udouble;
- real_parser<double, strict_real_policies<double> > strict_double;
- double d;
-
- BOOST_TEST(!test("1234", strict_udouble));
- BOOST_TEST(!test_attr("1234", strict_udouble, d));
-
- BOOST_TEST(test("1.2", strict_udouble));
- BOOST_TEST(test_attr("1.2", strict_udouble, d) && compare(d, 1.2));
-
- BOOST_TEST(!test("-1234", strict_double));
- BOOST_TEST(!test_attr("-1234", strict_double, d));
-
- BOOST_TEST(test("123.", strict_double));
- BOOST_TEST(test_attr("123.", strict_double, d) && compare(d, 123));
-
- BOOST_TEST(test("3.E6", strict_double));
- BOOST_TEST(test_attr("3.E6", strict_double, d) && compare(d, 3e6));
-
- real_parser<double, no_trailing_dot_policy<double> > notrdot_real;
- real_parser<double, no_leading_dot_policy<double> > nolddot_real;
-
- BOOST_TEST(!test("1234.", notrdot_real)); // Bad trailing dot
- BOOST_TEST(!test(".1234", nolddot_real)); // Bad leading dot
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // Special thousands separated numbers
- ///////////////////////////////////////////////////////////////////////////
- {
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::parse;
- real_parser<double, ts_real_policies<double> > ts_real;
- double d;
-
- BOOST_TEST(test("123,456,789.01", ts_real));
- BOOST_TEST(test_attr("123,456,789.01", ts_real, d) && compare(d, 123456789.01));
-
- BOOST_TEST(test("12,345,678.90", ts_real));
- BOOST_TEST(test_attr("12,345,678.90", ts_real, d) && compare(d, 12345678.90));
-
- BOOST_TEST(test("1,234,567.89", ts_real));
- BOOST_TEST(test_attr("1,234,567.89", ts_real, d) && compare(d, 1234567.89));
-
- BOOST_TEST(!test("1234,567,890", ts_real));
- BOOST_TEST(!test("1,234,5678,9", ts_real));
- BOOST_TEST(!test("1,234,567.89e6", ts_real));
- BOOST_TEST(!test("1,66", ts_real));
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // Custom data type
- ///////////////////////////////////////////////////////////////////////////
- {
- using boost::math::concepts::real_concept;
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::real_policies;
- using boost::spirit::qi::parse;
-
- real_parser<real_concept, real_policies<real_concept> > custom_real;
- real_concept d;
-
- BOOST_TEST(test("-1234", custom_real));
- BOOST_TEST(test_attr("-1234", custom_real, d) && compare(d, -1234));
-
- BOOST_TEST(test("-1.2e3", custom_real));
- BOOST_TEST(test_attr("-1.2e3", custom_real, d) && compare(d, -1.2e3));
-
- BOOST_TEST(test("+1.2e3", custom_real));
- BOOST_TEST(test_attr("+1.2e3", custom_real, d) && compare(d, 1.2e3));
-
- BOOST_TEST(test("-0.1", custom_real));
- BOOST_TEST(test_attr("-0.1", custom_real, d) && compare(d, -0.1));
-
- BOOST_TEST(test("-1.2e-3", custom_real));
- BOOST_TEST(test_attr("-1.2e-3", custom_real, d) && compare(d, -1.2e-3));
-
- BOOST_TEST(test("-1.e2", custom_real));
- BOOST_TEST(test_attr("-1.e2", custom_real, d) && compare(d, -1.e2));
-
- BOOST_TEST(test("-.2e3", custom_real));
- BOOST_TEST(test_attr("-.2e3", custom_real, d) && compare(d, -.2e3));
-
- BOOST_TEST(test("-2e3", custom_real));
- BOOST_TEST(test_attr("-2e3", custom_real, d) && compare(d, -2e3));
-
- BOOST_TEST(!test("-e3", custom_real));
- BOOST_TEST(!test_attr("-e3", custom_real, d));
-
- BOOST_TEST(!test("-1.2e", custom_real));
- BOOST_TEST(!test_attr("-1.2e", custom_real, d));
- }
-
- ///////////////////////////////////////////////////////////////////////////
- // custom real tests
- ///////////////////////////////////////////////////////////////////////////
- //~ {
- //~ using boost::spirit::qi::double_;
- //~ custom_real n;
-
- //~ BOOST_TEST(test_attr("-123456e6", double_, n));
- //~ }
-
- // this should pass, but currently doesn't because of the way the real
- // parser handles the fractional part of a number
- {
- using boost::spirit::qi::float_;
-
- float f;
- BOOST_TEST(test_attr("123233.4124", float_, f) && f == 123233.4140625f);
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/qi/real2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/real2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,101 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+
+ Use, modification and distribution is 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)
+=============================================================================*/
+
+#include "real.hpp"
+
+int
+main()
+{
+ using spirit_test::test;
+ using spirit_test::test_attr;
+///////////////////////////////////////////////////////////////////////////////
+// signed real number tests
+///////////////////////////////////////////////////////////////////////////////
+ {
+ using boost::spirit::qi::double_;
+ using boost::spirit::qi::parse;
+ double d;
+
+ BOOST_TEST(test("-1234", double_));
+ BOOST_TEST(test_attr("-1234", double_, d) && compare(d, -1234));
+
+ BOOST_TEST(test("-1.2e3", double_));
+ BOOST_TEST(test_attr("-1.2e3", double_, d) && compare(d, -1.2e3));
+
+ BOOST_TEST(test("+1.2e3", double_));
+ BOOST_TEST(test_attr("+1.2e3", double_, d) && compare(d, 1.2e3));
+
+ BOOST_TEST(test("-0.1", double_));
+ BOOST_TEST(test_attr("-0.1", double_, d) && compare(d, -0.1));
+
+ BOOST_TEST(test("-1.2e-3", double_));
+ BOOST_TEST(test_attr("-1.2e-3", double_, d) && compare(d, -1.2e-3));
+
+ BOOST_TEST(test("-1.e2", double_));
+ BOOST_TEST(test_attr("-1.e2", double_, d) && compare(d, -1.e2));
+
+ BOOST_TEST(test("-.2e3", double_));
+ BOOST_TEST(test_attr("-.2e3", double_, d) && compare(d, -.2e3));
+
+ BOOST_TEST(test("-2e3", double_));
+ BOOST_TEST(test_attr("-2e3", double_, d) && compare(d, -2e3));
+
+ BOOST_TEST(!test("-e3", double_));
+ BOOST_TEST(!test_attr("-e3", double_, d));
+
+ BOOST_TEST(!test("-1.2e", double_));
+ BOOST_TEST(!test_attr("-1.2e", double_, d));
+
+#if defined(BOOST_SPIRIT_TEST_REAL_PRECISION)
+ BOOST_TEST(test_attr("-5.7222349715140557e+307", double_, d));
+ BOOST_TEST(d == -5.7222349715140557e+307); // exact!
+
+ BOOST_TEST(test_attr("2.0332938517515416e-308", double_, d));
+ BOOST_TEST(d == 2.0332938517515416e-308); // exact!
+
+ BOOST_TEST(test_attr("20332938517515416e291", double_, d));
+ BOOST_TEST(d == 20332938517515416e291); // exact!
+
+ BOOST_TEST(test_attr("2.0332938517515416e307", double_, d));
+ BOOST_TEST(d == 2.0332938517515416e307); // exact!
+#endif
+
+ using boost::math::fpclassify;
+ using boost::spirit::detail::signbit; // Boost version is broken
+
+ BOOST_TEST(test("-inf", double_));
+ BOOST_TEST(test("-infinity", double_));
+ BOOST_TEST(test_attr("-inf", double_, d) &&
+ FP_INFINITE == fpclassify(d) && signbit(d));
+ BOOST_TEST(test_attr("-infinity", double_, d) &&
+ FP_INFINITE == fpclassify(d) && signbit(d));
+ BOOST_TEST(test("-INF", double_));
+ BOOST_TEST(test("-INFINITY", double_));
+ BOOST_TEST(test_attr("-INF", double_, d) &&
+ FP_INFINITE == fpclassify(d) && signbit(d));
+ BOOST_TEST(test_attr("-INFINITY", double_, d) &&
+ FP_INFINITE == fpclassify(d) && signbit(d));
+
+ BOOST_TEST(test("-nan", double_));
+ BOOST_TEST(test_attr("-nan", double_, d) &&
+ FP_NAN == fpclassify(d) && signbit(d));
+ BOOST_TEST(test("-NAN", double_));
+ BOOST_TEST(test_attr("-NAN", double_, d) &&
+ FP_NAN == fpclassify(d) && signbit(d));
+
+ BOOST_TEST(test("-nan(...)", double_));
+ BOOST_TEST(test_attr("-nan(...)", double_, d) &&
+ FP_NAN == fpclassify(d) && signbit(d));
+ BOOST_TEST(test("-NAN(...)", double_));
+ BOOST_TEST(test_attr("-NAN(...)", double_, d) &&
+ FP_NAN == fpclassify(d) && signbit(d));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/qi/real3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/real3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,78 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+
+ Use, modification and distribution is 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)
+=============================================================================*/
+
+#include "real.hpp"
+
+int
+main()
+{
+ using spirit_test::test;
+ using spirit_test::test_attr;
+
+ ///////////////////////////////////////////////////////////////////////////////
+ // strict real number tests
+ ///////////////////////////////////////////////////////////////////////////////
+ {
+ using boost::spirit::qi::real_parser;
+ using boost::spirit::qi::parse;
+ using boost::spirit::qi::strict_ureal_policies;
+ using boost::spirit::qi::strict_real_policies;
+
+ real_parser<double, strict_ureal_policies<double> > strict_udouble;
+ real_parser<double, strict_real_policies<double> > strict_double;
+ double d;
+
+ BOOST_TEST(!test("1234", strict_udouble));
+ BOOST_TEST(!test_attr("1234", strict_udouble, d));
+
+ BOOST_TEST(test("1.2", strict_udouble));
+ BOOST_TEST(test_attr("1.2", strict_udouble, d) && compare(d, 1.2));
+
+ BOOST_TEST(!test("-1234", strict_double));
+ BOOST_TEST(!test_attr("-1234", strict_double, d));
+
+ BOOST_TEST(test("123.", strict_double));
+ BOOST_TEST(test_attr("123.", strict_double, d) && compare(d, 123));
+
+ BOOST_TEST(test("3.E6", strict_double));
+ BOOST_TEST(test_attr("3.E6", strict_double, d) && compare(d, 3e6));
+
+ real_parser<double, no_trailing_dot_policy<double> > notrdot_real;
+ real_parser<double, no_leading_dot_policy<double> > nolddot_real;
+
+ BOOST_TEST(!test("1234.", notrdot_real)); // Bad trailing dot
+ BOOST_TEST(!test(".1234", nolddot_real)); // Bad leading dot
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Special thousands separated numbers
+ ///////////////////////////////////////////////////////////////////////////
+ {
+ using boost::spirit::qi::real_parser;
+ using boost::spirit::qi::parse;
+ real_parser<double, ts_real_policies<double> > ts_real;
+ double d;
+
+ BOOST_TEST(test("123,456,789.01", ts_real));
+ BOOST_TEST(test_attr("123,456,789.01", ts_real, d) && compare(d, 123456789.01));
+
+ BOOST_TEST(test("12,345,678.90", ts_real));
+ BOOST_TEST(test_attr("12,345,678.90", ts_real, d) && compare(d, 12345678.90));
+
+ BOOST_TEST(test("1,234,567.89", ts_real));
+ BOOST_TEST(test_attr("1,234,567.89", ts_real, d) && compare(d, 1234567.89));
+
+ BOOST_TEST(!test("1234,567,890", ts_real));
+ BOOST_TEST(!test("1,234,5678,9", ts_real));
+ BOOST_TEST(!test("1,234,567.89e6", ts_real));
+ BOOST_TEST(!test("1,66", ts_real));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/qi/real4.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/real4.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,81 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+ Copyright (c) 2001-2010 Hartmut Kaiser
+
+ Use, modification and distribution is 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)
+=============================================================================*/
+
+#include "real.hpp"
+
+int
+main()
+{
+ using spirit_test::test;
+ using spirit_test::test_attr;
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Custom data type
+ ///////////////////////////////////////////////////////////////////////////
+ {
+ using boost::math::concepts::real_concept;
+ using boost::spirit::qi::real_parser;
+ using boost::spirit::qi::real_policies;
+ using boost::spirit::qi::parse;
+
+ real_parser<real_concept, real_policies<real_concept> > custom_real;
+ real_concept d;
+
+ BOOST_TEST(test("-1234", custom_real));
+ BOOST_TEST(test_attr("-1234", custom_real, d) && compare(d, -1234));
+
+ BOOST_TEST(test("-1.2e3", custom_real));
+ BOOST_TEST(test_attr("-1.2e3", custom_real, d) && compare(d, -1.2e3));
+
+ BOOST_TEST(test("+1.2e3", custom_real));
+ BOOST_TEST(test_attr("+1.2e3", custom_real, d) && compare(d, 1.2e3));
+
+ BOOST_TEST(test("-0.1", custom_real));
+ BOOST_TEST(test_attr("-0.1", custom_real, d) && compare(d, -0.1));
+
+ BOOST_TEST(test("-1.2e-3", custom_real));
+ BOOST_TEST(test_attr("-1.2e-3", custom_real, d) && compare(d, -1.2e-3));
+
+ BOOST_TEST(test("-1.e2", custom_real));
+ BOOST_TEST(test_attr("-1.e2", custom_real, d) && compare(d, -1.e2));
+
+ BOOST_TEST(test("-.2e3", custom_real));
+ BOOST_TEST(test_attr("-.2e3", custom_real, d) && compare(d, -.2e3));
+
+ BOOST_TEST(test("-2e3", custom_real));
+ BOOST_TEST(test_attr("-2e3", custom_real, d) && compare(d, -2e3));
+
+ BOOST_TEST(!test("-e3", custom_real));
+ BOOST_TEST(!test_attr("-e3", custom_real, d));
+
+ BOOST_TEST(!test("-1.2e", custom_real));
+ BOOST_TEST(!test_attr("-1.2e", custom_real, d));
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // custom real tests
+ ///////////////////////////////////////////////////////////////////////////
+ //~ {
+ //~ using boost::spirit::qi::double_;
+ //~ custom_real n;
+
+ //~ BOOST_TEST(test_attr("-123456e6", double_, n));
+ //~ }
+
+ // this should pass, but currently doesn't because of the way the real
+ // parser handles the fractional part of a number
+ //{
+ //using boost::spirit::qi::float_;
+
+ //float f;
+ //BOOST_TEST(test_attr("123233.4124", float_, f) && f == 123233.4140625f);
+ //}
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/qi/reorder_test.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/reorder_test.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,79 +0,0 @@
-// Copyright (c) 2010 Olaf Peter
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/qi.hpp>
-#include <boost/fusion/include/nview.hpp>
-
-namespace qi = boost::spirit::qi;
-namespace ascii = boost::spirit::ascii;
-namespace phx = boost::phoenix;
-namespace fusion = boost::fusion;
-namespace mpl = boost::mpl;
-
-int main()
-{
- using fusion::result_of::as_nview;
- using fusion::at_c;
- using boost::optional;
- using boost::variant;
- using ascii::space_type;
- using ascii::no_case;
- using qi::lit;
- using qi::double_;
-
- typedef fusion::vector<
- optional<double>, // 0 - U
- optional<double>, // 1 - V
- optional<double> // 2 - W
- > uvw_type;
-
- typedef as_nview<uvw_type, 0, 1, 2>::type uvw_reordered_type;
- typedef as_nview<uvw_type, 2, 0, 1>::type vwu_reordered_type;
-
- typedef char const* iterator_type;
-
- qi::rule<iterator_type, optional<double>(), space_type> u,v,w;
- qi::rule<iterator_type, uvw_reordered_type(), space_type> uvw;
- qi::rule<iterator_type, vwu_reordered_type(), space_type> vwu;
-
- u = no_case[ "NA" ] | ( double_ >> -lit( "U" ) );
- v = no_case[ "NA" ] | ( double_ >> -lit( "V" ) );
- w = no_case[ "NA" ] | ( double_ >> -lit( "W" ) );
-
- uvw = u > v > w;
- vwu = v > w > u;
-
- uvw_type uvw_data;
- {
- iterator_type first = "1U 2V 3W";
- iterator_type last = first + std::strlen(first);
-
- uvw_reordered_type uvw_result( uvw_data );
-
- BOOST_TEST(qi::phrase_parse(first, last, uvw, ascii::space, uvw_result));
- BOOST_TEST(fusion::at_c<0>(uvw_result) && *fusion::at_c<0>(uvw_result) == 1);
- BOOST_TEST(fusion::at_c<1>(uvw_result) && *fusion::at_c<1>(uvw_result) == 2);
- BOOST_TEST(fusion::at_c<2>(uvw_result) && *fusion::at_c<2>(uvw_result) == 3);
- }
-
- {
- iterator_type first = "2V 3W 1U";
- iterator_type last = first + std::strlen(first);
-
- vwu_reordered_type uvw_result(uvw_data);
-
- BOOST_TEST(qi::phrase_parse(first, last, vwu, ascii::space, uvw_result));
- BOOST_TEST(fusion::at_c<0>(uvw_result) && *fusion::at_c<0>(uvw_result) == 2);
- BOOST_TEST(fusion::at_c<1>(uvw_result) && *fusion::at_c<1>(uvw_result) == 3);
- BOOST_TEST(fusion::at_c<2>(uvw_result) && *fusion::at_c<2>(uvw_result) == 1);
- }
-
- return boost::report_errors();
-}
-
-
Deleted: trunk/libs/spirit/test/qi/repeat_regression.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/repeat_regression.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,44 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2010 Head Geek
-//
-// Distributed under 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)
-
-#include <iostream>
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi.hpp>
-
-namespace qi = boost::spirit::qi;
-using qi::omit;
-using qi::repeat;
-using std::cout;
-using std::endl;
-
-typedef qi::rule<std::string::const_iterator, std::string()> strrule_type;
-
-void test(const std::string input, strrule_type rule, std::string result)
-{
- std::string target;
- std::string::const_iterator i = input.begin(), ie = input.end();
-
- BOOST_TEST(qi::parse(i, ie, rule, target) && target == result);
-}
-
-int main()
-{
- strrule_type obsolete_year =
- omit[-qi::char_(" \t")] >>
- repeat(2)[qi::digit] >>
- omit[-qi::char_(" \t")];
- strrule_type correct_year = repeat(4)[qi::digit];
-
- test("1776", correct_year | repeat(2)[qi::digit], "1776");
- test("76", obsolete_year, "76");
- test("76", obsolete_year | correct_year, "76");
- test(" 76", correct_year | obsolete_year, "76");
- test("76", correct_year | obsolete_year, "76");
- test("76", correct_year | repeat(2)[qi::digit], "76");
-
- return boost::report_errors();
-}
-
Deleted: trunk/libs/spirit/test/qi/rule.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/rule.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,489 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Joel de Guzman
-
- Distributed under 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)
-=============================================================================*/
-
-// this file deliberately contains non-ascii characters
-// boostinspect:noascii
-
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_string.hpp>
-#include <boost/spirit/include/qi_numeric.hpp>
-#include <boost/spirit/include/qi_auxiliary.hpp>
-#include <boost/spirit/include/qi_directive.hpp>
-#include <boost/spirit/include/qi_nonterminal.hpp>
-#include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_object.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
-#include <boost/fusion/include/std_pair.hpp>
-
-#include <string>
-#include <cstring>
-#include <iostream>
-#include "test.hpp"
-
-int
-main()
-{
- using spirit_test::test_attr;
- using spirit_test::test;
-
- using namespace boost::spirit::ascii;
- using namespace boost::spirit::qi::labels;
- using boost::spirit::qi::locals;
- using boost::spirit::qi::rule;
- using boost::spirit::qi::int_;
- using boost::spirit::qi::uint_;
- using boost::spirit::qi::fail;
- using boost::spirit::qi::on_error;
- using boost::spirit::qi::debug;
- using boost::spirit::qi::lit;
-
- namespace phx = boost::phoenix;
-
-
- { // basic tests
-
- rule<char const*> a, b, c, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
-
- a.name("a");
- b.name("b");
- c.name("c");
- start.name("start");
-
- debug(a);
- debug(b);
- debug(c);
- debug(start);
-
- start = *(a | b | c);
- BOOST_TEST(test("abcabcacb", start));
-
- start = (a | b) >> (start | b);
- BOOST_TEST(test("aaaabababaaabbb", start));
- BOOST_TEST(test("aaaabababaaabba", start, false));
-
- // ignore the skipper!
- BOOST_TEST(test("aaaabababaaabba", start, space, false));
- }
-
- { // basic tests with direct initialization
-
- rule<char const*> a ('a');
- rule<char const*> b ('b');
- rule<char const*> c ('c');
- rule<char const*> start = (a | b) >> (start | b);
-
- BOOST_TEST(test("aaaabababaaabbb", start));
- BOOST_TEST(test("aaaabababaaabba", start, false));
-
- // ignore the skipper!
- BOOST_TEST(test("aaaabababaaabba", start, space, false));
- }
-
- { // basic tests w/ skipper
- rule<char const*, space_type> a, b, c, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
-
- a.name("a");
- b.name("b");
- c.name("c");
- start.name("start");
-
- debug(a);
- debug(b);
- debug(c);
- debug(start);
-
- start = *(a | b | c);
- BOOST_TEST(test(" a b c a b c a c b ", start, space));
-
- start = (a | b) >> (start | b);
- BOOST_TEST(test(" a a a a b a b a b a a a b b b ", start, space));
- BOOST_TEST(test(" a a a a b a b a b a a a b b a ", start, space, false));
- }
-
- { // basic tests w/ skipper but no final post-skip
-
- rule<char const*, space_type> a, b, c, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
-
- a.name("a");
- b.name("b");
- c.name("c");
- start.name("start");
-
- debug(a);
- debug(b);
- debug(c);
- debug(start);
-
- start = *(a | b) >> c;
-
- using boost::spirit::qi::phrase_parse;
- using boost::spirit::qi::skip_flag;
- {
- char const *s1 = " a b a a b b a c ... "
- , *const e1 = s1 + std::strlen(s1);
- BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::dont_postskip)
- && s1 == e1 - 5);
- }
-
- start = (a | b) >> (start | c);
- {
- char const *s1 = " a a a a b a b a b a a a b b b c "
- , *const e1 = s1 + std::strlen(s1);
- BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::postskip)
- && s1 == e1);
- }
- {
- char const *s1 = " a a a a b a b a b a a a b b b c "
- , *const e1 = s1 + std::strlen(s1);
- BOOST_TEST(phrase_parse(s1, e1, start, space, skip_flag::dont_postskip)
- && s1 == e1 - 1);
- }
- }
-
- { // test unassigned rule
-
- rule<char const*> a;
- BOOST_TEST(!test("x", a));
- }
-
- { // alias tests
-
- rule<char const*> a, b, c, d, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
- d = start.alias(); // d will always track start
-
- start = *(a | b | c);
- BOOST_TEST(test("abcabcacb", d));
-
- start = (a | b) >> (start | b);
- BOOST_TEST(test("aaaabababaaabbb", d));
- }
-
- { // copy tests
-
- rule<char const*> a, b, c, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
-
- // The FF is the dynamic equivalent of start = *(a | b | c);
- start = a;
- start = start.copy() | b;
- start = start.copy() | c;
- start = *(start.copy());
-
- BOOST_TEST(test("abcabcacb", start));
-
- // The FF is the dynamic equivalent of start = (a | b) >> (start | b);
- start = b;
- start = a | start.copy();
- start = start.copy() >> (start | b);
-
- BOOST_TEST(test("aaaabababaaabbb", start));
- BOOST_TEST(test("aaaabababaaabba", start, false));
- }
-
- { // context tests
-
- char ch;
- rule<char const*, char()> a;
- a = alpha[_val = _1];
-
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
-
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
- }
-
- { // auto rules tests
-
- char ch = '\0';
- rule<char const*, char()> a;
- a %= alpha;
-
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
-
- a = alpha; // test deduced auto rule behavior
- ch = '\0';
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
- }
-
- { // auto rules tests: allow stl containers as attributes to
- // sequences (in cases where attributes of the elements
- // are convertible to the value_type of the container or if
- // the element itself is an stl container with value_type
- // that is convertible to the value_type of the attribute).
-
- std::string s;
- rule<char const*, std::string()> r;
- r %= char_ >> *(',' >> char_);
-
- BOOST_TEST(test("a,b,c,d,e,f", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
-
- r = char_ >> *(',' >> char_); // test deduced auto rule behavior
- s.clear();
- BOOST_TEST(test("a,b,c,d,e,f", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
-
- r %= char_ >> char_ >> char_ >> char_ >> char_ >> char_;
- s.clear();
- BOOST_TEST(test("abcdef", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
-
- r = char_ >> char_ >> char_ >> char_ >> char_ >> char_;
- s.clear();
- BOOST_TEST(test("abcdef", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
- }
-
- { // synth attribute value-init
-
- std::string s;
- rule<char const*, char()> r;
- r = alpha[_val += _1];
- BOOST_TEST(test_attr("abcdef", +r, s));
- BOOST_TEST(s == "abcdef");
- }
-
- { // auto rules aliasing tests
-
- char ch = '\0';
- rule<char const*, char()> a, b;
- a %= b;
- b %= alpha;
-
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
-
- a = b; // test deduced auto rule behavior
- b = alpha;
-
- ch = '\0';
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
- }
-
- { // context (w/arg) tests
-
- char ch;
- rule<char const*, char(int)> a; // 1 arg
- a = alpha[_val = _1 + _r1];
-
- BOOST_TEST(test("x", a(phx::val(1))[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x' + 1);
-
- BOOST_TEST(test_attr("a", a(1), ch)); // allow scalars as rule args too.
- BOOST_TEST(ch == 'a' + 1);
-
- rule<char const*, char(int, int)> b; // 2 args
- b = alpha[_val = _1 + _r1 + _r2];
- BOOST_TEST(test_attr("a", b(1, 2), ch));
- BOOST_TEST(ch == 'a' + 1 + 2);
- }
-
- { // context (w/ reference arg) tests
-
- char ch;
- rule<char const*, void(char&)> a; // 1 arg (reference)
- a = alpha[_r1 = _1];
-
- BOOST_TEST(test("x", a(phx::ref(ch))));
- BOOST_TEST(ch == 'x');
- }
-
- { // context (w/locals) tests
-
- rule<char const*, locals<char> > a; // 1 local
- a = alpha[_a = _1] >> char_(_a);
- BOOST_TEST(test("aa", a));
- BOOST_TEST(!test("ax", a));
- }
-
- { // context (w/args and locals) tests
-
- rule<char const*, void(int), locals<char> > a; // 1 arg + 1 local
- a = alpha[_a = _1 + _r1] >> char_(_a);
- BOOST_TEST(test("ab", a(phx::val(1))));
- BOOST_TEST(test("xy", a(phx::val(1))));
- BOOST_TEST(!test("ax", a(phx::val(1))));
- }
-
- { // void() has unused type (void == unused_type)
-
- std::pair<int, char> attr;
- rule<char const*, void()> r;
- r = char_;
- BOOST_TEST(test_attr("123ax", int_ >> char_ >> r, attr));
- BOOST_TEST(attr.first == 123);
- BOOST_TEST(attr.second == 'a');
- }
-
- { // bug: test that injected attributes are ok
-
- rule<char const*, char(int) > r;
-
- // problem code:
- r = char_(_r1)[_val = _1];
- }
-
- { // show that ra = rb and ra %= rb works as expected
- rule<char const*, int() > ra, rb;
- int attr;
-
- ra %= int_;
- BOOST_TEST(test_attr("123", ra, attr));
- BOOST_TEST(attr == 123);
-
- rb %= ra;
- BOOST_TEST(test_attr("123", rb, attr));
- BOOST_TEST(attr == 123);
-
- rb = ra;
- BOOST_TEST(test_attr("123", rb, attr));
- BOOST_TEST(attr == 123);
- }
-
- { // std::string as container attribute with auto rules
-
- rule<char const*, std::string()> text;
- text %= +(!char_(')') >> !char_('>') >> char_);
- std::string attr;
- BOOST_TEST(test_attr("x", text, attr));
- BOOST_TEST(attr == "x");
-
- // test deduced auto rule behavior
- text = +(!char_(')') >> !char_('>') >> char_);
- attr.clear();
- BOOST_TEST(test_attr("x", text, attr));
- BOOST_TEST(attr == "x");
- }
-
- { // error handling
-
- using namespace boost::spirit::ascii;
- using boost::phoenix::construct;
- using boost::phoenix::bind;
-
- rule<char const*> r;
- r = '(' > int_ > ',' > int_ > ')';
-
- on_error<fail>
- (
- r, std::cout
- << phx::val("Error! Expecting: ")
- << _4
- << phx::val(", got: \"")
- << construct<std::string>(_3, _2)
- << phx::val("\"")
- << std::endl
- );
-
- BOOST_TEST(test("(123,456)", r));
- BOOST_TEST(!test("(abc,def)", r));
- BOOST_TEST(!test("(123,456]", r));
- BOOST_TEST(!test("(123;456)", r));
- BOOST_TEST(!test("[123,456]", r));
- }
-
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("french")
-#endif
- { // specifying the encoding
-
- typedef boost::spirit::char_encoding::iso8859_1 iso8859_1;
- rule<char const*, iso8859_1> r;
-
- r = no_case['á'];
- BOOST_TEST(test("Á", r));
- r = no_case[char_('á')];
- BOOST_TEST(test("Á", r));
-
- r = no_case[char_("å-ï")];
- BOOST_TEST(test("É", r));
- BOOST_TEST(!test("ÿ", r));
-
- r = no_case["áÁ"];
- BOOST_TEST(test("Áá", r));
- r = no_case[lit("áÁ")];
- BOOST_TEST(test("Áá", r));
- }
-
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("")
-#endif
-
- {
- typedef boost::variant<double, int> v_type;
- rule<const char*, v_type()> r1 = int_;
- v_type v;
- BOOST_TEST(test_attr("1", r1, v) && v.which() == 1 &&
- boost::get<int>(v) == 1);
-
- typedef boost::optional<int> ov_type;
- rule<const char*, ov_type()> r2 = int_;
- ov_type ov;
- BOOST_TEST(test_attr("1", r2, ov) && ov && boost::get<int>(ov) == 1);
- }
-
- // test handling of single element fusion sequences
- {
- using boost::fusion::vector;
- using boost::fusion::at_c;
- rule<const char*, vector<int>()> r = int_;
-
- vector<int> v(0);
- BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
- }
-
- {
- using boost::fusion::vector;
- using boost::fusion::at_c;
- rule<const char*, vector<unsigned int>()> r = uint_;
-
- vector<unsigned int> v(0);
- BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
- }
-
- return boost::report_errors();
-}
-
Copied: trunk/libs/spirit/test/qi/rule1.cpp (from r67483, /trunk/libs/spirit/test/qi/rule.cpp)
==============================================================================
--- /trunk/libs/spirit/test/qi/rule.cpp (original)
+++ trunk/libs/spirit/test/qi/rule1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -47,7 +47,6 @@
namespace phx = boost::phoenix;
-
{ // basic tests
rule<char const*> a, b, c, start;
@@ -160,330 +159,6 @@
}
}
- { // test unassigned rule
-
- rule<char const*> a;
- BOOST_TEST(!test("x", a));
- }
-
- { // alias tests
-
- rule<char const*> a, b, c, d, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
- d = start.alias(); // d will always track start
-
- start = *(a | b | c);
- BOOST_TEST(test("abcabcacb", d));
-
- start = (a | b) >> (start | b);
- BOOST_TEST(test("aaaabababaaabbb", d));
- }
-
- { // copy tests
-
- rule<char const*> a, b, c, start;
-
- a = 'a';
- b = 'b';
- c = 'c';
-
- // The FF is the dynamic equivalent of start = *(a | b | c);
- start = a;
- start = start.copy() | b;
- start = start.copy() | c;
- start = *(start.copy());
-
- BOOST_TEST(test("abcabcacb", start));
-
- // The FF is the dynamic equivalent of start = (a | b) >> (start | b);
- start = b;
- start = a | start.copy();
- start = start.copy() >> (start | b);
-
- BOOST_TEST(test("aaaabababaaabbb", start));
- BOOST_TEST(test("aaaabababaaabba", start, false));
- }
-
- { // context tests
-
- char ch;
- rule<char const*, char()> a;
- a = alpha[_val = _1];
-
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
-
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
- }
-
- { // auto rules tests
-
- char ch = '\0';
- rule<char const*, char()> a;
- a %= alpha;
-
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
-
- a = alpha; // test deduced auto rule behavior
- ch = '\0';
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
- }
-
- { // auto rules tests: allow stl containers as attributes to
- // sequences (in cases where attributes of the elements
- // are convertible to the value_type of the container or if
- // the element itself is an stl container with value_type
- // that is convertible to the value_type of the attribute).
-
- std::string s;
- rule<char const*, std::string()> r;
- r %= char_ >> *(',' >> char_);
-
- BOOST_TEST(test("a,b,c,d,e,f", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
-
- r = char_ >> *(',' >> char_); // test deduced auto rule behavior
- s.clear();
- BOOST_TEST(test("a,b,c,d,e,f", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
-
- r %= char_ >> char_ >> char_ >> char_ >> char_ >> char_;
- s.clear();
- BOOST_TEST(test("abcdef", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
-
- r = char_ >> char_ >> char_ >> char_ >> char_ >> char_;
- s.clear();
- BOOST_TEST(test("abcdef", r[phx::ref(s) = _1]));
- BOOST_TEST(s == "abcdef");
- }
-
- { // synth attribute value-init
-
- std::string s;
- rule<char const*, char()> r;
- r = alpha[_val += _1];
- BOOST_TEST(test_attr("abcdef", +r, s));
- BOOST_TEST(s == "abcdef");
- }
-
- { // auto rules aliasing tests
-
- char ch = '\0';
- rule<char const*, char()> a, b;
- a %= b;
- b %= alpha;
-
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
-
- a = b; // test deduced auto rule behavior
- b = alpha;
-
- ch = '\0';
- BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x');
- ch = '\0';
- BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
- BOOST_TEST(ch == 'z');
- }
-
- { // context (w/arg) tests
-
- char ch;
- rule<char const*, char(int)> a; // 1 arg
- a = alpha[_val = _1 + _r1];
-
- BOOST_TEST(test("x", a(phx::val(1))[phx::ref(ch) = _1]));
- BOOST_TEST(ch == 'x' + 1);
-
- BOOST_TEST(test_attr("a", a(1), ch)); // allow scalars as rule args too.
- BOOST_TEST(ch == 'a' + 1);
-
- rule<char const*, char(int, int)> b; // 2 args
- b = alpha[_val = _1 + _r1 + _r2];
- BOOST_TEST(test_attr("a", b(1, 2), ch));
- BOOST_TEST(ch == 'a' + 1 + 2);
- }
-
- { // context (w/ reference arg) tests
-
- char ch;
- rule<char const*, void(char&)> a; // 1 arg (reference)
- a = alpha[_r1 = _1];
-
- BOOST_TEST(test("x", a(phx::ref(ch))));
- BOOST_TEST(ch == 'x');
- }
-
- { // context (w/locals) tests
-
- rule<char const*, locals<char> > a; // 1 local
- a = alpha[_a = _1] >> char_(_a);
- BOOST_TEST(test("aa", a));
- BOOST_TEST(!test("ax", a));
- }
-
- { // context (w/args and locals) tests
-
- rule<char const*, void(int), locals<char> > a; // 1 arg + 1 local
- a = alpha[_a = _1 + _r1] >> char_(_a);
- BOOST_TEST(test("ab", a(phx::val(1))));
- BOOST_TEST(test("xy", a(phx::val(1))));
- BOOST_TEST(!test("ax", a(phx::val(1))));
- }
-
- { // void() has unused type (void == unused_type)
-
- std::pair<int, char> attr;
- rule<char const*, void()> r;
- r = char_;
- BOOST_TEST(test_attr("123ax", int_ >> char_ >> r, attr));
- BOOST_TEST(attr.first == 123);
- BOOST_TEST(attr.second == 'a');
- }
-
- { // bug: test that injected attributes are ok
-
- rule<char const*, char(int) > r;
-
- // problem code:
- r = char_(_r1)[_val = _1];
- }
-
- { // show that ra = rb and ra %= rb works as expected
- rule<char const*, int() > ra, rb;
- int attr;
-
- ra %= int_;
- BOOST_TEST(test_attr("123", ra, attr));
- BOOST_TEST(attr == 123);
-
- rb %= ra;
- BOOST_TEST(test_attr("123", rb, attr));
- BOOST_TEST(attr == 123);
-
- rb = ra;
- BOOST_TEST(test_attr("123", rb, attr));
- BOOST_TEST(attr == 123);
- }
-
- { // std::string as container attribute with auto rules
-
- rule<char const*, std::string()> text;
- text %= +(!char_(')') >> !char_('>') >> char_);
- std::string attr;
- BOOST_TEST(test_attr("x", text, attr));
- BOOST_TEST(attr == "x");
-
- // test deduced auto rule behavior
- text = +(!char_(')') >> !char_('>') >> char_);
- attr.clear();
- BOOST_TEST(test_attr("x", text, attr));
- BOOST_TEST(attr == "x");
- }
-
- { // error handling
-
- using namespace boost::spirit::ascii;
- using boost::phoenix::construct;
- using boost::phoenix::bind;
-
- rule<char const*> r;
- r = '(' > int_ > ',' > int_ > ')';
-
- on_error<fail>
- (
- r, std::cout
- << phx::val("Error! Expecting: ")
- << _4
- << phx::val(", got: \"")
- << construct<std::string>(_3, _2)
- << phx::val("\"")
- << std::endl
- );
-
- BOOST_TEST(test("(123,456)", r));
- BOOST_TEST(!test("(abc,def)", r));
- BOOST_TEST(!test("(123,456]", r));
- BOOST_TEST(!test("(123;456)", r));
- BOOST_TEST(!test("[123,456]", r));
- }
-
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("french")
-#endif
- { // specifying the encoding
-
- typedef boost::spirit::char_encoding::iso8859_1 iso8859_1;
- rule<char const*, iso8859_1> r;
-
- r = no_case['á'];
- BOOST_TEST(test("Á", r));
- r = no_case[char_('á')];
- BOOST_TEST(test("Á", r));
-
- r = no_case[char_("å-ï")];
- BOOST_TEST(test("É", r));
- BOOST_TEST(!test("ÿ", r));
-
- r = no_case["áÁ"];
- BOOST_TEST(test("Áá", r));
- r = no_case[lit("áÁ")];
- BOOST_TEST(test("Áá", r));
- }
-
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
-#pragma setlocale("")
-#endif
-
- {
- typedef boost::variant<double, int> v_type;
- rule<const char*, v_type()> r1 = int_;
- v_type v;
- BOOST_TEST(test_attr("1", r1, v) && v.which() == 1 &&
- boost::get<int>(v) == 1);
-
- typedef boost::optional<int> ov_type;
- rule<const char*, ov_type()> r2 = int_;
- ov_type ov;
- BOOST_TEST(test_attr("1", r2, ov) && ov && boost::get<int>(ov) == 1);
- }
-
- // test handling of single element fusion sequences
- {
- using boost::fusion::vector;
- using boost::fusion::at_c;
- rule<const char*, vector<int>()> r = int_;
-
- vector<int> v(0);
- BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
- }
-
- {
- using boost::fusion::vector;
- using boost::fusion::at_c;
- rule<const char*, vector<unsigned int>()> r = uint_;
-
- vector<unsigned int> v(0);
- BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/qi/rule2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/rule2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,162 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+
+// this file deliberately contains non-ascii characters
+// boostinspect:noascii
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include <string>
+#include <cstring>
+#include <iostream>
+#include "test.hpp"
+
+int
+main()
+{
+ using spirit_test::test_attr;
+ using spirit_test::test;
+
+ using namespace boost::spirit::ascii;
+ using namespace boost::spirit::qi::labels;
+ using boost::spirit::qi::locals;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::int_;
+ using boost::spirit::qi::uint_;
+ using boost::spirit::qi::fail;
+ using boost::spirit::qi::on_error;
+ using boost::spirit::qi::debug;
+ using boost::spirit::qi::lit;
+
+ namespace phx = boost::phoenix;
+
+ { // test unassigned rule
+
+ rule<char const*> a;
+ BOOST_TEST(!test("x", a));
+ }
+
+ { // alias tests
+
+ rule<char const*> a, b, c, d, start;
+
+ a = 'a';
+ b = 'b';
+ c = 'c';
+ d = start.alias(); // d will always track start
+
+ start = *(a | b | c);
+ BOOST_TEST(test("abcabcacb", d));
+
+ start = (a | b) >> (start | b);
+ BOOST_TEST(test("aaaabababaaabbb", d));
+ }
+
+ { // copy tests
+
+ rule<char const*> a, b, c, start;
+
+ a = 'a';
+ b = 'b';
+ c = 'c';
+
+ // The FF is the dynamic equivalent of start = *(a | b | c);
+ start = a;
+ start = start.copy() | b;
+ start = start.copy() | c;
+ start = *(start.copy());
+
+ BOOST_TEST(test("abcabcacb", start));
+
+ // The FF is the dynamic equivalent of start = (a | b) >> (start | b);
+ start = b;
+ start = a | start.copy();
+ start = start.copy() >> (start | b);
+
+ BOOST_TEST(test("aaaabababaaabbb", start));
+ BOOST_TEST(test("aaaabababaaabba", start, false));
+ }
+
+ { // context tests
+
+ char ch;
+ rule<char const*, char()> a;
+ a = alpha[_val = _1];
+
+ BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
+ BOOST_TEST(ch == 'x');
+
+ BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+ BOOST_TEST(ch == 'z');
+ }
+
+ { // auto rules tests
+
+ char ch = '\0';
+ rule<char const*, char()> a;
+ a %= alpha;
+
+ BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
+ BOOST_TEST(ch == 'x');
+ ch = '\0';
+ BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+ BOOST_TEST(ch == 'z');
+
+ a = alpha; // test deduced auto rule behavior
+ ch = '\0';
+ BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
+ BOOST_TEST(ch == 'x');
+ ch = '\0';
+ BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+ BOOST_TEST(ch == 'z');
+ }
+
+ { // auto rules tests: allow stl containers as attributes to
+ // sequences (in cases where attributes of the elements
+ // are convertible to the value_type of the container or if
+ // the element itself is an stl container with value_type
+ // that is convertible to the value_type of the attribute).
+
+ std::string s;
+ rule<char const*, std::string()> r;
+ r %= char_ >> *(',' >> char_);
+
+ BOOST_TEST(test("a,b,c,d,e,f", r[phx::ref(s) = _1]));
+ BOOST_TEST(s == "abcdef");
+
+ r = char_ >> *(',' >> char_); // test deduced auto rule behavior
+ s.clear();
+ BOOST_TEST(test("a,b,c,d,e,f", r[phx::ref(s) = _1]));
+ BOOST_TEST(s == "abcdef");
+
+ r %= char_ >> char_ >> char_ >> char_ >> char_ >> char_;
+ s.clear();
+ BOOST_TEST(test("abcdef", r[phx::ref(s) = _1]));
+ BOOST_TEST(s == "abcdef");
+
+ r = char_ >> char_ >> char_ >> char_ >> char_ >> char_;
+ s.clear();
+ BOOST_TEST(test("abcdef", r[phx::ref(s) = _1]));
+ BOOST_TEST(s == "abcdef");
+ }
+
+ return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/qi/rule3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/rule3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,148 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+
+// this file deliberately contains non-ascii characters
+// boostinspect:noascii
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include <string>
+#include <cstring>
+#include <iostream>
+#include "test.hpp"
+
+int
+main()
+{
+ using spirit_test::test_attr;
+ using spirit_test::test;
+
+ using namespace boost::spirit::ascii;
+ using namespace boost::spirit::qi::labels;
+ using boost::spirit::qi::locals;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::int_;
+ using boost::spirit::qi::uint_;
+ using boost::spirit::qi::fail;
+ using boost::spirit::qi::on_error;
+ using boost::spirit::qi::debug;
+ using boost::spirit::qi::lit;
+
+ namespace phx = boost::phoenix;
+
+ { // synth attribute value-init
+
+ std::string s;
+ rule<char const*, char()> r;
+ r = alpha[_val += _1];
+ BOOST_TEST(test_attr("abcdef", +r, s));
+ BOOST_TEST(s == "abcdef");
+ }
+
+ { // auto rules aliasing tests
+
+ char ch = '\0';
+ rule<char const*, char()> a, b;
+ a %= b;
+ b %= alpha;
+
+ BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
+ BOOST_TEST(ch == 'x');
+ ch = '\0';
+ BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+ BOOST_TEST(ch == 'z');
+
+ a = b; // test deduced auto rule behavior
+ b = alpha;
+
+ ch = '\0';
+ BOOST_TEST(test("x", a[phx::ref(ch) = _1]));
+ BOOST_TEST(ch == 'x');
+ ch = '\0';
+ BOOST_TEST(test_attr("z", a, ch)); // attribute is given.
+ BOOST_TEST(ch == 'z');
+ }
+
+ { // context (w/arg) tests
+
+ char ch;
+ rule<char const*, char(int)> a; // 1 arg
+ a = alpha[_val = _1 + _r1];
+
+ BOOST_TEST(test("x", a(phx::val(1))[phx::ref(ch) = _1]));
+ BOOST_TEST(ch == 'x' + 1);
+
+ BOOST_TEST(test_attr("a", a(1), ch)); // allow scalars as rule args too.
+ BOOST_TEST(ch == 'a' + 1);
+
+ rule<char const*, char(int, int)> b; // 2 args
+ b = alpha[_val = _1 + _r1 + _r2];
+ BOOST_TEST(test_attr("a", b(1, 2), ch));
+ BOOST_TEST(ch == 'a' + 1 + 2);
+ }
+
+ { // context (w/ reference arg) tests
+
+ char ch;
+ rule<char const*, void(char&)> a; // 1 arg (reference)
+ a = alpha[_r1 = _1];
+
+ BOOST_TEST(test("x", a(phx::ref(ch))));
+ BOOST_TEST(ch == 'x');
+ }
+
+ { // context (w/locals) tests
+
+ rule<char const*, locals<char> > a; // 1 local
+ a = alpha[_a = _1] >> char_(_a);
+ BOOST_TEST(test("aa", a));
+ BOOST_TEST(!test("ax", a));
+ }
+
+ { // context (w/args and locals) tests
+
+ rule<char const*, void(int), locals<char> > a; // 1 arg + 1 local
+ a = alpha[_a = _1 + _r1] >> char_(_a);
+ BOOST_TEST(test("ab", a(phx::val(1))));
+ BOOST_TEST(test("xy", a(phx::val(1))));
+ BOOST_TEST(!test("ax", a(phx::val(1))));
+ }
+
+ { // void() has unused type (void == unused_type)
+
+ std::pair<int, char> attr;
+ rule<char const*, void()> r;
+ r = char_;
+ BOOST_TEST(test_attr("123ax", int_ >> char_ >> r, attr));
+ BOOST_TEST(attr.first == 123);
+ BOOST_TEST(attr.second == 'a');
+ }
+
+ { // bug: test that injected attributes are ok
+
+ rule<char const*, char(int) > r;
+
+ // problem code:
+ r = char_(_r1)[_val = _1];
+ }
+
+ return boost::report_errors();
+}
+
Added: trunk/libs/spirit/test/qi/rule4.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/rule4.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,171 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+
+// this file deliberately contains non-ascii characters
+// boostinspect:noascii
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_numeric.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+#include <string>
+#include <cstring>
+#include <iostream>
+#include "test.hpp"
+
+int
+main()
+{
+ using spirit_test::test_attr;
+ using spirit_test::test;
+
+ using namespace boost::spirit::ascii;
+ using namespace boost::spirit::qi::labels;
+ using boost::spirit::qi::locals;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::int_;
+ using boost::spirit::qi::uint_;
+ using boost::spirit::qi::fail;
+ using boost::spirit::qi::on_error;
+ using boost::spirit::qi::debug;
+ using boost::spirit::qi::lit;
+
+ namespace phx = boost::phoenix;
+
+
+ { // show that ra = rb and ra %= rb works as expected
+ rule<char const*, int() > ra, rb;
+ int attr;
+
+ ra %= int_;
+ BOOST_TEST(test_attr("123", ra, attr));
+ BOOST_TEST(attr == 123);
+
+ rb %= ra;
+ BOOST_TEST(test_attr("123", rb, attr));
+ BOOST_TEST(attr == 123);
+
+ rb = ra;
+ BOOST_TEST(test_attr("123", rb, attr));
+ BOOST_TEST(attr == 123);
+ }
+
+ { // std::string as container attribute with auto rules
+
+ rule<char const*, std::string()> text;
+ text %= +(!char_(')') >> !char_('>') >> char_);
+ std::string attr;
+ BOOST_TEST(test_attr("x", text, attr));
+ BOOST_TEST(attr == "x");
+
+ // test deduced auto rule behavior
+ text = +(!char_(')') >> !char_('>') >> char_);
+ attr.clear();
+ BOOST_TEST(test_attr("x", text, attr));
+ BOOST_TEST(attr == "x");
+ }
+
+ { // error handling
+
+ using namespace boost::spirit::ascii;
+ using boost::phoenix::construct;
+ using boost::phoenix::bind;
+
+ rule<char const*> r;
+ r = '(' > int_ > ',' > int_ > ')';
+
+ on_error<fail>
+ (
+ r, std::cout
+ << phx::val("Error! Expecting: ")
+ << _4
+ << phx::val(", got: \"")
+ << construct<std::string>(_3, _2)
+ << phx::val("\"")
+ << std::endl
+ );
+
+ BOOST_TEST(test("(123,456)", r));
+ BOOST_TEST(!test("(abc,def)", r));
+ BOOST_TEST(!test("(123,456]", r));
+ BOOST_TEST(!test("(123;456)", r));
+ BOOST_TEST(!test("[123,456]", r));
+ }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+#pragma setlocale("french")
+#endif
+ { // specifying the encoding
+
+ typedef boost::spirit::char_encoding::iso8859_1 iso8859_1;
+ rule<char const*, iso8859_1> r;
+
+ r = no_case['á'];
+ BOOST_TEST(test("Á", r));
+ r = no_case[char_('á')];
+ BOOST_TEST(test("Á", r));
+
+ r = no_case[char_("å-ï")];
+ BOOST_TEST(test("É", r));
+ BOOST_TEST(!test("ÿ", r));
+
+ r = no_case["áÁ"];
+ BOOST_TEST(test("Áá", r));
+ r = no_case[lit("áÁ")];
+ BOOST_TEST(test("Áá", r));
+ }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+#pragma setlocale("")
+#endif
+
+ {
+ typedef boost::variant<double, int> v_type;
+ rule<const char*, v_type()> r1 = int_;
+ v_type v;
+ BOOST_TEST(test_attr("1", r1, v) && v.which() == 1 &&
+ boost::get<int>(v) == 1);
+
+ typedef boost::optional<int> ov_type;
+ rule<const char*, ov_type()> r2 = int_;
+ ov_type ov;
+ BOOST_TEST(test_attr("1", r2, ov) && ov && boost::get<int>(ov) == 1);
+ }
+
+ // test handling of single element fusion sequences
+ {
+ using boost::fusion::vector;
+ using boost::fusion::at_c;
+ rule<const char*, vector<int>()> r = int_;
+
+ vector<int> v(0);
+ BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
+ }
+
+ {
+ using boost::fusion::vector;
+ using boost::fusion::at_c;
+ rule<const char*, vector<unsigned int>()> r = uint_;
+
+ vector<unsigned int> v(0);
+ BOOST_TEST(test_attr("1", r, v) && at_c<0>(v) == 1);
+ }
+
+ return boost::report_errors();
+}
+
Deleted: trunk/libs/spirit/test/qi/single_element_sequence_attribute.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/single_element_sequence_attribute.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,40 +0,0 @@
-// Copyright (c) 2010 Josh Wilson
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/spirit/include/qi.hpp>
-#include <boost/fusion/include/adapt_struct.hpp>
-#include <boost/variant.hpp>
-#include <string>
-
-namespace qi = boost::spirit::qi;
-
-///////////////////////////////////////////////////////////////////////////////
-struct Number { float base; };
-
-BOOST_FUSION_ADAPT_STRUCT( Number, (float, base) )
-
-void instantiate1()
-{
- qi::symbols<char, Number> sym;
- qi::rule<std::string::const_iterator, Number()> rule;
- rule %= sym; // Caused compiler error after getting r61322
-}
-
-///////////////////////////////////////////////////////////////////////////////
-typedef boost::variant<int, float> internal_type;
-
-struct Number2 { internal_type base; };
-
-BOOST_FUSION_ADAPT_STRUCT( Number2, (internal_type, base) )
-
-void instantiate2()
-{
- qi::symbols<char, Number2> sym;
- qi::rule<std::string::const_iterator, Number2()> rule;
- rule %= sym; // Caused compiler error after getting r61322
-}
-
Deleted: trunk/libs/spirit/test/qi/symbols.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/symbols.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,364 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Joel de Guzman
-
- Distributed under 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)
-=============================================================================*/
-#include <boost/detail/lightweight_test.hpp>
-#include <boost/spirit/include/qi_string.hpp>
-#include <boost/spirit/include/qi_char.hpp>
-#include <boost/spirit/include/qi_action.hpp>
-#include <boost/spirit/include/qi_auxiliary.hpp>
-#include <boost/spirit/include/qi_directive.hpp>
-#include <boost/spirit/include/qi_operator.hpp>
-#include <boost/spirit/include/qi_nonterminal.hpp>
-#include <boost/spirit/include/support_argument.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-
-#include <iostream>
-#include "test.hpp"
-
-// Custom string type with a C-style string conversion.
-struct custom_string_c
-{
- custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
-
- operator char*() { return str; }
- operator char const*() const { return str; }
-
-private:
- char str[2];
-};
-
-int
-main()
-{
- using spirit_test::test;
- using spirit_test::test_attr;
- using boost::spirit::qi::symbols;
- using boost::spirit::qi::rule;
- using boost::spirit::qi::lazy;
- using boost::spirit::qi::_r1;
-
- { // basics
- symbols<char, int> sym;
-
- sym.add
- ("Joel")
- ("Ruby")
- ("Tenji")
- ("Tutit")
- ("Kim")
- ("Joey")
- ;
-
- boost::mpl::true_ f = boost::mpl::bool_<boost::spirit::traits::is_parser<symbols<char, int> >::value>();
-
- // silence stupid compiler warnings
- // i.e. MSVC warning C4189: 'f' : local variable is initialized but not referenced
- BOOST_TEST((f.value));
-
- BOOST_TEST((test("Joel", sym)));
- BOOST_TEST((test("Ruby", sym)));
- BOOST_TEST((test("Tenji", sym)));
- BOOST_TEST((test("Tutit", sym)));
- BOOST_TEST((test("Kim", sym)));
- BOOST_TEST((test("Joey", sym)));
- BOOST_TEST((!test("XXX", sym)));
-
- // test copy
- symbols<char, int> sym2;
- sym2 = sym;
- BOOST_TEST((test("Joel", sym2)));
- BOOST_TEST((test("Ruby", sym2)));
- BOOST_TEST((test("Tenji", sym2)));
- BOOST_TEST((test("Tutit", sym2)));
- BOOST_TEST((test("Kim", sym2)));
- BOOST_TEST((test("Joey", sym2)));
- BOOST_TEST((!test("XXX", sym2)));
-
- // make sure it plays well with other parsers
- BOOST_TEST((test("Joelyo", sym >> "yo")));
-
- sym.remove
- ("Joel")
- ("Ruby")
- ;
-
- BOOST_TEST((!test("Joel", sym)));
- BOOST_TEST((!test("Ruby", sym)));
- }
-
- { // comma syntax
- symbols<char, int> sym;
- sym += "Joel", "Ruby", "Tenji", "Tutit", "Kim", "Joey";
-
- BOOST_TEST((test("Joel", sym)));
- BOOST_TEST((test("Ruby", sym)));
- BOOST_TEST((test("Tenji", sym)));
- BOOST_TEST((test("Tutit", sym)));
- BOOST_TEST((test("Kim", sym)));
- BOOST_TEST((test("Joey", sym)));
- BOOST_TEST((!test("XXX", sym)));
-
- sym -= "Joel", "Ruby";
-
- BOOST_TEST((!test("Joel", sym)));
- BOOST_TEST((!test("Ruby", sym)));
- }
-
- { // no-case handling
- using namespace boost::spirit::ascii;
-
- symbols<char, int> sym;
- // NOTE: make sure all entries are in lower-case!!!
- sym = "joel", "ruby", "tenji", "tutit", "kim", "joey";
-
- BOOST_TEST((test("joel", no_case[sym])));
- BOOST_TEST((test("ruby", no_case[sym])));
- BOOST_TEST((test("tenji", no_case[sym])));
- BOOST_TEST((test("tutit", no_case[sym])));
- BOOST_TEST((test("kim", no_case[sym])));
- BOOST_TEST((test("joey", no_case[sym])));
-
- BOOST_TEST((test("JOEL", no_case[sym])));
- BOOST_TEST((test("RUBY", no_case[sym])));
- BOOST_TEST((test("TENJI", no_case[sym])));
- BOOST_TEST((test("TUTIT", no_case[sym])));
- BOOST_TEST((test("KIM", no_case[sym])));
- BOOST_TEST((test("JOEY", no_case[sym])));
-
- // make sure it plays well with other parsers
- BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
- }
-
- { // attributes
- symbols<char, int> sym;
-
- sym.add
- ("Joel", 1)
- ("Ruby", 2)
- ("Tenji", 3)
- ("Tutit", 4)
- ("Kim", 5)
- ("Joey", 6)
- ;
-
- int i;
- BOOST_TEST((test_attr("Joel", sym, i)));
- BOOST_TEST(i == 1);
- BOOST_TEST((test_attr("Ruby", sym, i)));
- BOOST_TEST(i == 2);
- BOOST_TEST((test_attr("Tenji", sym, i)));
- BOOST_TEST(i == 3);
- BOOST_TEST((test_attr("Tutit", sym, i)));
- BOOST_TEST(i == 4);
- BOOST_TEST((test_attr("Kim", sym, i)));
- BOOST_TEST(i == 5);
- BOOST_TEST((test_attr("Joey", sym, i)));
- BOOST_TEST(i == 6);
- BOOST_TEST((!test_attr("XXX", sym, i)));
-
- // double add:
-
- sym.add("Joel", 265);
- BOOST_TEST((test_attr("Joel", sym, i)));
- BOOST_TEST(i == 1);
- }
-
- { // actions
- namespace phx = boost::phoenix;
- using boost::spirit::_1;
-
- symbols<char, int> sym;
- sym.add
- ("Joel", 1)
- ("Ruby", 2)
- ("Tenji", 3)
- ("Tutit", 4)
- ("Kim", 5)
- ("Joey", 6)
- ;
-
- int i;
- BOOST_TEST((test("Joel", sym[phx::ref(i) = _1])));
- BOOST_TEST(i == 1);
- BOOST_TEST((test("Ruby", sym[phx::ref(i) = _1])));
- BOOST_TEST(i == 2);
- BOOST_TEST((test("Tenji", sym[phx::ref(i) = _1])));
- BOOST_TEST(i == 3);
- BOOST_TEST((test("Tutit", sym[phx::ref(i) = _1])));
- BOOST_TEST(i == 4);
- BOOST_TEST((test("Kim", sym[phx::ref(i) = _1])));
- BOOST_TEST(i == 5);
- BOOST_TEST((test("Joey", sym[phx::ref(i) = _1])));
- BOOST_TEST(i == 6);
- BOOST_TEST((!test("XXX", sym[phx::ref(i) = _1])));
- }
-
- { // construction from symbol array
- char const* syms[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
- symbols<char, int> sym(syms);
-
- BOOST_TEST((test("Joel", sym)));
- BOOST_TEST((test("Ruby", sym)));
- BOOST_TEST((test("Tenji", sym)));
- BOOST_TEST((test("Tutit", sym)));
- BOOST_TEST((test("Kim", sym)));
- BOOST_TEST((test("Joey", sym)));
- BOOST_TEST((!test("XXX", sym)));
- }
-
- { // construction from 2 arrays
-
- char const* syms[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
- int data[] = {1,2,3,4,5,6};
- symbols<char, int> sym(syms, data);
-
- int i;
- BOOST_TEST((test_attr("Joel", sym, i)));
- BOOST_TEST(i == 1);
- BOOST_TEST((test_attr("Ruby", sym, i)));
- BOOST_TEST(i == 2);
- BOOST_TEST((test_attr("Tenji", sym, i)));
- BOOST_TEST(i == 3);
- BOOST_TEST((test_attr("Tutit", sym, i)));
- BOOST_TEST(i == 4);
- BOOST_TEST((test_attr("Kim", sym, i)));
- BOOST_TEST(i == 5);
- BOOST_TEST((test_attr("Joey", sym, i)));
- BOOST_TEST(i == 6);
- BOOST_TEST((!test_attr("XXX", sym, i)));
- }
-
- { // allow std::string and other string types
- symbols<> sym;
-
- // const and non-const std::string
- std::string a("abc");
- std::string const b("def");
- sym += a;
- sym += b;
- BOOST_TEST((test("abc", sym)));
- BOOST_TEST((test("def", sym)));
- sym = a;
- BOOST_TEST((test("abc", sym)));
- BOOST_TEST((!test("def", sym)));
-
- // non-const C-style string
- char arr[2]; arr[0] = 'a'; arr[1] = '\0';
- sym = arr;
- BOOST_TEST((test("a", sym)));
- BOOST_TEST((!test("b", sym)));
-
- // const and non-const custom string type
- custom_string_c c('x');
- custom_string_c const cc('y');
- sym = c, cc;
- BOOST_TEST((test("x", sym)));
- BOOST_TEST((test("y", sym)));
- BOOST_TEST((!test("z", sym)));
- }
-
- {
- namespace phx = boost::phoenix;
-
- symbols<char, int> sym;
- sym.add
- ("a", 1)
- ("b", 2)
- ;
-
- rule<char const*, int(symbols<char, int>&)> r;
- r %= lazy(_r1);
-
- int i = 0;
- BOOST_TEST(test_attr("a", r(phx::ref(sym)), i));
- BOOST_TEST(i == 1);
- BOOST_TEST(test_attr("b", r(phx::ref(sym)), i));
- BOOST_TEST(i == 2);
- BOOST_TEST(!test("c", r(phx::ref(sym))));
- }
-
- { // find
-
- symbols<char, int> sym;
- sym.add("a", 1)("b", 2);
-
- BOOST_TEST(!sym.find("c"));
-
- BOOST_TEST(sym.find("a") && *sym.find("a") == 1);
- BOOST_TEST(sym.find("b") && *sym.find("b") == 2);
-
- BOOST_TEST(sym.at("a") == 1);
- BOOST_TEST(sym.at("b") == 2);
- BOOST_TEST(sym.at("c") == 0);
-
- BOOST_TEST(sym.find("a") && *sym.find("a") == 1);
- BOOST_TEST(sym.find("b") && *sym.find("b") == 2);
- BOOST_TEST(sym.find("c") && *sym.find("c") == 0);
-
- symbols<char, int> const_sym(sym);
-
- BOOST_TEST(const_sym.find("a") && *const_sym.find("a") == 1);
- BOOST_TEST(const_sym.find("b") && *const_sym.find("b") == 2);
- BOOST_TEST(const_sym.find("c") && *const_sym.find("c") == 0);
- BOOST_TEST(!const_sym.find("d"));
-
- char const *str1 = "all";
- char const *first = str1, *last = str1 + 3;
- BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str1 + 1);
-
- char const *str2 = "dart";
- first = str2; last = str2 + 4;
- BOOST_TEST(!sym.prefix_find(first, last) && first == str2);
- }
-
- { // Substrings
-
- symbols<char, int> sym;
- BOOST_TEST(sym.at("foo") == 0);
- sym.at("foo") = 1;
- BOOST_TEST(sym.at("foo") == 1);
- BOOST_TEST(sym.at("fool") == 0);
- sym.at("fool") = 2;
- BOOST_TEST(sym.find("foo") && *sym.find("foo") == 1);
- BOOST_TEST(sym.find("fool") && *sym.find("fool") == 2);
- BOOST_TEST(!sym.find("foolish"));
- BOOST_TEST(!sym.find("foot"));
- BOOST_TEST(!sym.find("afoot"));
-
- char const *str, *first, *last;
- str = "foolish"; first = str; last = str + 7;
- BOOST_TEST(*sym.prefix_find(first, last) == 2 && first == str + 4);
-
- first = str; last = str + 4;
- BOOST_TEST(*sym.prefix_find(first, last) == 2 && first == str + 4);
-
- str = "food"; first = str; last = str + 4;
- BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str + 3);
-
- first = str; last = str + 3;
- BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str + 3);
-
- first = str; last = str + 2;
- BOOST_TEST(!sym.prefix_find(first, last) && first == str);
- }
-
- {
- // remove bug
-
- std::string s;
- symbols<char, double> vars;
-
- vars.add("l1", 12.0);
- vars.add("l2", 0.0);
- vars.remove("l2");
- vars.find("l1");
- double* d = vars.find("l1");
- BOOST_TEST(d != 0);
- }
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/qi/symbols1.cpp (from r67483, /trunk/libs/spirit/test/qi/symbols.cpp)
==============================================================================
--- /trunk/libs/spirit/test/qi/symbols.cpp (original)
+++ trunk/libs/spirit/test/qi/symbols1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -197,168 +197,5 @@
BOOST_TEST((!test("XXX", sym[phx::ref(i) = _1])));
}
- { // construction from symbol array
- char const* syms[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
- symbols<char, int> sym(syms);
-
- BOOST_TEST((test("Joel", sym)));
- BOOST_TEST((test("Ruby", sym)));
- BOOST_TEST((test("Tenji", sym)));
- BOOST_TEST((test("Tutit", sym)));
- BOOST_TEST((test("Kim", sym)));
- BOOST_TEST((test("Joey", sym)));
- BOOST_TEST((!test("XXX", sym)));
- }
-
- { // construction from 2 arrays
-
- char const* syms[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
- int data[] = {1,2,3,4,5,6};
- symbols<char, int> sym(syms, data);
-
- int i;
- BOOST_TEST((test_attr("Joel", sym, i)));
- BOOST_TEST(i == 1);
- BOOST_TEST((test_attr("Ruby", sym, i)));
- BOOST_TEST(i == 2);
- BOOST_TEST((test_attr("Tenji", sym, i)));
- BOOST_TEST(i == 3);
- BOOST_TEST((test_attr("Tutit", sym, i)));
- BOOST_TEST(i == 4);
- BOOST_TEST((test_attr("Kim", sym, i)));
- BOOST_TEST(i == 5);
- BOOST_TEST((test_attr("Joey", sym, i)));
- BOOST_TEST(i == 6);
- BOOST_TEST((!test_attr("XXX", sym, i)));
- }
-
- { // allow std::string and other string types
- symbols<> sym;
-
- // const and non-const std::string
- std::string a("abc");
- std::string const b("def");
- sym += a;
- sym += b;
- BOOST_TEST((test("abc", sym)));
- BOOST_TEST((test("def", sym)));
- sym = a;
- BOOST_TEST((test("abc", sym)));
- BOOST_TEST((!test("def", sym)));
-
- // non-const C-style string
- char arr[2]; arr[0] = 'a'; arr[1] = '\0';
- sym = arr;
- BOOST_TEST((test("a", sym)));
- BOOST_TEST((!test("b", sym)));
-
- // const and non-const custom string type
- custom_string_c c('x');
- custom_string_c const cc('y');
- sym = c, cc;
- BOOST_TEST((test("x", sym)));
- BOOST_TEST((test("y", sym)));
- BOOST_TEST((!test("z", sym)));
- }
-
- {
- namespace phx = boost::phoenix;
-
- symbols<char, int> sym;
- sym.add
- ("a", 1)
- ("b", 2)
- ;
-
- rule<char const*, int(symbols<char, int>&)> r;
- r %= lazy(_r1);
-
- int i = 0;
- BOOST_TEST(test_attr("a", r(phx::ref(sym)), i));
- BOOST_TEST(i == 1);
- BOOST_TEST(test_attr("b", r(phx::ref(sym)), i));
- BOOST_TEST(i == 2);
- BOOST_TEST(!test("c", r(phx::ref(sym))));
- }
-
- { // find
-
- symbols<char, int> sym;
- sym.add("a", 1)("b", 2);
-
- BOOST_TEST(!sym.find("c"));
-
- BOOST_TEST(sym.find("a") && *sym.find("a") == 1);
- BOOST_TEST(sym.find("b") && *sym.find("b") == 2);
-
- BOOST_TEST(sym.at("a") == 1);
- BOOST_TEST(sym.at("b") == 2);
- BOOST_TEST(sym.at("c") == 0);
-
- BOOST_TEST(sym.find("a") && *sym.find("a") == 1);
- BOOST_TEST(sym.find("b") && *sym.find("b") == 2);
- BOOST_TEST(sym.find("c") && *sym.find("c") == 0);
-
- symbols<char, int> const_sym(sym);
-
- BOOST_TEST(const_sym.find("a") && *const_sym.find("a") == 1);
- BOOST_TEST(const_sym.find("b") && *const_sym.find("b") == 2);
- BOOST_TEST(const_sym.find("c") && *const_sym.find("c") == 0);
- BOOST_TEST(!const_sym.find("d"));
-
- char const *str1 = "all";
- char const *first = str1, *last = str1 + 3;
- BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str1 + 1);
-
- char const *str2 = "dart";
- first = str2; last = str2 + 4;
- BOOST_TEST(!sym.prefix_find(first, last) && first == str2);
- }
-
- { // Substrings
-
- symbols<char, int> sym;
- BOOST_TEST(sym.at("foo") == 0);
- sym.at("foo") = 1;
- BOOST_TEST(sym.at("foo") == 1);
- BOOST_TEST(sym.at("fool") == 0);
- sym.at("fool") = 2;
- BOOST_TEST(sym.find("foo") && *sym.find("foo") == 1);
- BOOST_TEST(sym.find("fool") && *sym.find("fool") == 2);
- BOOST_TEST(!sym.find("foolish"));
- BOOST_TEST(!sym.find("foot"));
- BOOST_TEST(!sym.find("afoot"));
-
- char const *str, *first, *last;
- str = "foolish"; first = str; last = str + 7;
- BOOST_TEST(*sym.prefix_find(first, last) == 2 && first == str + 4);
-
- first = str; last = str + 4;
- BOOST_TEST(*sym.prefix_find(first, last) == 2 && first == str + 4);
-
- str = "food"; first = str; last = str + 4;
- BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str + 3);
-
- first = str; last = str + 3;
- BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str + 3);
-
- first = str; last = str + 2;
- BOOST_TEST(!sym.prefix_find(first, last) && first == str);
- }
-
- {
- // remove bug
-
- std::string s;
- symbols<char, double> vars;
-
- vars.add("l1", 12.0);
- vars.add("l2", 0.0);
- vars.remove("l2");
- vars.find("l1");
- double* d = vars.find("l1");
- BOOST_TEST(d != 0);
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/qi/symbols2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/symbols2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,208 @@
+/*=============================================================================
+ Copyright (c) 2001-2010 Joel de Guzman
+
+ Distributed under 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)
+=============================================================================*/
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/include/qi_string.hpp>
+#include <boost/spirit/include/qi_char.hpp>
+#include <boost/spirit/include/qi_action.hpp>
+#include <boost/spirit/include/qi_auxiliary.hpp>
+#include <boost/spirit/include/qi_directive.hpp>
+#include <boost/spirit/include/qi_operator.hpp>
+#include <boost/spirit/include/qi_nonterminal.hpp>
+#include <boost/spirit/include/support_argument.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include <iostream>
+#include "test.hpp"
+
+// Custom string type with a C-style string conversion.
+struct custom_string_c
+{
+ custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
+
+ operator char*() { return str; }
+ operator char const*() const { return str; }
+
+private:
+ char str[2];
+};
+
+int
+main()
+{
+ using spirit_test::test;
+ using spirit_test::test_attr;
+ using boost::spirit::qi::symbols;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::lazy;
+ using boost::spirit::qi::_r1;
+
+ { // construction from symbol array
+ char const* syms[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
+ symbols<char, int> sym(syms);
+
+ BOOST_TEST((test("Joel", sym)));
+ BOOST_TEST((test("Ruby", sym)));
+ BOOST_TEST((test("Tenji", sym)));
+ BOOST_TEST((test("Tutit", sym)));
+ BOOST_TEST((test("Kim", sym)));
+ BOOST_TEST((test("Joey", sym)));
+ BOOST_TEST((!test("XXX", sym)));
+ }
+
+ { // construction from 2 arrays
+
+ char const* syms[] = {"Joel","Ruby","Tenji","Tutit","Kim","Joey"};
+ int data[] = {1,2,3,4,5,6};
+ symbols<char, int> sym(syms, data);
+
+ int i;
+ BOOST_TEST((test_attr("Joel", sym, i)));
+ BOOST_TEST(i == 1);
+ BOOST_TEST((test_attr("Ruby", sym, i)));
+ BOOST_TEST(i == 2);
+ BOOST_TEST((test_attr("Tenji", sym, i)));
+ BOOST_TEST(i == 3);
+ BOOST_TEST((test_attr("Tutit", sym, i)));
+ BOOST_TEST(i == 4);
+ BOOST_TEST((test_attr("Kim", sym, i)));
+ BOOST_TEST(i == 5);
+ BOOST_TEST((test_attr("Joey", sym, i)));
+ BOOST_TEST(i == 6);
+ BOOST_TEST((!test_attr("XXX", sym, i)));
+ }
+
+ { // allow std::string and other string types
+ symbols<> sym;
+
+ // const and non-const std::string
+ std::string a("abc");
+ std::string const b("def");
+ sym += a;
+ sym += b;
+ BOOST_TEST((test("abc", sym)));
+ BOOST_TEST((test("def", sym)));
+ sym = a;
+ BOOST_TEST((test("abc", sym)));
+ BOOST_TEST((!test("def", sym)));
+
+ // non-const C-style string
+ char arr[2]; arr[0] = 'a'; arr[1] = '\0';
+ sym = arr;
+ BOOST_TEST((test("a", sym)));
+ BOOST_TEST((!test("b", sym)));
+
+ // const and non-const custom string type
+ custom_string_c c('x');
+ custom_string_c const cc('y');
+ sym = c, cc;
+ BOOST_TEST((test("x", sym)));
+ BOOST_TEST((test("y", sym)));
+ BOOST_TEST((!test("z", sym)));
+ }
+
+ {
+ namespace phx = boost::phoenix;
+
+ symbols<char, int> sym;
+ sym.add
+ ("a", 1)
+ ("b", 2)
+ ;
+
+ rule<char const*, int(symbols<char, int>&)> r;
+ r %= lazy(_r1);
+
+ int i = 0;
+ BOOST_TEST(test_attr("a", r(phx::ref(sym)), i));
+ BOOST_TEST(i == 1);
+ BOOST_TEST(test_attr("b", r(phx::ref(sym)), i));
+ BOOST_TEST(i == 2);
+ BOOST_TEST(!test("c", r(phx::ref(sym))));
+ }
+
+ { // find
+
+ symbols<char, int> sym;
+ sym.add("a", 1)("b", 2);
+
+ BOOST_TEST(!sym.find("c"));
+
+ BOOST_TEST(sym.find("a") && *sym.find("a") == 1);
+ BOOST_TEST(sym.find("b") && *sym.find("b") == 2);
+
+ BOOST_TEST(sym.at("a") == 1);
+ BOOST_TEST(sym.at("b") == 2);
+ BOOST_TEST(sym.at("c") == 0);
+
+ BOOST_TEST(sym.find("a") && *sym.find("a") == 1);
+ BOOST_TEST(sym.find("b") && *sym.find("b") == 2);
+ BOOST_TEST(sym.find("c") && *sym.find("c") == 0);
+
+ symbols<char, int> const_sym(sym);
+
+ BOOST_TEST(const_sym.find("a") && *const_sym.find("a") == 1);
+ BOOST_TEST(const_sym.find("b") && *const_sym.find("b") == 2);
+ BOOST_TEST(const_sym.find("c") && *const_sym.find("c") == 0);
+ BOOST_TEST(!const_sym.find("d"));
+
+ char const *str1 = "all";
+ char const *first = str1, *last = str1 + 3;
+ BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str1 + 1);
+
+ char const *str2 = "dart";
+ first = str2; last = str2 + 4;
+ BOOST_TEST(!sym.prefix_find(first, last) && first == str2);
+ }
+
+ { // Substrings
+
+ symbols<char, int> sym;
+ BOOST_TEST(sym.at("foo") == 0);
+ sym.at("foo") = 1;
+ BOOST_TEST(sym.at("foo") == 1);
+ BOOST_TEST(sym.at("fool") == 0);
+ sym.at("fool") = 2;
+ BOOST_TEST(sym.find("foo") && *sym.find("foo") == 1);
+ BOOST_TEST(sym.find("fool") && *sym.find("fool") == 2);
+ BOOST_TEST(!sym.find("foolish"));
+ BOOST_TEST(!sym.find("foot"));
+ BOOST_TEST(!sym.find("afoot"));
+
+ char const *str, *first, *last;
+ str = "foolish"; first = str; last = str + 7;
+ BOOST_TEST(*sym.prefix_find(first, last) == 2 && first == str + 4);
+
+ first = str; last = str + 4;
+ BOOST_TEST(*sym.prefix_find(first, last) == 2 && first == str + 4);
+
+ str = "food"; first = str; last = str + 4;
+ BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str + 3);
+
+ first = str; last = str + 3;
+ BOOST_TEST(*sym.prefix_find(first, last) == 1 && first == str + 3);
+
+ first = str; last = str + 2;
+ BOOST_TEST(!sym.prefix_find(first, last) && first == str);
+ }
+
+ {
+ // remove bug
+
+ std::string s;
+ symbols<char, double> vars;
+
+ vars.add("l1", 12.0);
+ vars.add("l2", 0.0);
+ vars.remove("l2");
+ vars.find("l1");
+ double* d = vars.find("l1");
+ BOOST_TEST(d != 0);
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/qi/utree.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/utree.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,402 +0,0 @@
-// Copyright (c) 2001-2010 Hartmut Kaiser
-// Copyright (c) 2001-2010 Joel de Guzman
-// Copyright (c) 2010 Bryce Lelbach
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/support_utree.hpp>
-#include <boost/mpl/print.hpp>
-
-#include <sstream>
-
-#include "test.hpp"
-
-inline bool check(boost::spirit::utree const& val, std::string expected)
-{
- std::stringstream s;
- s << val;
- if (s.str() == expected + " ")
- return true;
-
- std::cerr << "got result: " << s.str()
- << ", expected: " << expected << std::endl;
- return false;
-}
-
-int main()
-{
- using spirit_test::test_attr;
- using boost::spirit::utree;
- using boost::spirit::utree_type;
- using boost::spirit::utf8_string_range_type;
- using boost::spirit::utf8_symbol_type;
- using boost::spirit::utf8_string_type;
-
- using boost::spirit::qi::real_parser;
- using boost::spirit::qi::strict_real_policies;
- using boost::spirit::qi::digit;
- using boost::spirit::qi::char_;
- using boost::spirit::qi::string;
- using boost::spirit::qi::int_;
- using boost::spirit::qi::double_;
- using boost::spirit::qi::space;
- using boost::spirit::qi::space_type;
- using boost::spirit::qi::rule;
- using boost::spirit::qi::as;
- using boost::spirit::qi::lexeme;
-
- // primitive data types
- {
- utree ut;
- BOOST_TEST(test_attr("x", char_, ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"x\""));
- ut.clear();
- BOOST_TEST(test_attr("123", int_, ut) &&
- ut.which() == utree_type::int_type && check(ut, "123"));
- ut.clear();
- BOOST_TEST(test_attr("123.45", double_, ut) &&
- ut.which() == utree_type::double_type && check(ut, "123.45"));
- ut.clear();
-
- rule<char const*, utf8_string_type()> r1 = lexeme[*char_];
-
- BOOST_TEST(test_attr("foo", r1, ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"foo\""));
- ut.clear();
-
- rule<char const*, utf8_symbol_type()> r2 = lexeme[*char_];
-
- BOOST_TEST(test_attr("xyz", r2, ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xyz"));
- }
-
- // single character parsers
- {
- utree ut;
-
- // this rule returns a utree string
- rule<char const*, utree()> r1 = char_("abc");
-
- // this rule forces a utree list to be returned
- rule<char const*, utree::list_type()> r2 = char_("abc");
-
- BOOST_TEST(test_attr("a", r1, ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"a\""));
- ut.clear();
- BOOST_TEST(test_attr("a", r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" )"));
- }
-
- // sequences
- {
- using boost::spirit::qi::as_string;
-
- utree ut;
- BOOST_TEST(test_attr("xy", char_ >> char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("123 456", int_ >> int_, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("1.23 4.56", double_ >> double_, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
- ut.clear();
- BOOST_TEST(test_attr("1.2ab", double_ >> *char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.2 \"a\" \"b\" )"));
- ut.clear();
- BOOST_TEST(test_attr("ab1.2", *~digit >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
-
- // forces a utree list
- rule<char const*, utree::list_type()> r1 = double_;
-
- ut.clear();
- BOOST_TEST(test_attr("1.2ab", r1 >> *char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ( 1.2 ) \"a\" \"b\" )"));
- ut.clear();
- BOOST_TEST(test_attr("ab1.2", *~digit >> r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" ( 1.2 ) )"));
- ut.clear();
-
- // implicitly a utree list, because of sequence attribute rules
- rule<char const*, utree()> r2 = int_ >> char_("!") >> double_;
-
- BOOST_TEST(test_attr("17!3.14", r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 17 \"!\" 3.14 )"));
- ut.clear();
-
- rule<char const*, utree()> r3 = double_ >> as_string[string("foo")] >> int_;
-
- BOOST_TEST(test_attr("0.5foo5", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 0.5 \"foo\" 5 )"));
- ut.clear();
- }
-
- // kleene star
- {
- typedef real_parser<double, strict_real_policies<double> >
- strict_double_type;
- strict_double_type const strict_double = strict_double_type();
-
- utree ut;
- BOOST_TEST(test_attr("xy", *char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("123 456", *int_, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("1.23 4.56", *double_, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
- ut.clear();
-
- rule<char const*, utree(), space_type> r1 =
- strict_double | int_ | ~char_("()") | ('(' >> *r1 >> ')');
-
- BOOST_TEST(test_attr("(x y)", r1, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("(((123)) 456)", r1, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( ( ( 123 ) ) 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("((1.23 4.56))", r1, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( ( 1.23 4.56 ) )"));
- ut.clear();
- BOOST_TEST(test_attr("x", r1, ut, space) &&
- ut.which() == utree_type::string_type && check(ut, "\"x\""));
- ut.clear();
- BOOST_TEST(test_attr("123", r1, ut, space) &&
- ut.which() == utree_type::int_type && check(ut, "123"));
- ut.clear();
- BOOST_TEST(test_attr("123.456", r1, ut, space) &&
- ut.which() == utree_type::double_type && check(ut, "123.456"));
- ut.clear();
- BOOST_TEST(test_attr("()", r1, ut, space) &&
- ut.which() == utree_type::list_type &&
- check(ut, "( )"));
- ut.clear();
- BOOST_TEST(test_attr("((()))", r1, ut, space) &&
- ut.which() == utree_type::list_type &&
- check(ut, "( ( ( ) ) )"));
- ut.clear();
- }
-
- // lists
- {
- utree ut;
- BOOST_TEST(test_attr("x,y", char_ % ',', ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("123,456", int_ % ',', ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("1.23,4.56", double_ % ',', ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
-
- rule<char const*, std::vector<char>()> r1 = char_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("x,y", r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
-
- rule<char const*, std::vector<int>()> r2 = int_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("123,456", r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
-
- rule<char const*, std::vector<double>()> r3 = double_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("1.23,4.56", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
-
- rule<char const*, utree()> r4 = double_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("1.23,4.56", r4, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
- }
-
- // alternatives
- {
- typedef real_parser<double, strict_real_policies<double> >
- strict_double_type;
- strict_double_type const strict_double = strict_double_type();
-
- utree ut;
- BOOST_TEST(test_attr("10", strict_double | int_, ut) &&
- ut.which() == utree_type::int_type && check(ut, "10"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", strict_double | int_, ut) &&
- ut.which() == utree_type::double_type && check(ut, "10.2"));
-
- rule<char const*, boost::variant<int, double>()> r1 = strict_double | int_;
- ut.clear();
- BOOST_TEST(test_attr("10", r1, ut) &&
- ut.which() == utree_type::int_type && check(ut, "10"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", r1, ut) &&
- ut.which() == utree_type::double_type && check(ut, "10.2"));
-
- rule<char const*, utree()> r2 = strict_double | int_;
- ut.clear();
- BOOST_TEST(test_attr("10", r2, ut) &&
- ut.which() == utree_type::int_type && check(ut, "10"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", r2, ut) &&
- ut.which() == utree_type::double_type && check(ut, "10.2"));
-
- rule<char const*, utree::list_type()> r3 = strict_double | int_;
- ut.clear();
- BOOST_TEST(test_attr("10", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 10 )"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 10.2 )"));
- }
-
- // optionals
- {
- utree ut;
- BOOST_TEST(test_attr("x", -char_, ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"x\""));
- ut.clear();
- BOOST_TEST(test_attr("", -char_, ut) &&
- ut.which() == utree_type::invalid_type &&
- check(ut, "<invalid>"));
- }
-
- // as_string
- {
- using boost::spirit::qi::as_string;
-
- utree ut;
- BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
- ut.clear();
- }
-
- // as
- {
- typedef as<std::string> as_string_type;
- as_string_type const as_string = as_string_type();
-
- typedef as<utf8_symbol_type> as_symbol_type;
- as_symbol_type const as_symbol = as_symbol_type();
-
- utree ut;
- BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_symbol[char_ >> char_], ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xy"));
- ut.clear();
-
- BOOST_TEST(test_attr("ab1.2", as_symbol[*~digit] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ab 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_symbol[*char_], ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xy"));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", as_symbol[char_ >> ',' >> char_], ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xy"));
- ut.clear();
- BOOST_TEST(test_attr("a,b1.2", as_symbol[~digit % ','] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ab 1.2 )"));
- ut.clear();
- }
-
- // subtrees
- {
- // -(+int_) is forcing a subtree
- utree ut;
- BOOST_TEST(test_attr("1 2", int_ >> ' ' >> -(+int_), ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1 2", int_ >> ' ' >> *int_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 )"));
- ut.clear();
-
- rule<char const*, std::vector<int>()> r1 = int_ % ',';
- BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 3 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1,2 2,3", r1 >> ' ' >> r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 2 3 )"));
- ut.clear();
-
- rule<char const*, utree()> r2 = int_ % ',';
- BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 3 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1,2 2,3", r2 >> ' ' >> r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 2 3 )"));
- ut.clear();
-
- rule<char const*, utree::list_type()> r3 = int_ % ',';
- BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 ( 2 3 ) )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1,2 2,3", r3 >> ' ' >> r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ( 1 2 ) ( 2 3 ) )"));
- ut.clear();
- }
-
- return boost::report_errors();
-}
Copied: trunk/libs/spirit/test/qi/utree1.cpp (from r67483, /trunk/libs/spirit/test/qi/utree.cpp)
==============================================================================
--- /trunk/libs/spirit/test/qi/utree.cpp (original)
+++ trunk/libs/spirit/test/qi/utree1.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -137,266 +137,5 @@
ut.clear();
}
- // kleene star
- {
- typedef real_parser<double, strict_real_policies<double> >
- strict_double_type;
- strict_double_type const strict_double = strict_double_type();
-
- utree ut;
- BOOST_TEST(test_attr("xy", *char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("123 456", *int_, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("1.23 4.56", *double_, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
- ut.clear();
-
- rule<char const*, utree(), space_type> r1 =
- strict_double | int_ | ~char_("()") | ('(' >> *r1 >> ')');
-
- BOOST_TEST(test_attr("(x y)", r1, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("(((123)) 456)", r1, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( ( ( 123 ) ) 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("((1.23 4.56))", r1, ut, space) &&
- ut.which() == utree_type::list_type && check(ut, "( ( 1.23 4.56 ) )"));
- ut.clear();
- BOOST_TEST(test_attr("x", r1, ut, space) &&
- ut.which() == utree_type::string_type && check(ut, "\"x\""));
- ut.clear();
- BOOST_TEST(test_attr("123", r1, ut, space) &&
- ut.which() == utree_type::int_type && check(ut, "123"));
- ut.clear();
- BOOST_TEST(test_attr("123.456", r1, ut, space) &&
- ut.which() == utree_type::double_type && check(ut, "123.456"));
- ut.clear();
- BOOST_TEST(test_attr("()", r1, ut, space) &&
- ut.which() == utree_type::list_type &&
- check(ut, "( )"));
- ut.clear();
- BOOST_TEST(test_attr("((()))", r1, ut, space) &&
- ut.which() == utree_type::list_type &&
- check(ut, "( ( ( ) ) )"));
- ut.clear();
- }
-
- // lists
- {
- utree ut;
- BOOST_TEST(test_attr("x,y", char_ % ',', ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
- BOOST_TEST(test_attr("123,456", int_ % ',', ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
- ut.clear();
- BOOST_TEST(test_attr("1.23,4.56", double_ % ',', ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
-
- rule<char const*, std::vector<char>()> r1 = char_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("x,y", r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
-
- rule<char const*, std::vector<int>()> r2 = int_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("123,456", r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
-
- rule<char const*, std::vector<double>()> r3 = double_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("1.23,4.56", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
-
- rule<char const*, utree()> r4 = double_ % ',';
- ut.clear();
- BOOST_TEST(test_attr("1.23,4.56", r4, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
- }
-
- // alternatives
- {
- typedef real_parser<double, strict_real_policies<double> >
- strict_double_type;
- strict_double_type const strict_double = strict_double_type();
-
- utree ut;
- BOOST_TEST(test_attr("10", strict_double | int_, ut) &&
- ut.which() == utree_type::int_type && check(ut, "10"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", strict_double | int_, ut) &&
- ut.which() == utree_type::double_type && check(ut, "10.2"));
-
- rule<char const*, boost::variant<int, double>()> r1 = strict_double | int_;
- ut.clear();
- BOOST_TEST(test_attr("10", r1, ut) &&
- ut.which() == utree_type::int_type && check(ut, "10"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", r1, ut) &&
- ut.which() == utree_type::double_type && check(ut, "10.2"));
-
- rule<char const*, utree()> r2 = strict_double | int_;
- ut.clear();
- BOOST_TEST(test_attr("10", r2, ut) &&
- ut.which() == utree_type::int_type && check(ut, "10"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", r2, ut) &&
- ut.which() == utree_type::double_type && check(ut, "10.2"));
-
- rule<char const*, utree::list_type()> r3 = strict_double | int_;
- ut.clear();
- BOOST_TEST(test_attr("10", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 10 )"));
- ut.clear();
- BOOST_TEST(test_attr("10.2", r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 10.2 )"));
- }
-
- // optionals
- {
- utree ut;
- BOOST_TEST(test_attr("x", -char_, ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"x\""));
- ut.clear();
- BOOST_TEST(test_attr("", -char_, ut) &&
- ut.which() == utree_type::invalid_type &&
- check(ut, "<invalid>"));
- }
-
- // as_string
- {
- using boost::spirit::qi::as_string;
-
- utree ut;
- BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
- ut.clear();
- }
-
- // as
- {
- typedef as<std::string> as_string_type;
- as_string_type const as_string = as_string_type();
-
- typedef as<utf8_symbol_type> as_symbol_type;
- as_symbol_type const as_symbol = as_symbol_type();
-
- utree ut;
- BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
- ut.which() == utree_type::string_type && check(ut, "\"xy\""));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_symbol[char_ >> char_], ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xy"));
- ut.clear();
-
- BOOST_TEST(test_attr("ab1.2", as_symbol[*~digit] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ab 1.2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("xy", as_symbol[*char_], ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xy"));
- ut.clear();
-
- BOOST_TEST(test_attr("x,y", as_symbol[char_ >> ',' >> char_], ut) &&
- ut.which() == utree_type::symbol_type && check(ut, "xy"));
- ut.clear();
- BOOST_TEST(test_attr("a,b1.2", as_symbol[~digit % ','] >> double_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ab 1.2 )"));
- ut.clear();
- }
-
- // subtrees
- {
- // -(+int_) is forcing a subtree
- utree ut;
- BOOST_TEST(test_attr("1 2", int_ >> ' ' >> -(+int_), ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1 2", int_ >> ' ' >> *int_, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 )"));
- ut.clear();
-
- rule<char const*, std::vector<int>()> r1 = int_ % ',';
- BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 3 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1,2 2,3", r1 >> ' ' >> r1, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 2 3 )"));
- ut.clear();
-
- rule<char const*, utree()> r2 = int_ % ',';
- BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 3 )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1,2 2,3", r2 >> ' ' >> r2, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 2 2 3 )"));
- ut.clear();
-
- rule<char const*, utree::list_type()> r3 = int_ % ',';
- BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( 1 ( 2 3 ) )"));
- ut.clear();
-
- BOOST_TEST(test_attr("1,2 2,3", r3 >> ' ' >> r3, ut) &&
- ut.which() == utree_type::list_type && check(ut, "( ( 1 2 ) ( 2 3 ) )"));
- ut.clear();
- }
-
return boost::report_errors();
}
Added: trunk/libs/spirit/test/qi/utree2.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/utree2.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,135 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 Joel de Guzman
+// Copyright (c) 2010 Bryce Lelbach
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/support_utree.hpp>
+#include <boost/mpl/print.hpp>
+
+#include <sstream>
+
+#include "test.hpp"
+
+inline bool check(boost::spirit::utree const& val, std::string expected)
+{
+ std::stringstream s;
+ s << val;
+ if (s.str() == expected + " ")
+ return true;
+
+ std::cerr << "got result: " << s.str()
+ << ", expected: " << expected << std::endl;
+ return false;
+}
+
+int main()
+{
+ using spirit_test::test_attr;
+ using boost::spirit::utree;
+ using boost::spirit::utree_type;
+ using boost::spirit::utf8_string_range_type;
+ using boost::spirit::utf8_symbol_type;
+ using boost::spirit::utf8_string_type;
+
+ using boost::spirit::qi::real_parser;
+ using boost::spirit::qi::strict_real_policies;
+ using boost::spirit::qi::digit;
+ using boost::spirit::qi::char_;
+ using boost::spirit::qi::string;
+ using boost::spirit::qi::int_;
+ using boost::spirit::qi::double_;
+ using boost::spirit::qi::space;
+ using boost::spirit::qi::space_type;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::as;
+ using boost::spirit::qi::lexeme;
+
+ // kleene star
+ {
+ typedef real_parser<double, strict_real_policies<double> >
+ strict_double_type;
+ strict_double_type const strict_double = strict_double_type();
+
+ utree ut;
+ BOOST_TEST(test_attr("xy", *char_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
+ ut.clear();
+ BOOST_TEST(test_attr("123 456", *int_, ut, space) &&
+ ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
+ ut.clear();
+ BOOST_TEST(test_attr("1.23 4.56", *double_, ut, space) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
+ ut.clear();
+
+ rule<char const*, utree(), space_type> r1 =
+ strict_double | int_ | ~char_("()") | ('(' >> *r1 >> ')');
+
+ BOOST_TEST(test_attr("(x y)", r1, ut, space) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
+ ut.clear();
+ BOOST_TEST(test_attr("(((123)) 456)", r1, ut, space) &&
+ ut.which() == utree_type::list_type && check(ut, "( ( ( 123 ) ) 456 )"));
+ ut.clear();
+ BOOST_TEST(test_attr("((1.23 4.56))", r1, ut, space) &&
+ ut.which() == utree_type::list_type && check(ut, "( ( 1.23 4.56 ) )"));
+ ut.clear();
+ BOOST_TEST(test_attr("x", r1, ut, space) &&
+ ut.which() == utree_type::string_type && check(ut, "\"x\""));
+ ut.clear();
+ BOOST_TEST(test_attr("123", r1, ut, space) &&
+ ut.which() == utree_type::int_type && check(ut, "123"));
+ ut.clear();
+ BOOST_TEST(test_attr("123.456", r1, ut, space) &&
+ ut.which() == utree_type::double_type && check(ut, "123.456"));
+ ut.clear();
+ BOOST_TEST(test_attr("()", r1, ut, space) &&
+ ut.which() == utree_type::list_type &&
+ check(ut, "( )"));
+ ut.clear();
+ BOOST_TEST(test_attr("((()))", r1, ut, space) &&
+ ut.which() == utree_type::list_type &&
+ check(ut, "( ( ( ) ) )"));
+ ut.clear();
+ }
+
+ // lists
+ {
+ utree ut;
+ BOOST_TEST(test_attr("x,y", char_ % ',', ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
+ ut.clear();
+ BOOST_TEST(test_attr("123,456", int_ % ',', ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
+ ut.clear();
+ BOOST_TEST(test_attr("1.23,4.56", double_ % ',', ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
+
+ rule<char const*, std::vector<char>()> r1 = char_ % ',';
+ ut.clear();
+ BOOST_TEST(test_attr("x,y", r1, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
+
+ rule<char const*, std::vector<int>()> r2 = int_ % ',';
+ ut.clear();
+ BOOST_TEST(test_attr("123,456", r2, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 123 456 )"));
+
+ rule<char const*, std::vector<double>()> r3 = double_ % ',';
+ ut.clear();
+ BOOST_TEST(test_attr("1.23,4.56", r3, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
+
+ rule<char const*, utree()> r4 = double_ % ',';
+ ut.clear();
+ BOOST_TEST(test_attr("1.23,4.56", r4, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1.23 4.56 )"));
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/qi/utree3.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/utree3.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,137 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 Joel de Guzman
+// Copyright (c) 2010 Bryce Lelbach
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/support_utree.hpp>
+#include <boost/mpl/print.hpp>
+
+#include <sstream>
+
+#include "test.hpp"
+
+inline bool check(boost::spirit::utree const& val, std::string expected)
+{
+ std::stringstream s;
+ s << val;
+ if (s.str() == expected + " ")
+ return true;
+
+ std::cerr << "got result: " << s.str()
+ << ", expected: " << expected << std::endl;
+ return false;
+}
+
+int main()
+{
+ using spirit_test::test_attr;
+ using boost::spirit::utree;
+ using boost::spirit::utree_type;
+ using boost::spirit::utf8_string_range_type;
+ using boost::spirit::utf8_symbol_type;
+ using boost::spirit::utf8_string_type;
+
+ using boost::spirit::qi::real_parser;
+ using boost::spirit::qi::strict_real_policies;
+ using boost::spirit::qi::digit;
+ using boost::spirit::qi::char_;
+ using boost::spirit::qi::string;
+ using boost::spirit::qi::int_;
+ using boost::spirit::qi::double_;
+ using boost::spirit::qi::space;
+ using boost::spirit::qi::space_type;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::as;
+ using boost::spirit::qi::lexeme;
+
+ // alternatives
+ {
+ typedef real_parser<double, strict_real_policies<double> >
+ strict_double_type;
+ strict_double_type const strict_double = strict_double_type();
+
+ utree ut;
+ BOOST_TEST(test_attr("10", strict_double | int_, ut) &&
+ ut.which() == utree_type::int_type && check(ut, "10"));
+ ut.clear();
+ BOOST_TEST(test_attr("10.2", strict_double | int_, ut) &&
+ ut.which() == utree_type::double_type && check(ut, "10.2"));
+
+ rule<char const*, boost::variant<int, double>()> r1 = strict_double | int_;
+ ut.clear();
+ BOOST_TEST(test_attr("10", r1, ut) &&
+ ut.which() == utree_type::int_type && check(ut, "10"));
+ ut.clear();
+ BOOST_TEST(test_attr("10.2", r1, ut) &&
+ ut.which() == utree_type::double_type && check(ut, "10.2"));
+
+ rule<char const*, utree()> r2 = strict_double | int_;
+ ut.clear();
+ BOOST_TEST(test_attr("10", r2, ut) &&
+ ut.which() == utree_type::int_type && check(ut, "10"));
+ ut.clear();
+ BOOST_TEST(test_attr("10.2", r2, ut) &&
+ ut.which() == utree_type::double_type && check(ut, "10.2"));
+
+ rule<char const*, utree::list_type()> r3 = strict_double | int_;
+ ut.clear();
+ BOOST_TEST(test_attr("10", r3, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 10 )"));
+ ut.clear();
+ BOOST_TEST(test_attr("10.2", r3, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 10.2 )"));
+ }
+
+ // optionals
+ {
+ utree ut;
+ BOOST_TEST(test_attr("x", -char_, ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"x\""));
+ ut.clear();
+ BOOST_TEST(test_attr("", -char_, ut) &&
+ ut.which() == utree_type::invalid_type &&
+ check(ut, "<invalid>"));
+ }
+
+ // as_string
+ {
+ using boost::spirit::qi::as_string;
+
+ utree ut;
+ BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"xy\""));
+ ut.clear();
+
+ BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"xy\""));
+ ut.clear();
+
+ BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"xy\""));
+ ut.clear();
+
+ BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
+ ut.clear();
+ }
+
+ return boost::report_errors();
+}
Added: trunk/libs/spirit/test/qi/utree4.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/spirit/test/qi/utree4.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
@@ -0,0 +1,151 @@
+// Copyright (c) 2001-2010 Hartmut Kaiser
+// Copyright (c) 2001-2010 Joel de Guzman
+// Copyright (c) 2010 Bryce Lelbach
+//
+// Distributed under 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)
+
+#include <boost/config/warning_disable.hpp>
+#include <boost/detail/lightweight_test.hpp>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/support_utree.hpp>
+#include <boost/mpl/print.hpp>
+
+#include <sstream>
+
+#include "test.hpp"
+
+inline bool check(boost::spirit::utree const& val, std::string expected)
+{
+ std::stringstream s;
+ s << val;
+ if (s.str() == expected + " ")
+ return true;
+
+ std::cerr << "got result: " << s.str()
+ << ", expected: " << expected << std::endl;
+ return false;
+}
+
+int main()
+{
+ using spirit_test::test_attr;
+ using boost::spirit::utree;
+ using boost::spirit::utree_type;
+ using boost::spirit::utf8_string_range_type;
+ using boost::spirit::utf8_symbol_type;
+ using boost::spirit::utf8_string_type;
+
+ using boost::spirit::qi::real_parser;
+ using boost::spirit::qi::strict_real_policies;
+ using boost::spirit::qi::digit;
+ using boost::spirit::qi::char_;
+ using boost::spirit::qi::string;
+ using boost::spirit::qi::int_;
+ using boost::spirit::qi::double_;
+ using boost::spirit::qi::space;
+ using boost::spirit::qi::space_type;
+ using boost::spirit::qi::rule;
+ using boost::spirit::qi::as;
+ using boost::spirit::qi::lexeme;
+
+ // as
+ {
+ typedef as<std::string> as_string_type;
+ as_string_type const as_string = as_string_type();
+
+ typedef as<utf8_symbol_type> as_symbol_type;
+ as_symbol_type const as_symbol = as_symbol_type();
+
+ utree ut;
+ BOOST_TEST(test_attr("xy", as_string[char_ >> char_], ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"xy\""));
+ ut.clear();
+
+ BOOST_TEST(test_attr("ab1.2", as_string[*~digit] >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("xy", as_string[*char_], ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"xy\""));
+ ut.clear();
+
+ BOOST_TEST(test_attr("x,y", as_string[char_ >> ',' >> char_], ut) &&
+ ut.which() == utree_type::string_type && check(ut, "\"xy\""));
+ ut.clear();
+
+ BOOST_TEST(test_attr("x,y", char_ >> ',' >> char_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"x\" \"y\" )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("a,b1.2", as_string[~digit % ','] >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"ab\" 1.2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("a,b1.2", ~digit % ',' >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( \"a\" \"b\" 1.2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("xy", as_symbol[char_ >> char_], ut) &&
+ ut.which() == utree_type::symbol_type && check(ut, "xy"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("ab1.2", as_symbol[*~digit] >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( ab 1.2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("xy", as_symbol[*char_], ut) &&
+ ut.which() == utree_type::symbol_type && check(ut, "xy"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("x,y", as_symbol[char_ >> ',' >> char_], ut) &&
+ ut.which() == utree_type::symbol_type && check(ut, "xy"));
+ ut.clear();
+ BOOST_TEST(test_attr("a,b1.2", as_symbol[~digit % ','] >> double_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( ab 1.2 )"));
+ ut.clear();
+ }
+
+ // subtrees
+ {
+ // -(+int_) is forcing a subtree
+ utree ut;
+ BOOST_TEST(test_attr("1 2", int_ >> ' ' >> -(+int_), ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 2 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("1 2", int_ >> ' ' >> *int_, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 2 )"));
+ ut.clear();
+
+ rule<char const*, std::vector<int>()> r1 = int_ % ',';
+ BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r1, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 2 3 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("1,2 2,3", r1 >> ' ' >> r1, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 2 2 3 )"));
+ ut.clear();
+
+ rule<char const*, utree()> r2 = int_ % ',';
+ BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r2, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 2 3 )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("1,2 2,3", r2 >> ' ' >> r2, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 2 2 3 )"));
+ ut.clear();
+
+ rule<char const*, utree::list_type()> r3 = int_ % ',';
+ BOOST_TEST(test_attr("1 2,3", int_ >> ' ' >> r3, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( 1 ( 2 3 ) )"));
+ ut.clear();
+
+ BOOST_TEST(test_attr("1,2 2,3", r3 >> ' ' >> r3, ut) &&
+ ut.which() == utree_type::list_type && check(ut, "( ( 1 2 ) ( 2 3 ) )"));
+ ut.clear();
+ }
+
+ return boost::report_errors();
+}
Deleted: trunk/libs/spirit/test/support/multi_pass_regression001.cpp
==============================================================================
--- trunk/libs/spirit/test/support/multi_pass_regression001.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,26 +0,0 @@
-// Copyright (c) 2010 Chris Hoeppler
-//
-// Distributed under 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)
-
-// This code below failed to compile with MSVC starting with Boost V1.42
-
-#include <vector>
-#include <boost/spirit/include/classic_position_iterator.hpp>
-#include <boost/spirit/include/qi.hpp>
-
-namespace char_enc = boost::spirit::ascii;
-namespace qi = boost::spirit::qi;
-
-int main()
-{
- typedef std::vector<char> file_storage;
- typedef boost::spirit::classic::position_iterator<
- file_storage::const_iterator> iterator_type;
-
- qi::rule<iterator_type, std::string(), qi::blank_type> top =
- qi::lexeme[+char_enc::alpha];
-
- return 0;
-}
-
Deleted: trunk/libs/spirit/test/support/multi_pass_regression002.cpp
==============================================================================
--- trunk/libs/spirit/test/support/multi_pass_regression002.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,107 +0,0 @@
-// Copyright (c) 2010 Larry Evans
-//
-// Distributed under 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)
-
-//Purpose:
-// Demonstrate error in non-classic multi_pass iterator compilation.
-//
-
-#include <boost/spirit/home/qi.hpp>
-#include <boost/spirit/home/support.hpp>
-#include <boost/spirit/home/support/multi_pass.hpp>
-#include <boost/spirit/home/support/iterators/detail/functor_input_policy.hpp>
-
-#include <fstream>
-
-//[iterate_a2m:
-// copied from:
-// http://www.boost.org/doc/libs/1_41_0/libs/spirit/doc/html/spirit/support/multi_pass.html
-
-// define the function object
-template<typename CharT=char>
-class istreambuf_functor
-{
-public:
- typedef
- std::istreambuf_iterator<CharT>
- buf_iterator_type;
- typedef
- typename buf_iterator_type::int_type
- result_type;
- static
- result_type
- eof;
-
- istreambuf_functor(void)
- : current_chr(eof)
- {}
-
- istreambuf_functor(std::ifstream& input)
- : my_first(input)
- , current_chr(eof)
- {}
-
- result_type operator()()
- {
- buf_iterator_type last;
- if (my_first == last)
- {
- return eof;
- }
- current_chr=*my_first;
- ++my_first;
- return current_chr;
- }
-
-private:
- buf_iterator_type my_first;
- result_type current_chr;
-};
-
-template<typename CharT>
- typename istreambuf_functor<CharT>::result_type
- istreambuf_functor<CharT>::
-eof
-( istreambuf_functor<CharT>::buf_iterator_type::traits_type::eof()
-)
-;
-
-//]iterate_a2m:
-
-typedef istreambuf_functor<char> base_iterator_type;
-
-typedef
- boost::spirit::multi_pass
- < base_iterator_type
- , boost::spirit::iterator_policies::default_policy
- < boost::spirit::iterator_policies::first_owner
- , boost::spirit::iterator_policies::no_check
- , boost::spirit::iterator_policies::functor_input
- , boost::spirit::iterator_policies::split_std_deque
- >
- >
-chr_iterator_type;
-
-// ======================================================================
-// Main
-int main(int argc, char** argv)
-{
- std::ifstream in("multi_pass.txt");
-
- unsigned num_toks=0;
- unsigned const max_toks=10;
-
- base_iterator_type base_first(in);
- chr_iterator_type chr_first(base_first);
- chr_iterator_type chr_last;
- for
- (
- ; (chr_first != chr_last && ++num_toks < max_toks)
- ; ++chr_first
- )
- {
- std::cout<<":num_toks="<<num_toks<<":chr="<<*chr_first<<"\n";
- }
- return 0;
-}
Deleted: trunk/libs/spirit/test/support/multi_pass_regression003.cpp
==============================================================================
--- trunk/libs/spirit/test/support/multi_pass_regression003.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,61 +0,0 @@
-// Copyright (c) 2010 Peter Schueller
-// Copyright (c) 2001-2010 Hartmut Kaiser
-//
-// Distributed under 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)
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <vector>
-#include <istream>
-#include <sstream>
-#include <iostream>
-
-#include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/support_multi_pass.hpp>
-
-namespace qi = boost::spirit::qi;
-namespace ascii = boost::spirit::ascii;
-
-std::vector<double> parse(std::istream& input)
-{
- // iterate over stream input
- typedef std::istreambuf_iterator<char> base_iterator_type;
- base_iterator_type in_begin(input);
-
- // convert input iterator to forward iterator, usable by spirit parser
- typedef boost::spirit::multi_pass<base_iterator_type> forward_iterator_type;
- forward_iterator_type fwd_begin = boost::spirit::make_default_multi_pass(in_begin);
- forward_iterator_type fwd_end;
-
- // prepare output
- std::vector<double> output;
-
- // parse
- bool r = qi::phrase_parse(
- fwd_begin, fwd_end, // iterators over input
- qi::double_ >> *(',' >> qi::double_) >> qi::eoi, // recognize list of doubles
- ascii::space | '#' >> *(ascii::char_ - qi::eol) >> qi::eol, // comment skipper
- output); // doubles are stored into this object
-
- // error detection
- if( !r || fwd_begin != fwd_end )
- throw std::runtime_error("parse error");
-
- // return result
- return output;
-}
-
-int main()
-{
- try {
- std::stringstream str("1.0,2.0\n");
- std::vector<double> values = parse(str);
- BOOST_TEST(values.size() == 2 && values[0] == 1.0 && values[1] == 2.0);
- }
- catch(std::exception const&) {
- BOOST_TEST(false);
- }
- return boost::report_errors();
-}
Deleted: trunk/libs/spirit/test/support/utree_test.cpp
==============================================================================
--- trunk/libs/spirit/test/support/utree_test.cpp 2010-12-29 16:17:01 EST (Wed, 29 Dec 2010)
+++ (empty file)
@@ -1,397 +0,0 @@
-/*=============================================================================
- Copyright (c) 2001-2010 Joel de Guzman
- Copyright (c) 2001-2010 Hartmut Kaiser
- Copyright (c) 2010 Bryce Lelbach
-
- Distributed under 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)
-=============================================================================*/
-
-#include <boost/config/warning_disable.hpp>
-#include <boost/detail/lightweight_test.hpp>
-
-#include <boost/spirit/include/support_utree.hpp>
-
-#include <iostream>
-#include <sstream>
-#include <cstdlib>
-
-inline bool check(boost::spirit::utree const& val, std::string expected)
-{
- std::stringstream s;
- s << val;
- if (s.str() == expected + " ")
- return true;
-
- std::cerr << "got result: " << s.str()
- << ", expected: " << expected << std::endl;
- return false;
-}
-
-struct one_two_three
-{
- boost::spirit::utree operator()(boost::spirit::scope) const
- {
- return boost::spirit::utree(123);
- }
-};
-
-int main()
-{
- using boost::spirit::utree;
- using boost::spirit::utf8_symbol_type;
- using boost::spirit::binary_string_type;
-
- {
- // test the size
- std::cout << "size of utree is: "
- << sizeof(utree) << " bytes" << std::endl;
- BOOST_TEST(sizeof(utree) == sizeof(void*[4]));
- }
-
- {
- utree val(utree::nil);
- BOOST_TEST(check(val, "<nil>"));
- }
-
- {
- utree val(utree::list);
- BOOST_TEST(check(val, "( )"));
- }
-
- {
- utree val(true);
- BOOST_TEST(check(val, "true"));
- }
-
- {
- utree val(123);
- BOOST_TEST(check(val, "123"));
- }
-
- {
- // single element string
- utree val('x');
- BOOST_TEST(check(val, "\"x\""));
-
- // empty string
- utree val1("");
- BOOST_TEST(check(val1, "\"\""));
- }
-
- {
- utree val(123.456);
- BOOST_TEST(check(val, "123.456"));
- }
-
- { // strings
- utree val("Hello, World");
- BOOST_TEST(check(val, "\"Hello, World\""));
- utree val2;
- val2 = val;
- BOOST_TEST(check(val2, "\"Hello, World\""));
- utree val3("Hello, World. Chuckie is back!!!");
- val = val3;
- BOOST_TEST(check(val, "\"Hello, World. Chuckie is back!!!\""));
-
- utree val4("Apple");
- utree val5("Apple");
- BOOST_TEST(val4 == val5);
-
- utree val6("ApplePie");
- BOOST_TEST(val4 < val6);
- }
-
- { // symbols
- utree val(utf8_symbol_type("Hello, World"));
- BOOST_TEST(check(val, "Hello, World"));
- utree val2;
- val2 = val;
- BOOST_TEST(check(val2, "Hello, World"));
- utree val3(utf8_symbol_type("Hello, World. Chuckie is back!!!"));
- val = val3;
- BOOST_TEST(check(val, "Hello, World. Chuckie is back!!!"));
-
- utree val4(utf8_symbol_type("Apple"));
- utree val5(utf8_symbol_type("Apple"));
- BOOST_TEST(val4 == val5);
-
- utree val6(utf8_symbol_type("ApplePie"));
- BOOST_TEST(val4 < val6);
- }
-
- { // binary_strings
- utree val(binary_string_type("\xDE#\xAD"));
- BOOST_TEST(check(val, "#de23ad#" /* FIXME?: "#\xDE#\xAD#" */));
- utree val2;
- val2 = val;
- BOOST_TEST(check(val2, "#de23ad#" /* FIXME?: "#\xDE#\xAD#" */));
- utree val3(binary_string_type("\xDE\xAD\xBE\xEF"));
- val = val3;
- BOOST_TEST(check(val, "#deadbeef#" /* FIXME?: "#\xDE\xAD\xBE\xEF#" */));
-
- utree val4(binary_string_type("\x01"));
- utree val5(binary_string_type("\x01"));
- BOOST_TEST(val4 == val5);
-
- utree val6(binary_string_type("\x01\x02"));
- BOOST_TEST(val4 < val6);
- }
-
- {
- utree val;
- val.push_back(123);
- val.push_back("Chuckie");
- BOOST_TEST(val.size() == 2);
- utree val2;
- val2.push_back(123.456);
- val2.push_back("Mah Doggie");
- val.push_back(val2);
- BOOST_TEST(val.size() == 3);
- BOOST_TEST(check(val, "( 123 \"Chuckie\" ( 123.456 \"Mah Doggie\" ) )"));
- BOOST_TEST(check(val.front(), "123"));
-
- utree val3(utree::nil);
- val3.swap(val);
- BOOST_TEST(val3.size() == 3);
- BOOST_TEST(check(val, "<nil>"));
- val3.swap(val);
- BOOST_TEST(check(val, "( 123 \"Chuckie\" ( 123.456 \"Mah Doggie\" ) )"));
- val.push_back("another string");
- BOOST_TEST(val.size() == 4);
- BOOST_TEST(check(val, "( 123 \"Chuckie\" ( 123.456 \"Mah Doggie\" ) \"another string\" )"));
- val.pop_front();
- BOOST_TEST(check(val, "( \"Chuckie\" ( 123.456 \"Mah Doggie\" ) \"another string\" )"));
- utree::iterator i = val.begin();
- ++++i;
- val.insert(i, "Right in the middle");
- BOOST_TEST(val.size() == 4);
- BOOST_TEST(check(val, "( \"Chuckie\" ( 123.456 \"Mah Doggie\" ) \"Right in the middle\" \"another string\" )"));
- val.pop_back();
- BOOST_TEST(check(val, "( \"Chuckie\" ( 123.456 \"Mah Doggie\" ) \"Right in the middle\" )"));
- BOOST_TEST(val.size() == 3);
- utree::iterator it = val.end(); --it;
- val.erase(it);
- BOOST_TEST(check(val, "( \"Chuckie\" ( 123.456 \"Mah Doggie\" ) )"));
- BOOST_TEST(val.size() == 2);
-
- val.insert(val.begin(), val2.begin(), val2.end());
- BOOST_TEST(check(val, "( 123.456 \"Mah Doggie\" \"Chuckie\" ( 123.456 \"Mah Doggie\" ) )"));
- BOOST_TEST(val.size() == 4);
- }
-
- {
- utree val;
- val.insert(val.end(), 123);
- val.insert(val.end(), "Mia");
- val.insert(val.end(), "Chuckie");
- val.insert(val.end(), "Poly");
- val.insert(val.end(), "Mochi");
- BOOST_TEST(check(val, "( 123 \"Mia\" \"Chuckie\" \"Poly\" \"Mochi\" )"));
- }
-
- {
- utree a(utree::nil), b(utree::nil);
- BOOST_TEST(a == b);
- a = 123;
- BOOST_TEST(a != b);
- b = 123;
- BOOST_TEST(a == b);
- a = 100.00;
- BOOST_TEST(a < b);
-
- b = a = utree(utree::invalid);
- BOOST_TEST(a == b);
- a.push_back(1);
- a.push_back("two");
- a.push_back(3.0);
- b.push_back(1);
- b.push_back("two");
- b.push_back(3.0);
- BOOST_TEST(a == b);
- b.push_back(4);
- BOOST_TEST(a != b);
- BOOST_TEST(a < b);
- }
-
- {
- utree a(utree::list);
- a.push_back(1);
- a.push_back(2);
- a.push_back(3);
- a.push_back(4);
- a.push_back(5);
- a.push_back(6);
- a.push_back(7);
- a.push_back(8);
- a.push_back(9);
- a.push_back(10);
- a.push_back(11);
- a.push_back(12);
-
- BOOST_TEST(a[0] == utree(1));
- BOOST_TEST(a[1] == utree(2));
- BOOST_TEST(a[2] == utree(3));
- BOOST_TEST(a[3] == utree(4));
- BOOST_TEST(a[4] == utree(5));
- BOOST_TEST(a[5] == utree(6));
- BOOST_TEST(a[6] == utree(7));
- BOOST_TEST(a[7] == utree(8));
- BOOST_TEST(a[8] == utree(9));
- BOOST_TEST(a[9] == utree(10));
- BOOST_TEST(a[10] == utree(11));
- BOOST_TEST(a[11] == utree(12));
- }
-
- {
- // test empty list
- utree a;
- a.push_back(1);
- a.pop_front();
- BOOST_TEST(check(a, "( )"));
-
- // the other way around
- utree b;
- b.push_front(1);
- b.pop_back();
- BOOST_TEST(check(b, "( )"));
- }
-
- { // test references
- utree val(123);
- utree ref(boost::ref(val));
- BOOST_TEST(check(ref, "123"));
- BOOST_TEST(ref == utree(123));
-
- val.clear();
- val.push_back(1);
- val.push_back(2);
- val.push_back(3);
- val.push_back(4);
- BOOST_TEST(check(ref, "( 1 2 3 4 )"));
- BOOST_TEST(ref[0] == utree(1));
- BOOST_TEST(ref[1] == utree(2));
- BOOST_TEST(ref[2] == utree(3));
- BOOST_TEST(ref[3] == utree(4));
- }
-
- { // put it in an array
-
- utree vals[] = {
- utree(123),
- utree("Hello, World"),
- utree(123.456)
- };
-
- BOOST_TEST(check(vals[0], "123"));
- BOOST_TEST(check(vals[1], "\"Hello, World\""));
- BOOST_TEST(check(vals[2], "123.456"));
- }
-
- { // operators
-
- BOOST_TEST((utree(true) && utree(true)) == utree(true));
- BOOST_TEST((utree(true) || utree(false)) == utree(true));
- BOOST_TEST(!utree(true) == utree(false));
-
- BOOST_TEST((utree(456) + utree(123)) == utree(456 + 123));
- BOOST_TEST((utree(456) + utree(123.456)) == utree(456 + 123.456));
- BOOST_TEST((utree(456) - utree(123)) == utree(456 - 123));
- BOOST_TEST((utree(456) - utree(123.456)) == utree(456 - 123.456));
- BOOST_TEST((utree(456) * utree(123)) == utree(456 * 123));
- BOOST_TEST((utree(456) * utree(123.456)) == utree(456 * 123.456));
- BOOST_TEST((utree(456) / utree(123)) == utree(456 / 123));
- BOOST_TEST((utree(456) / utree(123.456)) == utree(456 / 123.456));
- BOOST_TEST((utree(456) % utree(123)) == utree(456 % 123));
- BOOST_TEST(-utree(456) == utree(-456));
-
- BOOST_TEST((utree(456) & utree(123)) == utree(456 & 123));
- BOOST_TEST((utree(456) | utree(123)) == utree(456 | 123));
- BOOST_TEST((utree(456) ^ utree(123)) == utree(456 ^ 123));
- BOOST_TEST((utree(456) << utree(3)) == utree(456 << 3));
- BOOST_TEST((utree(456) >> utree(2)) == utree(456 >> 2));
- BOOST_TEST(~utree(456) == utree(~456));
- }
-
- { // test reference iterator
- utree val;
- val.push_back(1);
- val.push_back(2);
- val.push_back(3);
- val.push_back(4);
- BOOST_TEST(check(val, "( 1 2 3 4 )"));
-
- utree::ref_iterator b = val.ref_begin();
- utree::ref_iterator e = val.ref_end();
-
- utree ref(boost::make_iterator_range(b, e));
- BOOST_TEST(ref[0] == utree(1));
- BOOST_TEST(ref[1] == utree(2));
- BOOST_TEST(ref[2] == utree(3));
- BOOST_TEST(ref[3] == utree(4));
- BOOST_TEST(check(ref, "( 1 2 3 4 )"));
- }
-
- {
- // check the tag
- utree x;
- x.tag(123);
- BOOST_TEST(x.tag() == 123);
- }
-
- {
- // test functions
- using boost::spirit::stored_function;
- using boost::spirit::scope;
-
- utree f = stored_function<one_two_three>();
- f.eval(scope());
- }
-
- {
- // shallow ranges
- using boost::spirit::shallow;
-
- utree val;
- val.push_back(1);
- val.push_back(2);
- val.push_back(3);
- val.push_back(4);
-
- utree::iterator i = val.begin(); ++i;
- utree alias(utree::range(i, val.end()), shallow);
-
- BOOST_TEST(check(alias, "( 2 3 4 )"));
- BOOST_TEST(alias.size() == 3);
- BOOST_TEST(alias.front() == 2);
- BOOST_TEST(alias.back() == 4);
- BOOST_TEST(!alias.empty());
- BOOST_TEST(alias[1] == 3);
- }
-
- {
- // shallow string ranges
- using boost::spirit::utf8_string_range_type;
- using boost::spirit::shallow;
-
- char const* s = "Hello, World";
- utree val(utf8_string_range_type(s, s + strlen(s)), shallow);
- BOOST_TEST(check(val, "\"Hello, World\""));
-
- utf8_string_range_type r = val.get<utf8_string_range_type>();
- utf8_string_range_type pf(r.begin()+1, r.end()-1);
- val = utree(pf, shallow);
- BOOST_TEST(check(val, "\"ello, Worl\""));
- }
-
- {
- // any pointer
- using boost::spirit::any_ptr;
-
- int n = 123;
- utree up = any_ptr(&n);
- BOOST_TEST(*up.get<int*>() == 123);
- }
-
- return boost::report_errors();
-}
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk