Index: wp-testcase/test_includes_functions.php
===================================================================
--- wp-testcase/test_includes_functions.php	(revision 482)
+++ wp-testcase/test_includes_functions.php	(working copy)
@@ -430,4 +430,103 @@
 	}
 }
 
+class TestQueryArgs extends WPTestCase {
+
+	private $_backup_request_uri = '';
+
+	public function setup(){
+		$this->_backup_request_uri = $_SERVER['REQUEST_URI'];
+	}
+	
+	public function teardown() {
+		$_SERVER['REQUEST_URI'] = $this->_backup_request_uri;
+	}
+
+	public function test_array_usage() {
+		$urls = array(
+			'/wordpress/?p=123'                 => '/wordpress/?p=456&q=abc&r&s&t=u&v&w=@',
+			'/wordpress/2011/12/08/sample-post' => '/wordpress/2011/12/08/sample-post?p=456&q=abc&r&s&t=u&v&w=@',
+		);
+		$encode_urls = array(
+			'/wordpress/?p=123'                 => '/wordpress/?p=456&q=abc&r=%26s&t=u%26v&w=%40',
+			'/wordpress/2011/12/08/sample-post' => '/wordpress/2011/12/08/sample-post?p=456&q=abc&r=%26s&t=u%26v&w=%40',
+		);
+		$args = array(
+			'p' => '456',
+			'q' => 'abc',
+			'r' => '&s',
+			't' => 'u&v',
+			'w' => '@'
+		);
+		foreach ( $urls as $k => $v ) {
+			$_SERVER['REQUEST_URI'] = $k;
+			$this->assertEquals( $v, add_query_arg( $args ) );
+		}
+		foreach ( $encode_urls as $k => $v ) {
+			$_SERVER['REQUEST_URI'] = $k;
+			$this->assertEquals( $v, add_query_arg( $args, false, false, true ) );
+		}
+	}
+
+	public function test_key_value_usage() {
+		$urls = array(
+			'/wordpress/?p=123'                 => '/wordpress/?p=456&q=abc&r&s&t=u&v&w=@',
+			'/wordpress/2011/12/08/sample-post' => '/wordpress/2011/12/08/sample-post?p=456&q=abc&r&s&t=u&v&w=@',
+		);
+		$encode_urls = array(
+			'/wordpress/?p=123'                 => '/wordpress/?p=456&q=abc&r=%26s&t=u%26v&w=%40',
+			'/wordpress/2011/12/08/sample-post' => '/wordpress/2011/12/08/sample-post?p=456&q=abc&r=%26s&t=u%26v&w=%40',
+		);
+		$args = array(
+			'p' => '456',
+			'q' => 'abc',
+			'r' => '&s',
+			't' => 'u&v',
+			'w' => '@'
+		);
+		foreach ( $urls as $k => $v ) {
+			$url = $k;
+			foreach ( $args as $_k => $_v )
+				$url = add_query_arg( $_k, $_v, $url );
+			$this->assertEquals( $v, $url );
+		}
+		foreach ( $encode_urls as $k => $v ) {
+			$url = $k;
+			foreach ( $args as $_k => $_v )
+				$url = add_query_arg( $_k, $_v, $url, true );
+			$this->assertEquals( $v, $url );
+		}
+	}
+	
+	public function test_encoding() {
+		$url = '/wordpress/';
+		$args = '!@#$%^&*()_+=-[]{}\|";:\',.<>/?`~';
+		$this->assertEquals( $url . '?args=' . $args, add_query_arg('args', $args, $url) );
+		$this->assertEquals( $url . '?args=' . rawurlencode($args), add_query_arg('args', $args, $url, true) );
+	}
+
+	public function test_remove_arg() {
+
+		// Arg from the end
+		$url = '/wordpress/?p=123';
+		$this->assertEquals( '/wordpress/', remove_query_arg('p', $url) );
+
+		// Arg from the middle
+		$url = '/wordpress/?p=123&q=456&r&s';
+		$this->assertEquals( '/wordpress/?p=123&q=456&s', remove_query_arg('r', $url) );	
+
+		// Multiple calls
+		$url = '/wordpress/?p=123&q=456&r&s';
+		$url = remove_query_arg('s', $url);
+		$url = remove_query_arg('r', $url);
+		$url = remove_query_arg('q', $url);
+		$url = remove_query_arg('p', $url);
+		$this->assertEquals( '/wordpress/', $url );	
+	
+		// Trailing ampersand
+		$url = '/wordpress/?p=123&';
+		$this->assertEquals( '/wordpress/', remove_query_arg('p', $url) );
+	}
+}
+
 ?>
