getSelectors(); $this->assertEquals('id', $selectors[0][0]['key']); } public function testParseSelectorStringClass() { $selector = new Selector('div.post'); $selectors = $selector->getSelectors(); $this->assertEquals('class', $selectors[0][0]['key']); } public function testParseSelectorStringAttribute() { $selector = new Selector('div[visible=yes]'); $selectors = $selector->getSelectors(); $this->assertEquals('yes', $selectors[0][0]['value']); } public function testParseSelectorStringNoKey() { $selector = new Selector('div[!visible]'); $selectors = $selector->getSelectors(); $this->assertTrue($selectors[0][0]['noKey']); } public function testFind() { $root = new HtmlNode('root'); $parent = new HtmlNode('div'); $child1 = new HtmlNode('a'); $child2 = new HtmlNode('p'); $parent->addChild($child1); $parent->addChild($child2); $root->addChild($parent); $selector = new Selector('div a'); $this->assertEquals($child1->id(), $selector->find($root)[0]->id()); } public function testFindId() { $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('a')); $child2 = new HtmlNode(new Tag('p')); $child2->getTag()->setAttributes([ 'id' => [ 'value' => 'content', 'doubleQuote' => true, ], ]); $parent->addChild($child1); $parent->addChild($child2); $selector = new Selector('#content'); $this->assertEquals($child2->id(), $selector->find($parent)[0]->id()); } public function testFindClass() { $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('a')); $child2 = new HtmlNode(new Tag('p')); $child3 = new HtmlNode('a'); $child3->getTag()->setAttributes([ 'class' => [ 'value' => 'link', 'doubleQuote' => true, ], ]); $parent->addChild($child1); $parent->addChild($child2); $parent->addChild($child3); $selector = new Selector('.link'); $this->assertEquals($child3->id(), $selector->find($parent)[0]->id()); } public function testFindClassMultiple() { $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('a')); $child2 = new HtmlNode(new Tag('p')); $child3 = new HtmlNode(new Tag('a')); $child3->getTag()->setAttributes([ 'class' => [ 'value' => 'link outer', 'doubleQuote' => false, ], ]); $parent->addChild($child1); $parent->addChild($child2); $parent->addChild($child3); $selector = new Selector('.outer'); $this->assertEquals($child3->id(), $selector->find($parent)[0]->id()); } public function testFindWild() { $root = new HtmlNode(new Tag('root')); $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('a')); $child2 = new HtmlNode(new Tag('p')); $child3 = new HtmlNode(new Tag('a')); $root->addChild($parent); $parent->addChild($child1); $parent->addChild($child2); $child2->addChild($child3); $selector = new Selector('div * a'); $this->assertEquals($child3->id(), $selector->find($root)[0]->id()); } public function testFindMultipleSelectors() { $root = new HtmlNode(new Tag('root')); $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('a')); $child2 = new HtmlNode(new Tag('p')); $child3 = new HtmlNode(new Tag('a')); $root->addChild($parent); $parent->addChild($child1); $parent->addChild($child2); $child2->addChild($child3); $selector = new Selector('a, p'); $this->assertEquals(3, count($selector->find($root))); } public function testFindXpathKeySelector() { $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('a')); $child2 = new HtmlNode(new Tag('p')); $child3 = new HtmlNode(new Tag('a')); $child3->getTag()->setAttributes([ 'class' => [ 'value' => 'link outer', 'doubleQuote' => false, ], ]); $parent->addChild($child1); $parent->addChild($child2); $parent->addChild($child3); $selector = new Selector('div[1]'); $this->assertEquals($parent->id(), $selector->find($parent)[0]->id()); } public function testFindChildMultipleLevelsDeep() { $root = new HtmlNode(new Tag('root')); $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('ul')); $child2 = new HtmlNode(new Tag('li')); $root->addChild($parent); $parent->addChild($child1); $child1->addChild($child2); $selector = new Selector('div li'); $this->assertEquals(1, count($selector->find($root))); } public function testFindAllChildren() { $root = new HtmlNode(new Tag('root')); $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('ul')); $child2 = new HtmlNode(new Tag('span')); $child3 = new HtmlNode(new Tag('ul')); $root->addChild($parent); $parent->addChild($child1); $child2->addChild($child3); $parent->addChild($child2); $selector = new Selector('div ul'); $this->assertEquals(2, count($selector->find($root))); } public function testFindChildUsingChildSelector() { $root = new HtmlNode(new Tag('root')); $parent = new HtmlNode(new Tag('div')); $child1 = new HtmlNode(new Tag('ul')); $child2 = new HtmlNode(new Tag('span')); $child3 = new HtmlNode(new Tag('ul')); $root->addChild($parent); $parent->addChild($child1); $child2->addChild($child3); $parent->addChild($child2); $selector = new Selector('div > ul'); $this->assertEquals(1, count($selector->find($root))); } }