Repository: incubator-juneau
Updated Branches:
  refs/heads/master 953f1d9e3 -> cdebb74d7


Tests for UriContext class.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/cdebb74d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/cdebb74d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/cdebb74d

Branch: refs/heads/master
Commit: cdebb74d7a5d8a48be9eacf8e21802dad179d780
Parents: 953f1d9
Author: JamesBognar <[email protected]>
Authored: Wed May 24 09:49:37 2017 -0400
Committer: JamesBognar <[email protected]>
Committed: Wed May 24 09:49:37 2017 -0400

----------------------------------------------------------------------
 .../test/java/org/apache/juneau/TestUtils.java  |    2 +
 .../utils/UriContextResolutionComboTest.java    | 1632 +++++++++++-------
 .../juneau/utils/UriContextUriComboTest.java    |  445 ++---
 .../main/java/org/apache/juneau/UriContext.java |   21 +-
 .../org/apache/juneau/internal/StringUtils.java |   14 +-
 5 files changed, 1301 insertions(+), 813 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/cdebb74d/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java 
b/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
index 4405efd..c53e3bf 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/TestUtils.java
@@ -497,6 +497,8 @@ public class TestUtils {
         * Same as {@link Assert#assertEquals(String,String,String) except 
takes in a MessageFormat-style message.
         */
        public static void assertEquals(Object expected, Object actual, String 
msg, Object...args) {
+               if ("xxx".equals(expected))
+                       System.err.println("actual=["+actual+"]");
                if (! isEquals(expected, actual))
                        throw new ComparisonFailure(MessageFormat.format(msg, 
args), toString(expected), toString(actual));                     
        }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/cdebb74d/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
index e6bf460..2995cf6 100644
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextResolutionComboTest.java
@@ -12,6 +12,13 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.utils;
 
+import static org.apache.juneau.TestUtils.*;
+import static org.apache.juneau.UriRelativity.*;
+import static org.apache.juneau.UriResolution.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
 import org.junit.*;
 import org.junit.runner.*;
 import org.junit.runners.*;
@@ -21,607 +28,1028 @@ import org.junit.runners.*;
  */
 @RunWith(Parameterized.class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
-@Ignore
 public class UriContextResolutionComboTest {
-//
-//     @Parameterized.Parameters
-//     public static Collection<Object[]> getInput() {
-//             return Arrays.asList(new Object[][] {
-//
-//                     // Happy cases - All URL parts known.
-//                     {
-//                             input(
-//                                     "Happy-1",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-2",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-3",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "/foobar",
-//                                     "http://host:port/foobar";,
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-4",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "/",
-//                                     "http://host:port";,
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-5",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "foobar",
-//                                     
"http://host:port/context/resource/foobar";,
-//                                     "/context/resource/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-6",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "",
-//                                     
"http://host:port/context/resource/path";,
-//                                     "/context/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-7",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "context:/foo",
-//                                     "http://host:port/context/foo";,
-//                                     "/context/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-8",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "context:/",
-//                                     "http://host:port/context";,
-//                                     "/context"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-9",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "servlet:/foo",
-//                                     "http://host:port/context/resource/foo";,
-//                                     "/context/resource/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-10",
-//                                     
"http://host:port","/context","/resource","/path";,
-//                                     "servlet:/",
-//                                     "http://host:port/context/resource";,
-//                                     "/context/resource"
-//                             )
-//                     },
-//                     
-//                     // Multiple context and resource parts
-//                     {
-//                             input(
-//                                     "MultiContextResource-1",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-2",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-3",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "/foobar",
-//                                     "http://host:port/foobar";,
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-4",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "/",
-//                                     "http://host:port";,
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-5",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "foobar",
-//                                     
"http://host:port/c1/c2/r1/r2/p1/foobar";,
-//                                     "/c1/c2/r1/r2/p1/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-6",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "",
-//                                     "http://host:port/c1/c2/r1/r2/p1/p2";,
-//                                     "/c1/c2/r1/r2/p1/p2"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-7",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "context:/foo",
-//                                     "http://host:port/c1/c2/foo";,
-//                                     "/c1/c2/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-8",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "context:/",
-//                                     "http://host:port/c1/c2";,
-//                                     "/c1/c2"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-9",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "servlet:/foo",
-//                                     "http://host:port/c1/c2/r1/r2/foo";,
-//                                     "/c1/c2/r1/r2/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "MultiContextResource-10",
-//                                     
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "servlet:/",
-//                                     "http://host:port/c1/c2/r1/r2";,
-//                                     "/c1/c2/r1/r2"
-//                             )
-//                     },
-//                     
-//                     // No authority given
-//                     {
-//                             input(
-//                                     "NoAuthority-1",
-//                                     "","/context","/resource","/path",
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-2",
-//                                     "","/context","/resource","/path",
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-3",
-//                                     "","/context","/resource","/path",
-//                                     "/foobar",
-//                                     "/foobar",
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-4",
-//                                     "","/context","/resource","/path",
-//                                     "/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-5",
-//                                     "","/context","/resource","/path",
-//                                     "foobar",
-//                                     "/context/resource/foobar",
-//                                     "/context/resource/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-6",
-//                                     "","/context","/resource","/path",
-//                                     "",
-//                                     "/context/resource/path",
-//                                     "/context/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-7",
-//                                     "","/context","/resource","/path",
-//                                     "context:/foo",
-//                                     "/context/foo",
-//                                     "/context/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-8",
-//                                     "","/context","/resource","/path",
-//                                     "context:/",
-//                                     "/context",
-//                                     "/context"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-9",
-//                                     "","/context","/resource","/path",
-//                                     "servlet:/foo",
-//                                     "/context/resource/foo",
-//                                     "/context/resource/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-10",
-//                                     "","/context","/resource","/path",
-//                                     "servlet:/",
-//                                     "/context/resource",
-//                                     "/context/resource"
-//                             )
-//                     },
-//                     
-//                     // No authority or context given
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-1",
-//                                     "","","/resource","/path",
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-2",
-//                                     "","","/resource","/path",
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-3",
-//                                     "","","/resource","/path",
-//                                     "/foobar",
-//                                     "/foobar",
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-4",
-//                                     "","","/resource","/path",
-//                                     "/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-5",
-//                                     "","","/resource","/path",
-//                                     "foobar",
-//                                     "/resource/foobar",
-//                                     "/resource/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-6",
-//                                     "","","/resource","/path",
-//                                     "",
-//                                     "/resource/path",
-//                                     "/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-7",
-//                                     "","","/resource","/path",
-//                                     "context:/foo",
-//                                     "/foo",
-//                                     "/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-8",
-//                                     "","","/resource","/path",
-//                                     "context:/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-9",
-//                                     "","","/resource","/path",
-//                                     "servlet:/foo",
-//                                     "/resource/foo",
-//                                     "/resource/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContext-10",
-//                                     "","","/resource","/path",
-//                                     "servlet:/",
-//                                     "/resource",
-//                                     "/resource"
-//                             )
-//                     },
-//
-//                     // No authority or context or resource given
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-1",
-//                                     "","","","/path",
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-2",
-//                                     "","","","/path",
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-3",
-//                                     "","","","/path",
-//                                     "/foobar",
-//                                     "/foobar",
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-4",
-//                                     "","","","/path",
-//                                     "/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-5",
-//                                     "","","","/path",
-//                                     "foobar",
-//                                     "/foobar",
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-6",
-//                                     "","","","/path",
-//                                     "",
-//                                     "/path",
-//                                     "/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-7",
-//                                     "","","","/path",
-//                                     "context:/foo",
-//                                     "/foo",
-//                                     "/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-8",
-//                                     "","","","/path",
-//                                     "context:/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-9",
-//                                     "","","","/path",
-//                                     "servlet:/foo",
-//                                     "/foo",
-//                                     "/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityOrContextOrResource-10",
-//                                     "","","","/path",
-//                                     "servlet:/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//                     
-//                     // No context or resource given.
-//                     {
-//                             input(
-//                                     "NoContextOrResource-1",
-//                                     "http://host:port","","","/path";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";,
-//                                     "http://foo.com:123/foobar";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-2",
-//                                     "http://host:port","","","/path";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-3",
-//                                     "http://host:port","","","/path";,
-//                                     "/foobar",
-//                                     "http://host:port/foobar";,
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-4",
-//                                     "http://host:port","","","/path";,
-//                                     "/",
-//                                     "http://host:port";,
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-5",
-//                                     "http://host:port","","","/path";,
-//                                     "foobar",
-//                                     "http://host:port/foobar";,
-//                                     "/foobar"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-6",
-//                                     "http://host:port","","","/path";,
-//                                     "",
-//                                     "http://host:port/path";,
-//                                     "/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-7",
-//                                     "http://host:port","","","/path";,
-//                                     "context:/foo",
-//                                     "http://host:port/foo";,
-//                                     "/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-8",
-//                                     "http://host:port","","","/path";,
-//                                     "context:/",
-//                                     "http://host:port";,
-//                                     "/"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-9",
-//                                     "http://host:port","","","/path";,
-//                                     "servlet:/foo",
-//                                     "http://host:port/foo";,
-//                                     "/foo"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextOrResource-10",
-//                                     "http://host:port","","","/path";,
-//                                     "servlet:/",
-//                                     "http://host:port";,
-//                                     "/"
-//                             )
-//                     },
-//             });             
-//     }
-//     
-//     public static Input input(String label, String authority, String 
context, String resource, String path, String uri, String expectedAbsolute, 
String expectedRootRelative) {
-//             return new Input(label, authority, context, resource, path, 
uri, expectedAbsolute, expectedRootRelative);
-//     }
-//     
-//     public static class Input {
-//             private final UriContext uriContext;
-//             private final String label, uri, expectedAbsolute, 
expectedRootRelative;
-//             
-//             public Input(String label, String authority, String context, 
String resource, String path, String uri, String expectedAbsolute, String 
expectedRootRelative) {
-//                     this.label = label;
-//                     this.uriContext = new UriContext(authority, context, 
resource, path);
-//                     this.uri = uri;
-//                     this.expectedAbsolute = expectedAbsolute;
-//                     this.expectedRootRelative = expectedRootRelative;
-//             }
-//     }
-//     
-//     private Input in;
-//     
-//     public UriContextResolutionComboTest(Input in) throws Exception {
-//             this.in = in;
-//     }
-//     
-//     @Test
-//     public void testAbsolute() {
-//             assertEquals(in.expectedAbsolute, 
in.uriContext.resolve(in.uri), "{0}: testAbsolute() failed", in.label);
-//     }
-//             
-//     @Test
-//     public void testRootRelative() {
-//             assertEquals(in.expectedRootRelative, 
in.uriContext.resolveRootRelative(in.uri), "{0}: testRootRelative() failed", 
in.label);
-//     }
-//
-//     @Test
-//     public void testAbsoluteAppend() {
-//             assertEquals(in.expectedAbsolute, in.uriContext.append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", in.label);
-//     }
-//             
-//     @Test
-//     public void testRootRelativeAppend() {
-//             assertEquals(in.expectedRootRelative, 
in.uriContext.appendRootRelative(new StringBuilder(), in.uri).toString(), "{0}: 
testRootRelative() failed", in.label);
-//     }
+
+       @Parameterized.Parameters
+       public static Collection<Object[]> getInput() {
+               return Arrays.asList(new Object[][] {
+
+                       // Happy cases - All URL parts known.
+                       {
+                               "Happy-1a",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";,
+                                       "http://foo.com:123/foobar";
+                               ),
+                               results(
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";
+                               )
+                       },
+                       {
+                               "Happy-2",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";,
+                                       "http://foo.com:123";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";
+                               )
+                       },
+                       {
+                               "Happy-3",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";,
+                                       "/foobar"
+                               ),
+                               results(
+                                       "http://host:port/foobar";,
+                                       "http://host:port/foobar";,
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar"
+                               )
+                       },
+                       {
+                               "Happy-4",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       "/"
+                               ),
+                               results(
+                                       "http://host:port";,
+                                       "http://host:port";,
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "Happy-5",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       "foobar"
+                               ),
+                               results(
+                                       
"http://host:port/context/resource/foobar";,
+                                       
"http://host:port/context/resource/foobar";,
+                                       "/context/resource/foobar",
+                                       "/context/resource/foobar",
+                                       "foobar",
+                                       "foobar"
+                               )
+                       },
+                       {
+                               "Happy-6",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       ""
+                               ),
+                               results(
+                                       "http://host:port/context/resource";,
+                                       
"http://host:port/context/resource/path";,
+                                       "/context/resource",
+                                       "/context/resource/path",
+                                       "",
+                                       ""
+                               )
+                       },
+                       {
+                               "Happy-7",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       "context:/foo"
+                               ),
+                               results(
+                                       "http://host:port/context/foo";,
+                                       "http://host:port/context/foo";,
+                                       "/context/foo",
+                                       "/context/foo",
+                                       "/context/foo",
+                                       "/context/foo"
+                               )
+                       },
+                       {
+                               "Happy-8",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       "context:/"
+                               ),
+                               results(
+                                       "http://host:port/context";,
+                                       "http://host:port/context";,
+                                       "/context",
+                                       "/context",
+                                       "/context",
+                                       "/context"
+                               )
+                       },
+                       {
+                               "Happy-9",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       "servlet:/foo"
+                               ),
+                               results(
+                                       "http://host:port/context/resource/foo";,
+                                       "http://host:port/context/resource/foo";,
+                                       "/context/resource/foo",
+                                       "/context/resource/foo",
+                                       "/context/resource/foo",
+                                       "/context/resource/foo"
+                               )
+                       },
+                       {
+                               "Happy-10",
+                               input(
+                                       
"http://host:port","/context","/resource","/path";, 
+                                       "servlet:/"
+                               ),
+                               results(
+                                       "http://host:port/context/resource";,
+                                       "http://host:port/context/resource";,
+                                       "/context/resource",
+                                       "/context/resource",
+                                       "/context/resource",
+                                       "/context/resource"
+                               )
+                       },
+                       
+                       // Multiple context and resource parts
+                       {
+                               "MultiContextResource-1",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "http://foo.com:123/foobar";
+                               ),
+                               results(
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";
+                               )
+                       },
+                       {
+                               "MultiContextResource-2",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "http://foo.com:123";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";
+                               )
+                       },
+                       {
+                               "MultiContextResource-3",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "/foobar"
+                               ),
+                               results(
+                                       "http://host:port/foobar";,
+                                       "http://host:port/foobar";,
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar"
+                               )
+                       },
+                       {
+                               "MultiContextResource-4",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "/"
+                               ),
+                               results(
+                                       "http://host:port";,
+                                       "http://host:port";,
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "MultiContextResource-5",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "foobar"
+                               ),
+                               results(
+                                       "http://host:port/c1/c2/r1/r2/foobar";,
+                                       
"http://host:port/c1/c2/r1/r2/p1/foobar";,
+                                       "/c1/c2/r1/r2/foobar",
+                                       "/c1/c2/r1/r2/p1/foobar",
+                                       "foobar",
+                                       "foobar"
+                               )
+                       },
+                       {
+                               "MultiContextResource-6",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       ""
+                               ),
+                               results(
+                                       "http://host:port/c1/c2/r1/r2";,
+                                       "http://host:port/c1/c2/r1/r2/p1/p2";,
+                                       "/c1/c2/r1/r2",
+                                       "/c1/c2/r1/r2/p1/p2",
+                                       "",
+                                       ""
+                               )
+                       },
+                       {
+                               "MultiContextResource-7",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "context:/foo"
+                               ),
+                               results(
+                                       "http://host:port/c1/c2/foo";,
+                                       "http://host:port/c1/c2/foo";,
+                                       "/c1/c2/foo",
+                                       "/c1/c2/foo",
+                                       "/c1/c2/foo",
+                                       "/c1/c2/foo"
+                               )
+                       },
+                       {
+                               "MultiContextResource-8",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "context:/"
+                               ),
+                               results(
+                                       "http://host:port/c1/c2";,
+                                       "http://host:port/c1/c2";,
+                                       "/c1/c2",
+                                       "/c1/c2",
+                                       "/c1/c2",
+                                       "/c1/c2"
+                               )
+                       },
+                       {
+                               "MultiContextResource-9",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "servlet:/foo"
+                               ),
+                               results(
+                                       "http://host:port/c1/c2/r1/r2/foo";,
+                                       "http://host:port/c1/c2/r1/r2/foo";,
+                                       "/c1/c2/r1/r2/foo",
+                                       "/c1/c2/r1/r2/foo",
+                                       "/c1/c2/r1/r2/foo",
+                                       "/c1/c2/r1/r2/foo"
+                               )
+                       },
+                       {
+                               "MultiContextResource-10",
+                               input(
+                                       
"http://host:port","/c1/c2","/r1/r2","/p1/p2";,
+                                       "servlet:/"
+                               ),
+                               results(
+                                       "http://host:port/c1/c2/r1/r2";,
+                                       "http://host:port/c1/c2/r1/r2";,
+                                       "/c1/c2/r1/r2",
+                                       "/c1/c2/r1/r2",
+                                       "/c1/c2/r1/r2",
+                                       "/c1/c2/r1/r2"
+                               )
+                       },
+                       
+                       // No authority given
+                       {
+                               "NoAuthority-1",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "http://foo.com:123/foobar";
+                               ),
+                               results(
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";
+                               )
+                       },
+                       {
+                               "NoAuthority-2",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "http://foo.com:123";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";
+                               )
+                       },
+                       {
+                               "NoAuthority-3",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "/foobar"
+                               ),
+                               results(
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar"
+                               )
+                       },
+                       {
+                               "NoAuthority-4",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "/"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoAuthority-5",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "foobar"
+                               ),
+                               results(
+                                       "/context/resource/foobar",
+                                       "/context/resource/foobar",
+                                       "/context/resource/foobar",
+                                       "/context/resource/foobar",
+                                       "foobar",
+                                       "foobar"
+                               )
+                       },
+                       {
+                               "NoAuthority-6",
+                               input(
+                                       "","/context","/resource","/path",
+                                       ""
+                               ),
+                               results(
+                                       "/context/resource",
+                                       "/context/resource/path",
+                                       "/context/resource",
+                                       "/context/resource/path",
+                                       "",
+                                       ""
+                               )
+                       },
+                       {
+                               "NoAuthority-7",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "context:/foo"
+                               ),
+                               results(
+                                       "/context/foo",
+                                       "/context/foo",
+                                       "/context/foo",
+                                       "/context/foo",
+                                       "/context/foo",
+                                       "/context/foo"
+                               )
+                       },
+                       {
+                               "NoAuthority-8",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "context:/"
+                               ),
+                               results(
+                                       "/context",
+                                       "/context",
+                                       "/context",
+                                       "/context",
+                                       "/context",
+                                       "/context"
+                               )
+                       },
+                       {
+                               "NoAuthority-9",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "servlet:/foo"
+                               ),
+                               results(
+                                       "/context/resource/foo",
+                                       "/context/resource/foo",
+                                       "/context/resource/foo",
+                                       "/context/resource/foo",
+                                       "/context/resource/foo",
+                                       "/context/resource/foo"
+                               )
+                       },
+                       {
+                               "NoAuthority-10",
+                               input(
+                                       "","/context","/resource","/path",
+                                       "servlet:/"
+                               ),
+                               results(
+                                       "/context/resource",
+                                       "/context/resource",
+                                       "/context/resource",
+                                       "/context/resource",
+                                       "/context/resource",
+                                       "/context/resource"
+                               )
+                       },
+                       
+                       // No authority or context given
+                       {
+                               "NoAuthorityOrContext-1",
+                               input(
+                                       "","","/resource","/path",
+                                       "http://foo.com:123/foobar";
+                               ),
+                               results(
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-2",
+                               input(
+                                       "","","/resource","/path",
+                                       "http://foo.com:123";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-3",
+                               input(
+                                       "","","/resource","/path",
+                                       "/foobar"
+                               ),
+                               results(
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-4",
+                               input(
+                                       "","","/resource","/path",
+                                       "/"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-5",
+                               input(
+                                       "","","/resource","/path",
+                                       "foobar"
+                               ),
+                               results(
+                                       "/resource/foobar",
+                                       "/resource/foobar",
+                                       "/resource/foobar",
+                                       "/resource/foobar",
+                                       "foobar",
+                                       "foobar"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-6",
+                               input(
+                                       "","","/resource","/path",
+                                       ""
+                               ),
+                               results(
+                                       "/resource",
+                                       "/resource/path",
+                                       "/resource",
+                                       "/resource/path",
+                                       "",
+                                       ""
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-7",
+                               input(
+                                       "","","/resource","/path",
+                                       "context:/foo"
+                               ),
+                               results(
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-8",
+                               input(
+                                       "","","/resource","/path",
+                                       "context:/"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-9",
+                               input(
+                                       "","","/resource","/path",
+                                       "servlet:/foo"
+                               ),
+                               results(
+                                       "/resource/foo",
+                                       "/resource/foo",
+                                       "/resource/foo",
+                                       "/resource/foo",
+                                       "/resource/foo",
+                                       "/resource/foo"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContext-10",
+                               input(
+                                       "","","/resource","/path",
+                                       "servlet:/"
+                               ),
+                               results(
+                                       "/resource",
+                                       "/resource",
+                                       "/resource",
+                                       "/resource",
+                                       "/resource",
+                                       "/resource"
+                               )
+                       },
+
+                       // No authority or context or resource given
+                       {
+                               "NoAuthorityOrContextOrResource-1",
+                               input(
+                                       "","","","/path",
+                                       "http://foo.com:123/foobar";
+                               ),
+                               results(
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-2",
+                               input(
+                                       "","","","/path",
+                                       "http://foo.com:123";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-3",
+                               input(
+                                       "","","","/path",
+                                       "/foobar"
+                               ),
+                               results(
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-4",
+                               input(
+                                       "","","","/path",
+                                       "/"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-5",
+                               input(
+                                       "","","","/path",
+                                       "foobar"
+                               ),
+                               results(
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "foobar",
+                                       "foobar"
+                               )
+                       },
+//                     return new Results(eAbsResource, eAbsPathInfo, 
eRrResource, eRrPathInfo, eNoneResource, eNonePathInfo);
+                       {
+                               "NoAuthorityOrContextOrResource-6",
+                               input(
+                                       "","","","/path",
+                                       ""
+                               ),
+                               results(
+                                       "/",
+                                       "/path",
+                                       "/",
+                                       "/path",
+                                       "",
+                                       ""
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-7",
+                               input(
+                                       "","","","/path",
+                                       "context:/foo"
+                               ),
+                               results(
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-8",
+                               input(
+                                       "","","","/path",
+                                       "context:/"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-9",
+                               input(
+                                       "","","","/path",
+                                       "servlet:/foo"
+                               ),
+                               results(
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo"
+                               )
+                       },
+                       {
+                               "NoAuthorityOrContextOrResource-10",
+                               input(
+                                       "","","","/path",
+                                       "servlet:/"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       
+                       // No context or resource given.
+                       {
+                               "NoContextOrResource-1",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "http://foo.com:123/foobar";
+                               ),
+                               results(
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";,
+                                       "http://foo.com:123/foobar";
+                               )
+                       },
+                       {
+                               "NoContextOrResource-2",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "http://foo.com:123";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";
+                               )
+                       },
+                       {
+                               "NoContextOrResource-3",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "/foobar"
+                               ),
+                               results(
+                                       "http://host:port/foobar";,
+                                       "http://host:port/foobar";,
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar",
+                                       "/foobar"
+                               )
+                       },
+                       {
+                               "NoContextOrResource-4",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "/"
+                               ),
+                               results(
+                                       "http://host:port";,
+                                       "http://host:port";,
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoContextOrResource-5",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "foobar"
+                               ),
+                               results(
+                                       "http://host:port/foobar";,
+                                       "http://host:port/foobar";,
+                                       "/foobar",
+                                       "/foobar",
+                                       "foobar",
+                                       "foobar"
+                               )
+                       },
+                       {
+                               "NoContextOrResource-6",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       ""
+                               ),
+                               results(
+                                       "http://host:port";,
+                                       "http://host:port/path";,
+                                       "/",
+                                       "/path",
+                                       "",
+                                       ""
+                               )
+                       },
+                       {
+                               "NoContextOrResource-7",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "context:/foo"
+                               ),
+                               results(
+                                       "http://host:port/foo";,
+                                       "http://host:port/foo";,
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo"
+                               )
+                       },
+                       {
+                               "NoContextOrResource-8",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "context:/"
+                               ),
+                               results(
+                                       "http://host:port";,
+                                       "http://host:port";,
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+                       {
+                               "NoContextOrResource-9",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "servlet:/foo"
+                               ),
+                               results(
+                                       "http://host:port/foo";,
+                                       "http://host:port/foo";,
+                                       "/foo",
+                                       "/foo",
+                                       "/foo",
+                                       "/foo"
+                               )
+                       },
+                       {
+                               "NoContextOrResource-10",
+                               input(
+                                       "http://host:port","","","/path";,
+                                       "servlet:/"
+                               ),
+                               results(
+                                       "http://host:port";,
+                                       "http://host:port";,
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+               });             
+       }
+       
+       public static Input input(String authority, String context, String 
resource, String path, String uri) {
+               return new Input(authority, context, resource, path, uri);
+       }
+       
+       public static Results results(String eAbsResource, String eAbsPathInfo, 
String eRrResource, String eRrPathInfo, String eNoneResource, String 
eNonePathInfo) {
+               return new Results(eAbsResource, eAbsPathInfo, eRrResource, 
eRrPathInfo, eNoneResource, eNonePathInfo);
+       }
+
+       public static class Input {
+               private final String uri;
+               private final String authority, context, resource, path;
+               
+               public Input(String authority, String context, String resource, 
String path, String uri) {
+                       this.authority = authority;
+                       this.context = context;
+                       this.resource = resource;
+                       this.path = path;
+                       this.uri = uri;
+               }
+       }
+       
+       public static class Results {
+               private final String aResource, aPathInfo, rrResource, 
rrPathInfo, nResource, nPathInfo;
+               
+               public Results(String aResource, String aPathInfo, String 
rrResource, String rrPathInfo, String nResource, String nPathInfo) {
+                       this.aResource = aResource;
+                       this.aPathInfo = aPathInfo;
+                       this.rrResource = rrResource;
+                       this.rrPathInfo = rrPathInfo;
+                       this.nResource = nResource;
+                       this.nPathInfo = nPathInfo;
+               }
+       }
+       
+       private String label;
+       private Input in;
+       private Results r;
+       
+       public UriContextResolutionComboTest(String label, Input in, Results r) 
throws Exception {
+               this.label = label;
+               this.in = in;
+               this.r = r;
+       }
+       
+       @Test
+       public void a01_testAbsoluteResource() {
+               assertEquals(r.aResource, new UriContext(ABSOLUTE, RESOURCE, 
in.authority, in.context, in.resource, in.path).resolve(in.uri), "{0}: 
testAbsolute() failed", label);
+       }       
+               
+       @Test
+       public void a02_testAppendAbsoluteResource() {
+               assertEquals(r.aResource, new UriContext(ABSOLUTE, RESOURCE, 
in.authority, in.context, in.resource, in.path).append(new StringBuilder(), 
in.uri).toString(), "{0}: testAbsolute() failed", label);
+       }
+       
+       @Test
+       public void a03_testAbsolutePathInfo() {
+               assertEquals(r.aPathInfo, new UriContext(ABSOLUTE, PATH_INFO, 
in.authority, in.context, in.resource, in.path).resolve(in.uri), "{0}: 
testAbsolute() failed", label);
+       }       
+               
+       @Test
+       public void a04_testAppendAbsolutePathInfo() {
+               assertEquals(r.aPathInfo, new UriContext(ABSOLUTE, PATH_INFO, 
in.authority, in.context, in.resource, in.path).append(new StringBuilder(), 
in.uri).toString(), "{0}: testAbsolute() failed", label);
+       }
+
+       @Test
+       public void a05_testRootRelativeResource() {
+               assertEquals(r.rrResource, new UriContext(ROOT_RELATIVE, 
RESOURCE, in.authority, in.context, in.resource, in.path).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
+       }       
+               
+       @Test
+       public void a06_testAppendRootRelativeResource() {
+               assertEquals(r.rrResource, new UriContext(ROOT_RELATIVE, 
RESOURCE, in.authority, in.context, in.resource, in.path).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
+       }
+
+       @Test
+       public void a07_testRootRelativePathInfo() {
+               assertEquals(r.rrPathInfo, new UriContext(ROOT_RELATIVE, 
PATH_INFO, in.authority, in.context, in.resource, in.path).resolve(in.uri), 
"{0}: testAbsolute() failed", label);
+       }       
+               
+       @Test
+       public void a08_testAppendRootRelativePathInfo() {
+               assertEquals(r.rrPathInfo, new UriContext(ROOT_RELATIVE, 
PATH_INFO, in.authority, in.context, in.resource, in.path).append(new 
StringBuilder(), in.uri).toString(), "{0}: testAbsolute() failed", label);
+       }
+
+       @Test
+       public void a09_testNoneResource() {
+               assertEquals(r.nResource, new UriContext(NONE, RESOURCE, 
in.authority, in.context, in.resource, in.path).resolve(in.uri), "{0}: 
testAbsolute() failed", label);
+       }       
+               
+       @Test
+       public void a10_testAppendNoneResource() {
+               assertEquals(r.nResource, new UriContext(NONE, RESOURCE, 
in.authority, in.context, in.resource, in.path).append(new StringBuilder(), 
in.uri).toString(), "{0}: testAbsolute() failed", label);
+       }
+
+       @Test
+       public void a11_testNonePathInfo() {
+               assertEquals(r.nPathInfo, new UriContext(NONE, PATH_INFO, 
in.authority, in.context, in.resource, in.path).resolve(in.uri), "{0}: 
testAbsolute() failed", label);
+       }       
+               
+       @Test
+       public void a12_testAppendNonePathInfo() {
+               assertEquals(r.nPathInfo, new UriContext(NONE, PATH_INFO, 
in.authority, in.context, in.resource, in.path).append(new StringBuilder(), 
in.uri).toString(), "{0}: testAbsolute() failed", label);
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/cdebb74d/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
----------------------------------------------------------------------
diff --git 
a/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
 
b/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
index 7d9eda7..e63f87f 100644
--- 
a/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
+++ 
b/juneau-core-test/src/test/java/org/apache/juneau/utils/UriContextUriComboTest.java
@@ -12,6 +12,11 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.utils;
 
+import static org.apache.juneau.TestUtils.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
 import org.junit.*;
 import org.junit.runner.*;
 import org.junit.runners.*;
@@ -21,210 +26,240 @@ import org.junit.runners.*;
  */
 @RunWith(Parameterized.class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
-@Ignore
 public class UriContextUriComboTest {
-//
-//     @Parameterized.Parameters
-//     public static Collection<Object[]> getInput() {
-//             return Arrays.asList(new Object[][] {
-//
-//                     // Happy cases - All URL parts known.
-//                     {
-//                             input(
-//                                     "Happy-1",
-//                                     
"http://foo.com:123","/context","/resource","/path";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123/context";,
-//                                     "http://foo.com:123/context/resource";,
-//                                     
"http://foo.com:123/context/resource/path";,
-//                                     "/context",
-//                                     "/context/resource",
-//                                     "/context/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Happy-2",
-//                                     
"http://foo.com:123","/c1/c2","/r1/r2","/p1/p2";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123/c1/c2";,
-//                                     "http://foo.com:123/c1/c2/r1/r2";,
-//                                     "http://foo.com:123/c1/c2/r1/r2/p1/p2";,
-//                                     "/c1/c2",
-//                                     "/c1/c2/r1/r2",
-//                                     "/c1/c2/r1/r2/p1/p2"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthority-1",
-//                                     "","/context","/resource","/path",
-//                                     "/",
-//                                     "/context",
-//                                     "/context/resource",
-//                                     "/context/resource/path",
-//                                     "/context",
-//                                     "/context/resource",
-//                                     "/context/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContext-1",
-//                                     
"http://foo.com:123","","/resource","/path";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123/resource";,
-//                                     "http://foo.com:123/resource/path";,
-//                                     "/",
-//                                     "/resource",
-//                                     "/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoResource-1",
-//                                     
"http://foo.com:123","/context","","/path";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123/context";,
-//                                     "http://foo.com:123/context";,
-//                                     "http://foo.com:123/context/path";,
-//                                     "/context",
-//                                     "/context",
-//                                     "/context/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoPath-1",
-//                                     
"http://foo.com:123","/context","/resource","";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123/context";,
-//                                     "http://foo.com:123/context/resource";,
-//                                     "http://foo.com:123/context/resource";,
-//                                     "/context",
-//                                     "/context/resource",
-//                                     "/context/resource"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityNoContext-1",
-//                                     "","","/resource","/path",
-//                                     "/",
-//                                     "/",
-//                                     "/resource",
-//                                     "/resource/path",
-//                                     "/",
-//                                     "/resource",
-//                                     "/resource/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoContextNoResource-1",
-//                                     "http://foo.com:123","","","/path";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123";,
-//                                     "http://foo.com:123/path";,
-//                                     "/",
-//                                     "/",
-//                                     "/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "NoAuthorityNoContextNoResource-1",
-//                                     "","","","/path",
-//                                     "/",
-//                                     "/",
-//                                     "/",
-//                                     "/path",
-//                                     "/",
-//                                     "/",
-//                                     "/path"
-//                             )
-//                     },
-//                     {
-//                             input(
-//                                     "Nothing-1",
-//                                     "","","","",
-//                                     "/",
-//                                     "/",
-//                                     "/",
-//                                     "/",
-//                                     "/",
-//                                     "/",
-//                                     "/"
-//                             )
-//                     },
-//             });             
-//     }
-//     
-//     public static Input input(String label, String authority, String 
context, String resource, String path, 
-//                     String eAbsoluteAuthority, String eAbsoluteContext, 
String eAbsoluteResource, String eAbsolutePath, 
-//                     String eRootRelativeContext, String 
eRootRelativeResource, String eRootRelativePath) {
-//             return new Input(label, authority, context, resource, path, 
eAbsoluteAuthority, eAbsoluteContext, eAbsoluteResource, eAbsolutePath, 
eRootRelativeContext, eRootRelativeResource, eRootRelativePath);
-//     }
-//     
-//     public static class Input {
-//             private final UriContext uriContext;
-//             private final String label, eAbsoluteAuthority, 
eAbsoluteContext, eAbsoluteResource, eAbsolutePath, eRootRelativeContext, 
eRootRelativeResource, eRootRelativePath;
-//             
-//             public Input(String label, String authority, String context, 
String resource, String path, 
-//                                     String eAbsoluteAuthority, String 
eAbsoluteContext, String eAbsoluteResource, String eAbsolutePath, 
-//                                     String eRootRelativeContext, String 
eRootRelativeResource, String eRootRelativePath) {
-//                     this.label = label;
-//                     this.uriContext = new UriContext(authority, context, 
resource, path);
-//                     this.eAbsoluteAuthority = eAbsoluteAuthority;
-//                     this.eAbsoluteContext = eAbsoluteContext;
-//                     this.eAbsoluteResource = eAbsoluteResource;
-//                     this.eAbsolutePath = eAbsolutePath;
-//                     this.eRootRelativeContext = eRootRelativeContext;
-//                     this.eRootRelativeResource = eRootRelativeResource;
-//                     this.eRootRelativePath = eRootRelativePath;
-//             }
-//     }
-//     
-//     private Input in;
-//     
-//     public UriContextUriComboTest(Input in) throws Exception {
-//             this.in = in;
-//     }
-//     
-//     @Test
-//     public void a1_testAbsoluteAuthority() {
-//             assertEquals(in.eAbsoluteAuthority, 
in.uriContext.getAbsoluteAuthority(), "{0}: testAbsoluteAuthority() failed", 
in.label);
-//     }
-//
-//     @Test
-//     public void a2_testAbsoluteContext() {
-//             assertEquals(in.eAbsoluteContext, 
in.uriContext.getAbsoluteContextRoot(), "{0}: testAbsoluteContext() failed", 
in.label);
-//     }
-//     
-//     @Test
-//     public void a3_testAbsoluteResource() {
-//             assertEquals(in.eAbsoluteResource, 
in.uriContext.getAbsoluteServletPath(), "{0}: testAbsoluteResource() failed", 
in.label);
-//     }
-//     
-//     @Test
-//     public void a4_testAbsolutePath() {
-//             assertEquals(in.eAbsolutePath, 
in.uriContext.getAbsolutePathInfo(), "{0}: testAbsolutePath() failed", 
in.label);
-//     }
-//     
-//     @Test
-//     public void a5_testRootRelativeContext() {
-//             assertEquals(in.eRootRelativeContext, 
in.uriContext.getRootRelativeContextRoot(), "{0}: testRootRelativeContext() 
failed", in.label);
-//     }
-//     
-//     @Test
-//     public void a6_testRootRelativeResource() {
-//             assertEquals(in.eRootRelativeResource, 
in.uriContext.getRootRelativeServletPath(), "{0}: testRootRelativeResource() 
failed", in.label);
-//     }
-//     
-//     @Test
-//     public void a7_testRootRelativePath() {
-//             assertEquals(in.eRootRelativePath, 
in.uriContext.getRootRelativePathInfo(), "{0}: testRootRelativePath() failed", 
in.label);
-//     }
+
+       @Parameterized.Parameters
+       public static Collection<Object[]> getInput() {
+               return Arrays.asList(new Object[][] {
+
+                       // Happy cases - All URL parts known.
+                       {
+                               "Happy-1",
+                               input(
+                                       
"http://foo.com:123","/context","/resource","/path";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123/context";,
+                                       "http://foo.com:123/context/resource";,
+                                       
"http://foo.com:123/context/resource/path";,
+                                       "/context",
+                                       "/context/resource",
+                                       "/context/resource/path"
+                               )
+                       },
+                       {
+                               "Happy-2",
+                               input(
+                                       
"http://foo.com:123","/c1/c2","/r1/r2","/p1/p2";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123/c1/c2";,
+                                       "http://foo.com:123/c1/c2/r1/r2";,
+                                       "http://foo.com:123/c1/c2/r1/r2/p1/p2";,
+                                       "/c1/c2",
+                                       "/c1/c2/r1/r2",
+                                       "/c1/c2/r1/r2/p1/p2"
+                               )
+                       },
+                       {
+                               "NoAuthority-1",
+                               input(
+                                       "","/context","/resource","/path"
+                               ),
+                               results(
+                                       "/",
+                                       "/context",
+                                       "/context/resource",
+                                       "/context/resource/path",
+                                       "/context",
+                                       "/context/resource",
+                                       "/context/resource/path"
+                               )
+                       },
+                       {
+                               "NoContext-1",
+                               input(
+                                       
"http://foo.com:123","","/resource","/path";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123/resource";,
+                                       "http://foo.com:123/resource/path";,
+                                       "/",
+                                       "/resource",
+                                       "/resource/path"
+                               )
+                       },
+                       {
+                               "NoResource-1",
+                               input(
+                                       
"http://foo.com:123","/context","","/path";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123/context";,
+                                       "http://foo.com:123/context";,
+                                       "http://foo.com:123/context/path";,
+                                       "/context",
+                                       "/context",
+                                       "/context/path"
+                               )
+                       },
+                       {
+                               "NoPath-1",
+                               input(
+                                       
"http://foo.com:123","/context","/resource","";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123/context";,
+                                       "http://foo.com:123/context/resource";,
+                                       "http://foo.com:123/context/resource";,
+                                       "/context",
+                                       "/context/resource",
+                                       "/context/resource"
+                               )
+                       },
+                       {
+                               "NoAuthorityNoContext-1",
+                               input(
+                                       "","","/resource","/path"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/resource",
+                                       "/resource/path",
+                                       "/",
+                                       "/resource",
+                                       "/resource/path"
+                               )
+                       },
+                       {
+                               "NoContextNoResource-1",
+                               input(
+                                       "http://foo.com:123","","","/path";
+                               ),
+                               results(
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123";,
+                                       "http://foo.com:123/path";,
+                                       "/",
+                                       "/",
+                                       "/path"
+                               )
+                       },
+                       {
+                               "NoAuthorityNoContextNoResource-1",
+                               input(
+                                       "","","","/path"
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/path",
+                                       "/",
+                                       "/",
+                                       "/path"
+                               )
+                       },
+                       {
+                               "Nothing-1",
+                               input(
+                                       "","","",""
+                               ),
+                               results(
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/",
+                                       "/"
+                               )
+                       },
+               });             
+       }
+       
+       public static Input input(String authority, String context, String 
resource, String path) {
+               return new Input(authority, context, resource, path);
+       }
+       
+       public static Results results(String eAbsoluteAuthority, String 
eAbsoluteContext, String eAbsoluteResource, String eAbsolutePath, 
+                       String eRootRelativeContext, String 
eRootRelativeResource, String eRootRelativePath) {
+               return new Results(eAbsoluteAuthority, eAbsoluteContext, 
eAbsoluteResource, eAbsolutePath, eRootRelativeContext, eRootRelativeResource, 
eRootRelativePath);
+       }
+
+       public static class Input {
+               private final UriContext uriContext;
+               
+               public Input(String authority, String context, String resource, 
String path) {
+                       this.uriContext = new 
UriContext(UriResolution.ABSOLUTE, UriRelativity.RESOURCE, authority, context, 
resource, path);
+               }
+       }
+       
+       public static class Results {
+               private final String eAbsoluteAuthority, eAbsoluteContext, 
eAbsoluteResource, eAbsolutePath, eRootRelativeContext, eRootRelativeResource, 
eRootRelativePath;
+               
+               public Results(String eAbsoluteAuthority, String 
eAbsoluteContext, String eAbsoluteResource, String eAbsolutePath, 
+                                       String eRootRelativeContext, String 
eRootRelativeResource, String eRootRelativePath) {
+                       this.eAbsoluteAuthority = eAbsoluteAuthority;
+                       this.eAbsoluteContext = eAbsoluteContext;
+                       this.eAbsoluteResource = eAbsoluteResource;
+                       this.eAbsolutePath = eAbsolutePath;
+                       this.eRootRelativeContext = eRootRelativeContext;
+                       this.eRootRelativeResource = eRootRelativeResource;
+                       this.eRootRelativePath = eRootRelativePath;
+               }
+       }
+
+       private String label;
+       private Input in;
+       private Results r;
+       
+       public UriContextUriComboTest(String label, Input in, Results r) throws 
Exception {
+               this.label = label;
+               this.in = in;
+               this.r = r;
+       }
+       
+       @Test
+       public void a1_testAbsoluteAuthority() {
+               assertEquals(r.eAbsoluteAuthority, 
in.uriContext.getAbsoluteAuthority(), "{0}: testAbsoluteAuthority() failed", 
label);
+       }
+
+       @Test
+       public void a2_testAbsoluteContext() {
+               assertEquals(r.eAbsoluteContext, 
in.uriContext.getAbsoluteContextRoot(), "{0}: testAbsoluteContext() failed", 
label);
+       }
+       
+       @Test
+       public void a3_testAbsoluteResource() {
+               assertEquals(r.eAbsoluteResource, 
in.uriContext.getAbsoluteServletPath(), "{0}: testAbsoluteResource() failed", 
label);
+       }
+       
+       @Test
+       public void a4_testAbsolutePath() {
+               assertEquals(r.eAbsolutePath, 
in.uriContext.getAbsolutePathInfo(), "{0}: testAbsolutePath() failed", label);
+       }
+       
+       @Test
+       public void a5_testRootRelativeContext() {
+               assertEquals(r.eRootRelativeContext, 
in.uriContext.getRootRelativeContextRoot(), "{0}: testRootRelativeContext() 
failed", label);
+       }
+       
+       @Test
+       public void a6_testRootRelativeResource() {
+               assertEquals(r.eRootRelativeResource, 
in.uriContext.getRootRelativeServletPath(), "{0}: testRootRelativeResource() 
failed", label);
+       }
+       
+       @Test
+       public void a7_testRootRelativePath() {
+               assertEquals(r.eRootRelativePath, 
in.uriContext.getRootRelativePathInfo(), "{0}: testRootRelativePath() failed", 
label);
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/cdebb74d/juneau-core/src/main/java/org/apache/juneau/UriContext.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/UriContext.java 
b/juneau-core/src/main/java/org/apache/juneau/UriContext.java
index 6f531bf..35e7678 100644
--- a/juneau-core/src/main/java/org/apache/juneau/UriContext.java
+++ b/juneau-core/src/main/java/org/apache/juneau/UriContext.java
@@ -278,7 +278,7 @@ public class UriContext {
                        return uri;
                if (resolution == ROOT_RELATIVE && startsWith(uri, '/'))
                        return uri;
-               if (resolution == NONE)
+               if (resolution == NONE && ! isSpecialUri(uri))
                        return uri;
                return append(new StringBuilder(), uri).toString();
        }
@@ -298,8 +298,8 @@ public class UriContext {
                        // Absolute paths are not changed.
                        if (isAbsoluteUri(uri))
                                return a.append(uri);
-                       if (resolution == NONE)
-                               return a.append(uri);
+                       if (resolution == NONE && ! isSpecialUri(uri))
+                               return a.append(emptyIfNull(uri));
                        if (resolution == ROOT_RELATIVE && startsWith(uri, '/'))
                                return a.append(uri);
 
@@ -321,7 +321,7 @@ public class UriContext {
                                        a.append('/').append(contextRoot);
                                if (uri.length() > 9)
                                        a.append('/').append(uri.substring(9));
-                               else if (contextRoot == null && (authority == 
null || resolution == ROOT_RELATIVE))
+                               else if (contextRoot == null && (authority == 
null || resolution != ABSOLUTE))
                                        a.append('/');
                                return a;
                        }
@@ -336,7 +336,7 @@ public class UriContext {
                                        a.append('/').append(servletPath);
                                if (uri.length() > 9)
                                        a.append('/').append(uri.substring(9));
-                               else if (servletPath == null && contextRoot == 
null && (authority == null || resolution == ROOT_RELATIVE))
+                               else if (servletPath == null && contextRoot == 
null && (authority == null || resolution != ABSOLUTE))
                                        a.append('/');
                                return a;
                        }
@@ -360,6 +360,8 @@ public class UriContext {
                                        a.append('/').append(uri);
                                }
                        }
+                       else if (uri == null && contextRoot == null && 
servletPath == null && (authority == null || resolution != ABSOLUTE))
+                               a.append('/');
 
                        return a;
                } catch (IOException e) {
@@ -373,4 +375,13 @@ public class UriContext {
                        return "/";
                return uri.substring(0, i);
        }
+
+       private static boolean isSpecialUri(String s) {
+               if (s == null || s.length() == 0)
+                       return false;
+               char c = s.charAt(0);
+               if (c != 's' && c != 'c')
+                       return false;
+               return s.startsWith("servlet:/") || s.startsWith("context:/");
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/cdebb74d/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
----------------------------------------------------------------------
diff --git 
a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java 
b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
index ac232a3..c4bf1db 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java
@@ -633,6 +633,18 @@ public final class StringUtils {
        }
 
        /**
+        * Returns an empty string if the specified string is <jk>null</jk>.
+        *
+        * @param s The string to check.
+        * @return An empty string if the specified string is <jk>null</jk>, or 
the same string otherwise.
+        */
+       public static String emptyIfNull(String s) {
+               if (s == null)
+                       return "";
+               return s;
+       }
+
+       /**
         * Removes escape characters (\) from the specified characters.
         *
         * @param s The string to remove escape characters from.
@@ -1345,7 +1357,7 @@ public final class StringUtils {
                        return false;
 
                // Use a state machine for maximum performance.
-               
+
                int S1 = 1;  // Looking for http
                int S2 = 2;  // Found http, looking for :
                int S3 = 3;  // Found :, looking for /

Reply via email to