public void TestSortRelevance() { object[][] uris = { new object[] { "a/relative/one", -1 }, new object[] { "other:mailto:test", 0 }, new object[] { "other://a", 1 }, new object[] { "type://a/b2/c1", 2 }, new object[] { "type://a/b3", 3 }, new object[] { "type://a/b2/c2", 4 }, new object[] { "type://a", 5 }, new object[] { "type://x?query#fragment¶m", 6 }, new object[] { "type://a/b1/c1", 7 }, new object[] { "type://a/b1/c2", 8 }, new object[] { "type://a/b1/c2/d1", 9 }, new object[] { "type://a/b2", 10 }, new object[] { "type://x/a?query#fragment¶m", 11 }, new object[] { "type://x/a/b?query#fragment¶m", 12 }, new object[] { "/a/b/c", 13 }, new object[] { "/a", 14 }, new object[] { "//a/b/c", 15 }, new object[] { "//a", 16 } }; Uri uri; // setup input IDictionary <Uri, object> input = new Dictionary <Uri, object>(); foreach (var uri1 in uris) { Assert.DoesNotThrow(() => { try { uri = new Uri((string)uri1[0], UriKind.RelativeOrAbsolute); input.Put(uri, uri1[1]); } catch (UriFormatException e) { Console.WriteLine(e); } }); } ICollection <KeyValuePair <Uri, object> > result; string[] expected; uri = new Uri("type://x/a/b?qqq", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://x/a/b?query#fragment¶m", "type://x/a?query#fragment¶m", "type://x?query#fragment¶m" }; RunAssertion(uri, input, result, expected); // unspecific child uri = new Uri("type://a/b2", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://a/b2", "type://a" }; RunAssertion(uri, input, result, expected); // very specific child uri = new Uri("type://a/b2/c2/d/e", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://a/b2/c2", "type://a/b2", "type://a" }; RunAssertion(uri, input, result, expected); // less specific child uri = new Uri("type://a/b1/c2", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://a/b1/c2", "type://a" }; RunAssertion(uri, input, result, expected); // unspecific child uri = new Uri("type://a/b4", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://a" }; RunAssertion(uri, input, result, expected); uri = new Uri("type://b/b1", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new string[] { }; RunAssertion(uri, input, result, expected); uri = new Uri("type://a/b1/c2/d1/e1/f1", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://a/b1/c2/d1", "type://a/b1/c2", "type://a" }; RunAssertion(uri, input, result, expected); uri = new Uri("other:mailto:test", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "other:mailto:test" }; RunAssertion(uri, input, result, expected); uri = new Uri("type://x/a?qqq", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "type://x/a?query#fragment¶m", "type://x?query#fragment¶m" }; RunAssertion(uri, input, result, expected); uri = new Uri("other://x/a?qqq", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new string[] { }; RunAssertion(uri, input, result, expected); // this is seen as relative, must be a full hit (no path checking) uri = new Uri("/a/b", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new string[] { }; RunAssertion(uri, input, result, expected); // this is seen as relative uri = new Uri("/a/b/c", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "/a/b/c" }; RunAssertion(uri, input, result, expected); // this is seen as relative uri = new Uri("//a/b", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new string[] { }; RunAssertion(uri, input, result, expected); // this is seen as relative uri = new Uri("//a/b/c", UriKind.RelativeOrAbsolute); result = URIUtil.FilterSort(uri, input); expected = new[] { "//a/b/c" }; RunAssertion(uri, input, result, expected); }