$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r61308 - in trunk/libs/spirit/test: karma qi
From: hartmut.kaiser_at_[hidden]
Date: 2010-04-15 22:48:13
Author: hkaiser
Date: 2010-04-15 22:48:12 EDT (Thu, 15 Apr 2010)
New Revision: 61308
URL: http://svn.boost.org/trac/boost/changeset/61308
Log:
Spirit: added more tests
Text files modified: 
   trunk/libs/spirit/test/karma/sequence.cpp |    12 +++++++                                 
   trunk/libs/spirit/test/karma/symbols.cpp  |    62 ++++++++++++++++++++++++++++++++++++++++
   trunk/libs/spirit/test/qi/sequence.cpp    |     7 ++++                                    
   3 files changed, 81 insertions(+), 0 deletions(-)
Modified: trunk/libs/spirit/test/karma/sequence.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/sequence.cpp	(original)
+++ trunk/libs/spirit/test/karma/sequence.cpp	2010-04-15 22:48:12 EDT (Thu, 15 Apr 2010)
@@ -52,6 +52,18 @@
         }
 
         {
+            // 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 ", 
Modified: trunk/libs/spirit/test/karma/symbols.cpp
==============================================================================
--- trunk/libs/spirit/test/karma/symbols.cpp	(original)
+++ trunk/libs/spirit/test/karma/symbols.cpp	2010-04-15 22:48:12 EDT (Thu, 15 Apr 2010)
@@ -18,6 +18,16 @@
 
 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;
@@ -175,6 +185,58 @@
         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;
 
Modified: trunk/libs/spirit/test/qi/sequence.cpp
==============================================================================
--- trunk/libs/spirit/test/qi/sequence.cpp	(original)
+++ trunk/libs/spirit/test/qi/sequence.cpp	2010-04-15 22:48:12 EDT (Thu, 15 Apr 2010)
@@ -106,6 +106,13 @@
     }
 
     {
+        // a single element fusion sequence
+        vector<char> attr;
+        BOOST_TEST((test_attr("ab", char_ >> 'b', attr)));
+        BOOST_TEST((at_c<0>(attr) == 'a'));
+    }
+
+    {
         // make sure single element tuples get passed through if the rhs 
         // has a single element tuple as its attribute
         vector<double, int> fv;