blob: fae9c44a56e942490ca2a3a70ebea06caada3108 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.irix;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class TestIRIx extends AbstractTestIRIx {
public TestIRIx(String name, IRIProvider provider) {
super(name, provider);
}
// ---- RFC 3986 Grammar
@Test public void uri_01() { test("http://example/abc"); }
@Test public void uri_02() { test("http://example/αβγ"); }
@Test public void uri_03() { test("http://example/Ẓ"); }
@Test public void uri_04() { test("http://[::1]/abc"); }
@Test public void uri_05() { test("http://reg123/abc"); }
@Test public void uri_06() { test("http://1.2.3.4/abc"); }
// ---- Compliance with HTTP RFC7230. https://tools.ietf.org/html/rfc7230#section-2.7
@Test(expected=IRIException.class)
public void http_01() { parse("http:"); }
@Test(expected=IRIException.class)
public void http_02() { parse("http:/"); }
@Test(expected=IRIException.class)
public void http_03() { parse("http://"); }
@Test public void http_04() { parse("http://x"); }
@Test(expected=IRIException.class)
public void http_05() { parse("http:abc"); }
@Test(expected=IRIException.class)
public void http_06() { parse("http:///abc"); }
@Test(expected=IRIException.class)
// [] not in IPv6 address
public void http_07() { parse("http://h/ab[]"); }
@Test public void http_08() { parse("http://example/~jena/file"); }
// -- Compliance with URN scheme: https://tools.ietf.org/html/rfc8141
@Test public void urn_01() { parse("urn:NID:NSS"); }
@Test(expected=IRIException.class)
public void urn_02() { parse("urn:x:abcd"); }
@Test(expected=IRIException.class)
public void urn_03() { parse("urn:ex:"); }
@Test public void urn_04() { notStrict("urn", ()->parse("urn:x:abc")); }
@Test public void urn_05() { notStrict("urn", ()->parse("urn:ex:")); }
// -- Compliance with file scheme: https://tools.ietf.org/html/rfc8089
@Test public void file_01() { parse("file:///path/name"); }
@Test public void file_02() { parse("file:/path/name"); }
@Test public void file_03() { parse("file:name"); }
@Test public void file_04() { parse("file:/path/name"); }
@Test public void file_05() { parse("file:name"); }
@Test public void file_06() { parse("file:///c:/~user/file"); }
// --- Use in RDF
@Test public void reference_01() { reference("http://example/", true); }
@Test public void reference_02() { reference("http://example/abcd", true); }
@Test public void reference_03() { reference("//example/", false); }
@Test public void reference_04() { reference("relative-uri", false); }
@Test public void reference_05() { reference("http://example/", true); }
@Test public void reference_06() { reference("http://example/", true); }
@Test public void reference_07() { reference("http://example/", true); }
@Test public void reference_08() { reference("file:///a:/~jena/file", true); }
// -- Resolving
@Test public void resolve_http_01() { resolve("http://example/", "path", "http://example/path"); }
@Test public void resolve_http_02() { resolve("http://example/dirA/dirB/", "/path", "http://example/path"); }
@Test public void resolve_http_03() { resolve("https://example/dirA/file", "path", "https://example/dirA/path"); }
// <>
@Test public void resolve_http_04() { resolve("http://example/doc", "", "http://example/doc"); }
//<#>
@Test public void resolve_http_05() { resolve("http://example/ns", "#", "http://example/ns#"); }
@Test public void resolve_http_06() { resolve("http://example/ns", "#", "http://example/ns#"); }
@Test public void resolve_file_01() { resolve("file:///dir1/dir2/", "path", "file:///dir1/dir2/path"); }
@Test public void resolve_file_02() { resolve("file:///dir/file", "a/b/c", "file:///dir/a/b/c"); }
@Test public void resolve_file_03() { resolve("file:///dir/file", "/a/b/c", "file:///a/b/c"); }
@Test public void resolve_file_04() { resolve("file:///dir/file", "file:ABC", "file:///dir/ABC"); }
@Test public void resolve_file_05() { resolve("file:///dir/file", "file:/ABC", "file:///ABC"); }
// No trailing slash, not considered to be a "directory".
@Test public void relative_http_01() { relative("http://example/dir", "http://example/dir/abcd", "dir/abcd"); }
@Test public void relative_http_02() { relative("http://example/dir", "http://example/dir/abcd", "dir/abcd"); }
@Test public void relative_http_03() { relative("http://example/dir/ab", "http://example/dir/abcd", "abcd"); }
@Test public void relative_http_04() { relative("http://example/dir/", "http://example/dir/abcd#frag", "abcd#frag"); }
@Test public void relative_http_05() { relative("http://example/abcd", "http://example/abcd#frag", "#frag"); }
@Test public void relative_http_06() { relative("http://example/abcd", "http://example/abcd?query=qs", "?query=qs"); }
@Test public void relative_http_07() { relative("http://example/abcd", "http://example/abcd?query=qs#f", "?query=qs#f"); }
@Test public void relative_http_08() { relative("http://example/dir1/dir2/path", "http://example/otherDir/abcd", null); }
@Test public void relative_http_09() { relative("http://example/path", "http://example/path", ""); }
@Test public void relative_http_10() { relative("http://example/path", "http://example/path#", "#"); }
@Test public void relative_file_01() { relative("file:///dir/", "file:///dir/abcd", "abcd"); }
@Test public void relative_file_02() { relative("file:///", "file:///dir/abcd", "dir/abcd"); }
// ---- Things expected.
@Test public void misc_01() { reference("wm:/abc", true); }
private void relative(String baseUriStr, String otherStr, String expected) {
IRIx base = IRIx.create(baseUriStr);
IRIx relInput = IRIx.create(otherStr);
IRIx relativized = base.relativize(relInput);
String result = (relativized==null) ? null : relativized.str();
assertEquals("Base=<"+baseUriStr+"> IRI=<"+otherStr+">", expected, result);
}
private void resolve(String baseUriStr, String otherStr, String expected) {
String iriStr = IRIs.resolve(baseUriStr, otherStr);
assertEquals("Base=<"+baseUriStr+"> Rel=<"+otherStr+">", expected, iriStr);
}
// Create - is it suitable for an RDF reference?
private void reference(String uriStr) {
IRIx iri = IRIx.create(uriStr);
assertTrue("IRI = "+uriStr, iri.isReference());
}
private void reference(String uriStr, boolean expected) {
IRIx iri = IRIx.create(uriStr);
assertEquals("IRI = "+uriStr, expected, iri.isReference());
}
// Parser/check/see if the string is the same.
private void test(String uriStr) {
IRIx iri = IRIx.create(uriStr);
String x = iri.str();
assertEquals(uriStr, x);
}
// Parse, validate against scheme-specific rules.
private void parse(String string) {
IRIx iri = IRIx.create(string);
}
}