/**
  * @test
  */
 function iteration()
 {
     $reader = new XMLReaderStub('<!-- comment --><root><child></child></root>');
     $it = new XMLChildElementIterator($reader);
     $this->assertEquals(false, $it->valid());
     $this->assertSame(null, $it->valid());
     $it->rewind();
     $this->assertEquals(true, $it->valid());
     $this->assertEquals('child', $it->current()->getName());
     $it->next();
     $this->assertEquals(false, $it->valid());
     $reader = new XMLReaderStub('<root><none></none><one><child></child></one><none></none></root>');
     $base = new XMLElementIterator($reader);
     $base->rewind();
     $root = $base->current();
     $this->assertEquals('root', $root->getName());
     $children = $root->getChildElements();
     $this->assertEquals('root', $reader->name);
     $children->rewind();
     $this->assertEquals('none', $reader->name);
     $children->next();
     $this->assertEquals('one', $reader->name);
     $childChildren = new XMLChildElementIterator($reader);
     $this->assertEquals('child', $childChildren->current()->getName());
     $childChildren->next();
     $this->assertEquals(false, $childChildren->valid());
     $this->assertEquals('none', $reader->name);
     $childChildren->next();
     $this->assertEquals('none', $reader->name);
     $this->assertEquals(true, $children->valid());
     $children->next();
     $this->assertEquals(false, $children->valid());
     // children w/o descendants
     $reader->rewind();
     $expected = array('none', 'one', 'none');
     $root = $base->current();
     $this->assertEquals('root', $root->getName());
     $index = 0;
     $count = 0;
     foreach ($root->getChildElements() as $index => $child) {
         $this->assertSame($count++, $index);
         $this->assertEquals($expected[$index], $reader->name);
     }
     $this->assertEquals(count($expected), $count);
     // children w/ descendants
     $reader->rewind();
     $expected = array('none', 'one', 'child', 'none');
     $root = $base->current();
     $this->assertEquals('root', $root->getName());
     $index = 0;
     $count = 0;
     foreach ($root->getChildElements(null, true) as $index => $child) {
         $this->assertSame($count++, $index);
         $this->assertEquals($expected[$index], $reader->name);
     }
     $this->assertEquals(count($expected), $count);
 }
 $reader = new XMLReader();
 $result = $reader->open($file);
 if (!$result) {
     echo "unable to open input file.\n";
     foreach (libxml_get_errors() as $error) {
         print_r($error);
     }
     libxml_use_internal_errors($saved);
     exit(1);
 }
 $start = microtime(true);
 $lastCount = 0;
 $lastRuntime = 0;
 $messageLastLen = 0;
 /** @var XMLChildElementIterator|XMLReaderNode[] $children */
 $children = new XMLChildElementIterator($reader, null, true);
 foreach ($children as $index => $child) {
     $path = $children->getNodePath();
     $level = $reader->depth;
     $runtime = microtime(true) - $start;
     if ($index % 1000 === 0) {
         if ($lastRuntime) {
             $step = $index - $lastCount;
             $perSec = $step / ($runtime - $lastRuntime);
         } else {
             $perSec = '?';
         }
         $spacer = '';
         $message = sprintf("%05d %' -48s (%.2f secs; %.2f per second)", $index, $path, $runtime, $perSec);
         $messageLastLen && ($need = max(0, $messageLastLen - strlen($message))) && ($spacer = str_repeat(' ', $need));
         $messageLastLen = strlen($message);