"use strict";
var assert = require('assert').strict;
var iri = require('../');
var IRI = iri.IRI;
function testConversion(irival, urival){
it(irival, function(){
assert.equal(new IRI(irival).toURIString(), urival);
assert.equal(new IRI(urival).toIRIString(), irival);
});
}
describe('Interface', function(){
describe("new IRI()", function(){
var t = new IRI('http://example.com/');
it(".nodeType() === 'IRI'", function(){ assert.equal(t.scheme(), 'http'); });
it(".toNT()", function(){ assert.equal(t.toNT(), ''); });
it(".n3()", function(){ assert.equal(t.n3(), ''); });
it(".defrag() is self", function(){ assert.equal(t.defrag().value, 'http://example.com/'); });
it(".isAbsolute() is true", function(){ assert.equal(t.isAbsolute(), true); });
it(".toAbsolute() is self", function(){ assert.equal(t.toAbsolute().value, 'http://example.com/'); });
it(".authority() === 'example.com'", function(){ assert.equal(t.authority(), 'example.com'); });
it(".fragment() is null", function(){ assert.equal(t.fragment(), null); });
it(".hierpart() === '//example.com/'", function(){ assert.equal(t.hierpart(), '//example.com/'); });
it(".host() === 'example.com'", function(){ assert.equal(t.host(), 'example.com'); });
it(".path() === '/'", function(){ assert.equal(t.path(), '/'); });
it(".port() is null", function(){ assert.equal(t.port(), null); });
it(".query() is null", function(){ assert.equal(t.query(), null); });
it(".resolveReference(absoluteURI)", function(){ assert.equal(t.resolveReference('http://xyz.example.org/123').value, 'http://xyz.example.org/123'); });
it(".resolveReference(path)", function(){ assert.equal(t.resolveReference('/a/b/c').value, 'http://example.com/a/b/c'); });
it(".resolveReference(authority)", function(){ assert.equal(t.resolveReference('//example.org/1?x').value, 'http://example.org/1?x'); });
it(".resolveReference(relative)", function(){ assert.equal(t.resolveReference('b/c.js').value, 'http://example.com/b/c.js'); });
it(".resolveReference(decend)", function(){ assert.equal(t.resolveReference('../..').value, 'http://example.com/'); });
it(".resolveReference(query)", function(){ assert.equal(t.resolveReference('?query').value, 'http://example.com/?query'); });
it(".scheme() === 'http'", function(){ assert.equal(t.scheme(), 'http'); });
it(".userinfo() is null", function(){ assert.equal(t.userinfo(), null); });
});
describe("(new iri.IRI())", function(){
var t = new iri.IRI('https://user:pass@a.example.com:8080/b/c/d/?123&aa=1&aa=2#455');
it(".nodeType() === 'IRI'", function(){ assert.equal(t.nodeType(), 'IRI'); });
it(".toNT()", function(){ assert.equal(t.toNT(), ''); });
it(".n3()", function(){ assert.equal(t.n3(), ''); });
it(".defrag() strips fragment", function(){ assert.equal(t.defrag().value, 'https://user:pass@a.example.com:8080/b/c/d/?123&aa=1&aa=2'); });
it(".isAbsolute() is false", function(){ assert.equal(t.isAbsolute(), false); });
it(".toAbsolute() strips fragment", function(){ assert.equal(t.toAbsolute().value, 'https://user:pass@a.example.com:8080/b/c/d/?123&aa=1&aa=2'); });
it(".authority() === 'user:pass@a.example.com:8080'", function(){ assert.equal(t.authority(), 'user:pass@a.example.com:8080'); });
it(".fragment()", function(){ assert.equal(t.fragment(), '#455'); });
it(".hierpart()", function(){ assert.equal(t.hierpart(), '//user:pass@a.example.com:8080/b/c/d/'); });
it(".host() === 'a.example.com'", function(){ assert.equal(t.host(), 'a.example.com'); });
it(".path() === '/b/c/d/?123&aa=1&aa=2'", function(){ assert.equal(t.path(), '/b/c/d/'); });
it(".port() is '8080'", function(){ assert.equal(t.port(), '8080'); });
it(".query()", function(){ assert.equal(t.query(), '?123&aa=1&aa=2'); });
it(".resolveReference(absoluteURI)", function(){ assert.equal(t.resolveReference('http://xyz.example.org/123').value, 'http://xyz.example.org/123'); });
it(".resolveReference(path)", function(){ assert.equal(t.resolveReference('/a/b/c').value, 'https://user:pass@a.example.com:8080/a/b/c'); });
it(".resolveReference(authority)", function(){ assert.equal(t.resolveReference('//example.org/1?x').value, 'https://example.org/1?x'); });
it(".resolveReference(relative)", function(){ assert.equal(t.resolveReference('b/c.js').value, 'https://user:pass@a.example.com:8080/b/c/d/b/c.js'); });
it(".resolveReference(cwd)", function(){ assert.equal(t.resolveReference('.').value, 'https://user:pass@a.example.com:8080/b/c/d/'); });
it(".resolveReference(decend)", function(){ assert.equal(t.resolveReference('../..').value, 'https://user:pass@a.example.com:8080/b/'); });
it(".resolveReference(query)", function(){ assert.equal(t.resolveReference('?query').value, 'https://user:pass@a.example.com:8080/b/c/d/?query'); });
it(".scheme() === 'https'", function(){ assert.equal(t.scheme(), 'https'); });
it(".userinfo()", function(){ assert.equal(t.userinfo(), 'user:pass'); });
});
describe("(new iri.IRI())", function(){
// The examples from RFC 3986
var t = new iri.IRI('http://a/b/c/d;p?q');
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g:h").value, "g:h"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g").value, "http://a/b/c/g"); });
it(".resolveReference(<./g>)", function(){ assert.equal(t.resolveReference("./g").value, "http://a/b/c/g"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g/").value, "http://a/b/c/g/"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("/g").value, "http://a/g"); });
it(".resolveReference(/g>)", function(){ assert.equal(t.resolveReference("//g").value, "http://g"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("?y").value, "http://a/b/c/d;p?y"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g?y").value, "http://a/b/c/g?y"); });
it(".resolveReference(<#s>)", function(){ assert.equal(t.resolveReference("#s").value, "http://a/b/c/d;p?q#s"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g#s").value, "http://a/b/c/g#s"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g?y#s").value, "http://a/b/c/g?y#s"); });
it(".resolveReference(<;x>)", function(){ assert.equal(t.resolveReference(";x").value, "http://a/b/c/;x"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g;x").value, "http://a/b/c/g;x"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g;x?y#s").value, "http://a/b/c/g;x?y#s"); });
it(".resolveReference(<>)", function(){ assert.equal(t.resolveReference("").value, "http://a/b/c/d;p?q"); });
it(".resolveReference(<.>)", function(){ assert.equal(t.resolveReference(".").value, "http://a/b/c/"); });
it(".resolveReference(<./>)", function(){ assert.equal(t.resolveReference("./").value, "http://a/b/c/"); });
it(".resolveReference(<..>)", function(){ assert.equal(t.resolveReference("..").value, "http://a/b/"); });
it(".resolveReference(<../>)", function(){ assert.equal(t.resolveReference("../").value, "http://a/b/"); });
it(".resolveReference(<../g>)", function(){ assert.equal(t.resolveReference("../g").value, "http://a/b/g"); });
it(".resolveReference(<../..>)", function(){ assert.equal(t.resolveReference("../..").value, "http://a/"); });
it(".resolveReference(<../../>)", function(){ assert.equal(t.resolveReference("../../").value, "http://a/"); });
it(".resolveReference(<../../g>)", function(){ assert.equal(t.resolveReference("../../g").value, "http://a/g"); });
it(".resolveReference(<../../../g>)", function(){ assert.equal(t.resolveReference("../../../g").value, "http://a/g"); });
it(".resolveReference(<../../../../g>)", function(){ assert.equal(t.resolveReference("../../../../g").value, "http://a/g"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("/./g").value, "http://a/g"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("/../g").value, "http://a/g"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g.").value, "http://a/b/c/g."); });
it(".resolveReference(<.g>)", function(){ assert.equal(t.resolveReference(".g").value, "http://a/b/c/.g"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g..").value, "http://a/b/c/g.."); });
it(".resolveReference(<..g>)", function(){ assert.equal(t.resolveReference("..g").value, "http://a/b/c/..g"); });
it(".resolveReference(<./../g>)", function(){ assert.equal(t.resolveReference("./../g").value, "http://a/b/g"); });
it(".resolveReference(<./g/.>)", function(){ assert.equal(t.resolveReference("./g/.").value, "http://a/b/c/g/"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g/./h").value, "http://a/b/c/g/h"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g/../h").value, "http://a/b/c/h"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g;x=1/./y").value, "http://a/b/c/g;x=1/y"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g;x=1/../y").value, "http://a/b/c/y"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g?y/./x").value, "http://a/b/c/g?y/./x"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g?y/../x").value, "http://a/b/c/g?y/../x"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g#s/./x").value, "http://a/b/c/g#s/./x"); });
it(".resolveReference()", function(){ assert.equal(t.resolveReference("g#s/../x").value, "http://a/b/c/g#s/../x"); });
});
describe("IRI to URI conversion", function(){
var t = new IRI('http://www.example.org/red%09ros\xE9#red');
it(".toURIString()", function(){ assert.equal(t.toURIString(), "http://www.example.org/red%09ros%C3%A9#red"); });
});
describe("IRI to URI conversion with surrogate pairs", function(){
var t = new IRI('http://example.com/\uD800\uDF00\uD800\uDF01\uD800\uDF02');
it(".toURIString()", function(){ assert.equal(t.toURIString(), "http://example.com/%F0%90%8C%80%F0%90%8C%81%F0%90%8C%82"); });
});
describe("IRI<->URI conversion", function(){
describe("Standard examples", function(){
testConversion('http://www.example.org/red%09ros\xE9#red', 'http://www.example.org/red%09ros%C3%A9#red');
testConversion('http://example.com/\uD800\uDF00\uD800\uDF01\uD800\uDF02', 'http://example.com/%F0%90%8C%80%F0%90%8C%81%F0%90%8C%82');
testConversion('http://www.example.org/r\xE9sum\xE9.html', 'http://www.example.org/r%C3%A9sum%C3%A9.html');
testConversion('http://www.example.org/%2F', 'http://www.example.org/%2F');
});
describe("Reserved characters are not encoded", function(){
testConversion('http://www.example.org/%3A', 'http://www.example.org/%3A');
testConversion('http://www.example.org/%2F', 'http://www.example.org/%2F');
testConversion('http://www.example.org/%3F', 'http://www.example.org/%3F');
testConversion('http://www.example.org/%23', 'http://www.example.org/%23');
testConversion('http://www.example.org/%5B', 'http://www.example.org/%5B');
testConversion('http://www.example.org/%5D', 'http://www.example.org/%5D');
testConversion('http://www.example.org/%40', 'http://www.example.org/%40');
testConversion('http://www.example.org/%20', 'http://www.example.org/%20');
testConversion('http://www.example.org/%21', 'http://www.example.org/%21');
testConversion('http://www.example.org/%24', 'http://www.example.org/%24');
testConversion('http://www.example.org/%26', 'http://www.example.org/%26');
testConversion('http://www.example.org/%27', 'http://www.example.org/%27');
testConversion('http://www.example.org/%28', 'http://www.example.org/%28');
testConversion('http://www.example.org/%29', 'http://www.example.org/%29');
testConversion('http://www.example.org/%2A', 'http://www.example.org/%2A');
testConversion('http://www.example.org/%2B', 'http://www.example.org/%2B');
testConversion('http://www.example.org/%2C', 'http://www.example.org/%2C');
testConversion('http://www.example.org/%3B', 'http://www.example.org/%3B');
testConversion('http://www.example.org/%3D', 'http://www.example.org/%3D');
});
});
});