From: <dg...@us...> - 2009-07-30 15:49:48
|
Revision: 1917 http://simpletest.svn.sourceforge.net/simpletest/?rev=1917&view=rev Author: dgheath Date: 2009-07-30 15:49:39 +0000 (Thu, 30 Jul 2009) Log Message: ----------- Add test for edge case of labels Modified Paths: -------------- simpletest/trunk/test/parsing_test.php simpletest/trunk/tidy_parser.php Modified: simpletest/trunk/test/parsing_test.php =================================================================== --- simpletest/trunk/test/parsing_test.php 2009-07-30 14:52:13 UTC (rev 1916) +++ simpletest/trunk/test/parsing_test.php 2009-07-30 15:49:39 UTC (rev 1917) @@ -387,23 +387,23 @@ } function testSettingTextArea() { - $raw = '<html><head><form>' . + $raw = '<form>' . '<textarea name="a">aaa</textarea>' . '<input type="submit">' . - '</form></head></html>'; + '</form>'; $page = $this->whenVisiting('http://host', $raw); $this->assertTrue($page->setField(new SimpleByName('a'), 'AAA')); $this->assertEqual($page->getField(new SimpleByName('a')), 'AAA'); } function testSettingSelectionField() { - $raw = '<html><head><form>' . + $raw = '<form>' . '<select name="a">' . '<option>aaa</option>' . '<option selected>bbb</option>' . '</select>' . '<input type="submit">' . - '</form></head></html>'; + '</form>'; $page = $this->whenVisiting('http://host', $raw); $this->assertEqual($page->getField(new SimpleByName('a')), 'bbb'); $this->assertFalse($page->setField(new SimpleByName('a'), 'ccc')); @@ -412,11 +412,11 @@ } function testSettingSelectionFieldByEnclosingLabel() { - $raw = '<html><head><form>' . + $raw = '<form>' . '<label>Stuff' . '<select name="a"><option selected>A</option><option>B</option></select>' . '</label>' . - '</form></head></html>'; + '</form>'; $page = $this->whenVisiting('http://host', $raw); $this->assertEqual($page->getField(new SimpleByLabel('Stuff')), 'A'); $this->assertTrue($page->setField(new SimpleByLabel('Stuff'), 'B')); @@ -424,16 +424,43 @@ } function testSettingRadioButtonByEnclosingLabel() { - $raw = '<html><head><form>' . + $raw = '<form>' . '<label>A<input type="radio" name="r" value="a" checked></label>' . '<label>B<input type="radio" name="r" value="b"></label>' . - '</form></head></html>'; + '</form>'; $page = $this->whenVisiting('http://host', $raw); $this->assertEqual($page->getField(new SimpleByLabel('A')), 'a'); $this->assertTrue($page->setField(new SimpleBylabel('B'), 'b')); $this->assertEqual($page->getField(new SimpleByLabel('B')), 'b'); } + function testCanParseInputsWithAllKindsOfAttributeQuoting() { + $raw = '<form>' . + '<input type="checkbox" name=\'first\' value=one checked></input>' . + '<input type=checkbox name="second" value="two"></input>' . + '<input type=checkbox name="third" value=\'three\' checked="checked" />' . + '</form>'; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('first')), 'one'); + $this->assertEqual($page->getField(new SimpleByName('second')), false); + $this->assertEqual($page->getField(new SimpleByName('third')), 'three'); + } + + function testEnclosingLabelsCanAttachToOtherInputsUsingForAttribute() { + $raw = '<form>' . + '<label for="that">Label <input type=text name=this value=a></label>' . + '<input type=text id=that name=that value=b>' . + '</form>'; + $page = $this->whenVisiting('http://host', $raw); + $this->assertEqual($page->getField(new SimpleByName('this')), 'a'); + $this->assertEqual($page->getField(new SimpleByName('that')), 'b'); + $this->assertTrue($page->setField(new SimpleByLabel('Label'), 'z')); + $this->assertEqual($page->getField(new SimpleByName('this')), 'z'); + // TODO: the old php parser only attaches the label to the encosed input, not to the + // input referenced by id in the 'for' attribute. Do we want to retain this behaviour? + // $this->assertEqual($page->getField(new SimpleByName('that')), 'b'); + } + function urlToString($url) { return $url->asString(); } @@ -462,7 +489,7 @@ } -abstract class TestOfParsingUsingTidyParser extends TestOfParsing { +class TestOfParsingUsingTidyParser extends TestOfParsing { function whenVisiting($url, $content) { $response = new MockSimpleHttpResponse(); Modified: simpletest/trunk/tidy_parser.php =================================================================== --- simpletest/trunk/tidy_parser.php 2009-07-30 14:52:13 UTC (rev 1916) +++ simpletest/trunk/tidy_parser.php 2009-07-30 15:49:39 UTC (rev 1917) @@ -75,10 +75,9 @@ ->addContent($this->innerHtml($node))); } elseif (in_array($node->name, array('input', 'button', 'textarea', 'select'))) { $this->addWidgetToForm($node, $form, $enclosing_label); - } elseif ($node->name == 'label' and $this->hasFor($node)) { + } elseif ($node->name == 'label') { $this->labels[] = $this->tags()->createTag($node->name, (array)$node->attribute) ->addContent($this->innerHtml($node)); - } elseif ($node->name == 'label' and ! $this->hasFor($node)) { if ($node->hasChildren()) { foreach ($node->child as $child) { $this->walkForm($child, $form, SimplePage::normalise($this->innerHtml($node))); @@ -122,12 +121,12 @@ } private function attributes($node) { - if (! preg_match('|<.*?\s(.*?)/?>|', $node->value, $first_tag_contents)) { + if (! preg_match('|<[^ ]+\s(.*?)/?>|s', $node->value, $first_tag_contents)) { return array(); } $attributes = array(); - preg_match_all('/(\S+\s*=\s*\'[^\']*\'|\S+?\s*=\s*"[^"]*"|[^ =]+\s*=\s*[^ "\']+?|[^ "\']+)/', $first_tag_contents[1], $matches); - foreach($matches[1] as $unparsed) { + preg_match_all('/\S+\s*=\s*\'[^\']*\'|(\S+\s*=\s*"[^"]*")|([^ =]+\s*=\s*[^ "\']+?)|[^ "\']+/', $first_tag_contents[1], $matches); + foreach($matches[0] as $unparsed) { $attributes = $this->mergeAttribute($attributes, $unparsed); } return $attributes; @@ -136,7 +135,7 @@ private function mergeAttribute($attributes, $raw) { $parts = explode('=', $raw); list($name, $value) = count($parts) == 1 ? array($parts[0], $parts[0]) : $parts; - $attributes[trim($name)] = $this->dequote($value); + $attributes[trim($name)] = $this->dequote(trim($value)); return $attributes; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |