Example #1
0
int main( int /*argc*/, char** /*argv*/ )
{
  std::string name;
  Tag *aaa = new Tag( "aaa" );
  Tag *bbb = new Tag( aaa, "bbb" ); bbb->addAttribute( "name", "b1" );
  Tag *ccc = new Tag( aaa, "ccc" ); ccc->setCData( "abc" );
  Tag *ddd = new Tag( ccc, "ddd" ); ddd->setCData( "bcd" );
  Tag *eee = new Tag( ccc, "eee" );
  Tag *fff = new Tag( aaa, "fff" );
  Tag *ggg = new Tag( fff, "ggg" );
  Tag *hhh = new Tag( bbb, "hhh" ); hhh->addAttribute( "name", "h1" );
  Tag *iii = new Tag( bbb, "bbb" ); iii->addAttribute( "name", "b2" );
  Tag *jjj = new Tag( hhh, "bbb" ); jjj->addAttribute( "name", "b3" );
  ConstTagList result;
  ConstTagList::const_iterator it;
//   XPathToken *t = 0;

// <aaa>
//   <bbb name='b1'>
//     <hhh>
//       <bbb name='b3'/>
//     </hhh>
//     <bbb name='b2'/>
//   </bbb>
//   <ccc>
//     <ddd/>
//     <eee/>
//   </ccc>
//   <fff>
//     <ggg/>
//   </fff>
// </aaa>

  /*
   * Lexer tests
   */

//   // -------
//   name = "/";
//   t = XPath::parse( name );
//   if( t != 0 )
//   {
//     ++fail;
//     fprintf( stderr, "test '%s' failed\n", name.c_str() );
//   }
//   delete t;

//   // -------
//   name = "//";
//   t = XPath::parse( name );
//   if( t != 0 )
//   {
//     ++fail;
//     fprintf( stderr, "test 'lexer: %s' failed\n", name.c_str() );
//   }
//   delete t;

  // ------- working
//   testLexer( "/abc" );
//   testLexer( "/abc/def" );
//   testLexer( "/abc//def" );
//
//   testLexer( "/abc/def[//dgh]" );
//
//   testLexer( "count(//dgh)" );
//
//   testLexer( "/*/abc" );
//
//   testLexer( "count(count(//dgh))" );
//
//   testLexer( "*/abc" );
//
//   testLexer( "*" );
//
//   testLexer( "//*" );
//
//   testLexer( "count(count(//dgh[//abc]))" );
//
//   testLexer( "//c[id>count(//aaa|//bbb)]" );
//
//   testLexer( "a/*/b" );
//
//   testLexer( "a<b" );
//
//   testLexer( "/./*" );
//
//   testLexer( "/./../*" );
//
//   testLexer( "/./../../." );
//
//   testLexer( "a=b" );
//
//   testLexer( "/b[@a='b']" );

  // ------- ~working


//   testLexer( "a*b" );

//   testLexer( "a*b" );

//   testLexer( "a*b" );









  //   testLexer( "//c[id>count(//aaa|//bbb*//ccc)]" );





//   testLexer( "//aaa|//bbb*(//ccc+//abc)" );

// //   testLexer( "//a|(//b*//c)+//d" );

//   testLexer( "//a|//b*//c+//d" );

//   testLexer( "//c[id>count(//aaa|//bbb*//ccc)+//abc]" );












  // -- simple paths --

  // -------
  name = "get root: /";
  if( aaa->findTag( "/" ) != 0 )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "get deeproot: //";
  if( aaa->findTag( "//" ) != 0 )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "get root tag: aaa";
  if( aaa->findTag( "aaa" ) != aaa )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "get root tag: /aaa";
  if( aaa->findTag( "/aaa" ) != aaa )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "simple child: /aaa/bbb";
  if( aaa->findTag( "/aaa/bbb" ) != bbb )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "simple child: /aaa/ccc";
  if( aaa->findTag( "/aaa/ccc" ) != ccc )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "simple child: /aaa/ccc/ddd";
  if( aaa->findTag( "/aaa/ccc/ddd" ) != ddd )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find all: //aaa";
  if( aaa->findTag( "//aaa" ) != aaa )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find all: //eee";
  if( aaa->findTag( "//eee" ) != eee )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find all: //bbb";
  if( aaa->findTag( "//bbb" ) != bbb )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "get root tag from child: /aaa";
  if( bbb->findTag( "/aaa" ) != aaa )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "fail test 1: /abc";
  if( aaa->findTag( "/abc" ) != 0 )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "fail test 2: /bbb";
  if( aaa->findTag( "/bbb" ) != 0 )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "relative find 1: aaa";
  if( aaa->findTag( "aaa" ) != aaa )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "relative find 2: bbb";
  if( bbb->findTag( "bbb" ) != bbb )
  {
    ++fail;
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find ConstTagList: //bbb";
  result = aaa->findTagList( "//bbb" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find ConstTagList: //ggg";
  result = aaa->findTagList( "//ggg" );
  it = result.begin();
  if( result.size() != 1 || (*it) != ggg )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find all: //*";
  result = aaa->findTagList( "//*" );
  it = result.begin();
  if( result.size() != 10 || (*it) != aaa || (*++it) != bbb || (*++it) != hhh ||
      (*++it) != jjj || (*++it) != iii || (*++it) != ccc || (*++it) != ddd ||
      (*++it) != eee || (*++it) != fff || (*++it) != ggg )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find first level: /*";
  result = aaa->findTagList( "/*" );
  if( result.size() != 1 || result.front() != aaa )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find second level: /*/*";
  result = aaa->findTagList( "/*/*" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != ccc || (*++it) != fff )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find third level: /*/*/*";
  result = aaa->findTagList( "/*/*/*" );
  it = result.begin();
  if( result.size() != 5 || (*it) != hhh || (*++it) != iii ||
      (*++it) != ddd || (*++it) != eee || (*++it) != ggg )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find fourth level: /*/*/*/*";
  result = aaa->findTagList( "/*/*/*/*" );
  if( result.size() != 1 || result.front() != jjj )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find fith level: /*/*/*/*/*";
  result = aaa->findTagList( "/*/*/*/*/*" );
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find all sub-bbb: /*/*//bbb";
  result = aaa->findTagList( "/*/*//bbb" );
  if( result.size() != 2 || result.front() != jjj || result.back() != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find second level bbb: /*/bbb";
  result = aaa->findTagList( "/*/bbb" );
  if( result.size() != 1 || result.front() != bbb )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find second level via self/noop: /*/./*";
  result = aaa->findTagList( "/*/./*" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != ccc || (*++it) != fff )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find second level via repeated self/noop: /*/././*";
  result = aaa->findTagList( "/*/././*" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != ccc || (*++it) != fff )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "find first level via parent: /*/../*";
  result = aaa->findTagList( "/*/../*" );
  it = result.begin();
  if( result.size() != 1 || (*it) != aaa )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "invalid parent: /../*";
  result = aaa->findTagList( "/../*" );
  it = result.begin();
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "deepsearch && * combined 1: //fff/*";
  result = aaa->findTagList( "//fff/*" );
  it = result.begin();
  if( result.size() != 1 || (*it) != ggg )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "deepsearch && .. combined 2: //ggg/..";
  result = aaa->findTagList( "//ggg/.." );
  it = result.begin();
  if( result.size() != 1 || (*it) != fff )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

//   printf( "--------------------------------------------------------------\n" );
//   // -------
//   name = "select non-leaf elements: //..";
//   result = aaa->findTagList( "//.." );
//   it = result.begin();
//   if( result.size() != 5 || (*it) != aaa || (*++it) != bbb ||
//       (*++it) != hhh || (*++it) != ccc || (*++it) != fff )
//   {
//     ++fail;
//     printResult( name, result );
//     fprintf( stderr, "test '%s' failed\n", name.c_str() );
//   }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "deepsearch && .. combined 3: //ggg/../../bbb";
  result = aaa->findTagList( "//ggg/../../bbb" );
  it = result.begin();
  if( result.size() != 1 || (*it) != bbb )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "deepsearch && .. combined 4: //ggg/../..//bbb";
  result = aaa->findTagList( "//ggg/../..//bbb" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "deepsearch && .. && * combined 1: //*/../..//bbb";
  result = aaa->findTagList( "//*/../..//bbb" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "deepsearch && .. && * combined 2: //*/*/..//*";
  result = aaa->findTagList( "//*/*/..//*" );
  it = result.begin();
  if( result.size() != 9 || (*it) != bbb || (*++it) != hhh || (*++it) != jjj ||
      (*++it) != iii || (*++it) != ccc || (*++it) != ddd || (*++it) != eee ||
      (*++it) != fff || (*++it) != ggg )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  // -------
  name = "deepsearch: //bbb/hhh/bbb";
  result = aaa->findTagList( "//bbb/hhh/bbb" );
  it = result.begin();
  if( result.size() != 1 || (*it) != jjj )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -- ~simple paths --


  // -- operators --

  // ---- union ----

  // -------
  name = "union 1: //bbb|/aaa";
  result = aaa->findTagList( "//bbb|/aaa" );
  it = result.begin();
  if( result.size() != 4 || (*it) != bbb || (*++it) != jjj || (*++it) != iii || (*++it) != aaa )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "union 1: //bbb|//bbb";
  result = aaa->findTagList( "//bbb|//bbb" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "union 2: /aaa|/aaa";
  result = aaa->findTagList( "/aaa|/aaa" );
  it = result.begin();
  if( result.size() != 1 || (*it) != aaa )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "union 3: /aaa|/aaa|//bbb";
  result = aaa->findTagList( "/aaa|/aaa|//bbb" );
  it = result.begin();
  if( result.size() != 4 || (*it) != aaa || (*++it) != bbb || (*++it) != jjj || (*++it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );


  // -------
  name = "union + predicates: //bbb[@name='b1']|//hhh[@name='h1']";
  result = aaa->findTagList( "//bbb[@name='b1']|//hhh[@name='h1']" );
  it = result.begin();
  if( result.size() != 2 || (*it) != bbb || (*++it) != hhh )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "empty union 1: /cde|/def";
  result = aaa->findTagList( "/cde|/def" );
  it = result.begin();
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );


  // ---- ~union ----

  // -- ~operators --



  // -- predicates --

  // -------
  name = "filter 1: //bbb[1]";
  result = aaa->findTagList( "//bbb[1]" );
  it = result.begin();
  if( result.size() != 1 || (*it) != bbb )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "filter 2: //bbb[2]";
  result = aaa->findTagList( "//bbb[2]" );
  it = result.begin();
  if( result.size() != 1 || (*it) != jjj )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "filter 3: //bbb[3]";
  result = aaa->findTagList( "//bbb[3]" );
  it = result.begin();
  if( result.size() != 1 || (*it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "invalid filter 4: //bbb[4]";
  result = aaa->findTagList( "//bbb[4]" );
  it = result.begin();
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "filter 5: /aaa/bbb[1]";
  result = aaa->findTagList( "/aaa/bbb[1]" );
  it = result.begin();
  if( result.size() != 1 || (*it) != bbb )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "filter 5: /aaa[1]";
  result = aaa->findTagList( "/aaa[1]" );
  it = result.begin();
  if( result.size() != 1 || (*it) != aaa )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "invalid filter 6: /aaa[2]";
  result = aaa->findTagList( "/aaa[2]" );
  it = result.begin();
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "invalid filter 7: [2]";
  result = aaa->findTagList( "[2]" );
  it = result.begin();
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "deepsearch + predicate 1: //bbb[@name]";
  result = aaa->findTagList( "//bbb[@name]" );
  it = result.begin();
  if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "deepsearch + predicate 2: //bbb[@xyz]";
  result = aaa->findTagList( "//bbb[@xyz]" );
  it = result.begin();
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  // -------
  name = "deepsearch + predicate + literal 1: //bbb[@name='b1']";
  result = aaa->findTagList( "//bbb[@name='b1']" );
  it = result.begin();
  if( result.size() != 1 || (*it) != bbb )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }

  name = "deepsearch + predicate + literal 2: //bbb[@name='test@test2']";
  bbb->addAttribute( "blah", "test@test2" );
  result = aaa->findTagList( "//bbb[@blah='test@test2']" );
  it = result.begin();
  if( result.size() != 1 || (*it) != bbb )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  name = "deepsearch + predicate + literal + child: //bbb[@name='b1']/hhh";
  bbb->addAttribute( "blah", "test@test2" );
  result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh" );
  it = result.begin();
  if( result.size() != 1 || (*it) != hhh )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  name = "deepsearch + predicate + literal + child + predicate 1: //bbb[@name='b1']/hhh[@name]";
  bbb->addAttribute( "blah", "test@test2" );
  result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name]" );
  it = result.begin();
  if( result.size() != 1 || (*it) != hhh )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  name = "deepsearch + predicate + literal + child + predicate 2: //bbb[@name='b1']/hhh[@name1]";
  bbb->addAttribute( "blah", "test@test2" );
  result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name1]" );
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  name = "deepsearch + predicate + literal + child + predicate + literal: //bbb[@name='b1']/hhh[@name='h1']";
  bbb->addAttribute( "blah", "test@test2" );
  result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name='h1']" );
  it = result.begin();
  if( result.size() != 1 || (*it) != hhh )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  name = "deepsearch + predicate + literal + child + predicate + literal: //bbb[@name='b1']/hhh[@name='h2']";
  bbb->addAttribute( "blah", "test@test2" );
  result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name='h2']" );
  if( result.size() != 0 )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

//   // -------
//   name = "deepsearch + predicate + path 1: //bbb[hhh]";
//   result = aaa->findTagList( "//bbb[hhh]" );
//   it = result.begin();
//   if( result.size() != 1 || (*it) != bbb )
//   {
//     ++fail;
//     printResult( name, result );
//     fprintf( stderr, "test '%s' failed\n", name.c_str() );
//   }
//   printf( "--------------------------------------------------------------\n" );

//   // -------
//   name = "filter 1: //bbb[1+2]";
//   result = aaa->findTagList( "//bbb[1+2]" );
//   it = result.begin();
//   if( result.size() != 1 || (*it) != iii )
//   {
//     ++fail;
//     printResult( name, result );
//     fprintf( stderr, "test '%s' failed\n", name.c_str() );
//   }
//   printf( "--------------------------------------------------------------\n" );




  // -- predicates --


  name = "cdata: //ccc";
  if( aaa->findCData( "//ccc" ) != "abc" )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );

  name = "cdata: //ddd";
  if( aaa->findCData( "//ddd" ) != "bcd" )
  {
    ++fail;
    printResult( name, result );
    fprintf( stderr, "test '%s' failed\n", name.c_str() );
  }
//   printf( "--------------------------------------------------------------\n" );













//   Tag *c2 = new Tag( ddd, "ccc" );
//   Tag *c3 = new Tag( c2, "ccc" );
//   Tag *c4 = new Tag( eee, "ccc" );
//   Tag *c5 = new Tag( c4, "ccc" );

// <aaa>
//   <bbb name='b1'>
//     <hhh>
//       <bbb name='b3'/>
//     </hhh>
//     <bbb name='b2'/>
//   </bbb>
//   <ccc>
//     <ddd>
//       <ccc>
//         <ccc/>
//       </ccc>
//     </ddd>
//     <eee>
//       <ccc>
//         <ccc/>
//       </ccc>
//     </eee>
//   </ccc>
//   <fff>
//     <ggg/>
//   </fff>
// </aaa>










  delete aaa;

  if( fail == 0 )
  {
    printf( "XPath: OK\n" );
    return 0;
  }
  else
  {
    fprintf( stderr, "XPath: %d test(s) failed\n", fail );
    return 1;
  }

}