| 
<?php
 require_once 'URLNormalizer.php';
 
 class URLNormalizerTest extends PHPUnit_Framework_TestCase
 {
 protected $fixture;
 private $test_url = 'http://www.yahoo.com/';
 
 protected function setUp()
 {
 $this->fixture = new URLNormalizer();
 $this->fixture->setUrl( $this->test_url );
 }
 
 public function testClassCanBeInstantiated() {
 $this->assertTrue( is_object( $this->fixture ) );
 }
 
 public function testObjectIsOfCorrectType() {
 $this->assertTrue( get_class( $this->fixture ) == 'URLNormalizer' );
 }
 
 public function testObjectHasGetUrlMethod() {
 $this->assertTrue( method_exists( $this->fixture, 'getUrl' ) );
 }
 
 public function testSetUrl() {
 $this->assertTrue( $this->fixture->getUrl() == $this->test_url );
 }
 
 public function testObjectHasGetSchemeMethod() {
 $this->assertTrue( method_exists( $this->fixture, 'getScheme' ) );
 }
 
 public function testSchemeExtractedFromUrl() {
 $this->assertTrue( $this->fixture->getScheme() == 'http' );
 }
 
 /**
 * @dataProvider provider
 */
 public function testUrlsAreNormalised( $url, $normalised_url ) {
 $this->fixture->setUrl( $url );
 
 $this->assertEquals( $normalised_url, $this->fixture->normalize() );
 }
 
 public function provider() {
 // tests from http://en.wikipedia.org/wiki/URL_normalization
 return array(
 array( 'HTTP://www.Example.com/',            'http://www.example.com/' ),  # converting the scheme and host to lowercase
 array( 'http://www.example.com',             'http://www.example.com/' ),  # add trailing /
 array( 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d', 'example://a/b/c/%7Bfoo%7D' ),
 );
 }
 
 public function testCaseIsNormalization() {
 $this->fixture->setUrl( 'http://www.yahoo.com/%a1' );
 $this->assertEquals( 'http://www.yahoo.com/%A1', $this->fixture->normalize() );
 }
 
 /**
 * @dataProvider dotSegmentProvider
 *
 * http://www.apps.ietf.org/rfc/rfc3986.html#sec-5.2.4
 */
 public function testRemoveDotSegments( $path, $normalised_path ) {
 $this->assertEquals( $normalised_path, $this->fixture->removeDotSegments( $path ) );
 }
 
 public function dotSegmentProvider() {
 return array(
 array( '../',                '' ),
 array( './',                 '' ),
 array( '/./',                '/' ),
 array( '/.',                 '/' ),
 array( '/a/b/c/./../../g',   '/a/g' ),
 array( 'mid/content=5/../6', 'mid/6' ),
 array( '/foo/bar/.',         '/foo/bar/' ),
 array( '/foo/bar/./',        '/foo/bar/' ),
 array( '/foo/bar/..',        '/foo/' ),
 array( '/foo/bar/../',       '/foo/' ),
 array( '/foo/bar/../baz',    '/foo/baz' ),
 array('/foo/bar/../..',              '/'),
 array('/foo/bar/../../'  ,             '/'),
 array('/foo/bar/../../baz'  ,          '/baz'),
 #array('/foo/bar/../../../baz' ,        '/../baz'),
 array( 'a/./b/../b/',                        'a/b/' ),
 
 );
 }
 
 public function testDecodingUnreservedUrlChars() {
 $this->assertEquals( 'c', $this->fixture->urlDecodeUnreservedChars( '%63' ) );
 $this->assertEquals( 'c/%7b', $this->fixture->urlDecodeUnreservedChars( '%63/%7b' ) );
 $this->assertEquals( 'eXAMPLE://a/./b/../b/c/%7bfoo%7d', $this->fixture->urlDecodeUnreservedChars( 'eXAMPLE://a/./b/../b/%63/%7bfoo%7d' ) );
 }
 
 /**
 * @dataProvider schemeData
 *
 * http://www.apps.ietf.org/rfc/rfc3986.html#sec-6.2.3
 */
 public function testSchemeBasedNormalization( $url ) {
 $expected_uri = 'http://example.com/';
 
 $this->fixture->setUrl( $url );
 $this->assertEquals( $expected_uri, $this->fixture->normalize() );
 
 }
 
 public function schemeData() {
 return array( array( 'http://example.com' ),
 array( 'http://example.com/' ),
 array( 'http://example.com:/' ),
 array( 'http://example.com:80/' ), );
 }
 
 public function testQueryParametersArePreserved() {
 $url = 'http://fancysite.nl/links/doit.pl?id=2029';
 
 $this->fixture->setUrl( $url );
 $this->assertEquals( $url, $this->fixture->normalize() );
 }
 
 public function testFragmentIdentifiersArePreserved() {
 $url = 'http://example.com/index.html#fragment';
 
 $this->fixture->setUrl( $url );
 $this->assertEquals( $url, $this->fixture->normalize() );
 }
 }
 
 |