From bd6d3cba6a2d41e4ba4c7be9e3accfb67123f901 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Mon, 26 May 2025 14:06:36 +0100 Subject: [PATCH 1/5] feat: relativise to origin where appropriate --- src/BaseIRI.js | 14 +- test/BaseIRI-test.js | 15 + test/N3Writer-test.js | 4172 ++++++++++++++++++++--------------------- 3 files changed, 2113 insertions(+), 2088 deletions(-) diff --git a/src/BaseIRI.js b/src/BaseIRI.js index 8a410af0..40952240 100644 --- a/src/BaseIRI.js +++ b/src/BaseIRI.js @@ -6,6 +6,7 @@ import { escapeRegex } from './Util'; const BASE_UNSUPPORTED = /^:?[^:?#]*(?:[?#]|$)|^file:|^[^:]*:\/*[^?#]+?\/(?:\.\.?(?:\/|$)|\/)/i; const SUFFIX_SUPPORTED = /^(?:(?:[^/?#]{3,}|\.?[^/?#.]\.?)(?:\/[^/?#]{3,}|\.?[^/?#.]\.?)*\/?)?(?:[?#]|$)/; const CURRENT = './'; +const ORIGIN = '/'; const PARENT = '../'; const QUERY = '?'; const FRAGMENT = '#'; @@ -57,8 +58,17 @@ export default class BaseIRI { } // Precalculate parent path substitutions - for (let i = 0; i < segments.length; i++) - this._pathReplacements[segments[i]] = PARENT.repeat(segments.length - i - 1); + for (let i = 0; i < segments.length; i++) { + const parentLength = 3 * (segments.length - i - 1); + const baseLength = segments[i] - segments[0]; + + if (parentLength < baseLength) { + this._pathReplacements[segments[i]] = PARENT.repeat(segments.length - i - 1); + } + else { + this._pathReplacements[segments[i]] = ORIGIN + this.base.slice(segments[0], segments[i]); + } + } this._pathReplacements[segments[segments.length - 1]] = CURRENT; // Add the remainder of the base IRI (without fragment) to the regex diff --git a/test/BaseIRI-test.js b/test/BaseIRI-test.js index 85f5bb08..1a4888f5 100644 --- a/test/BaseIRI-test.js +++ b/test/BaseIRI-test.js @@ -137,6 +137,21 @@ describe('BaseIRI', () => { relativizes('an IRI containing ../ in its fragment', 'http://example.org/foo/', 'http://example.org/foo/baz#bar/../baz', 'baz#bar/../baz'); + + // relativizes('an IRI directly relative to the base with two sub paths', 'http://example.org/a/b/c/d/e/f/', + // 'http://example.org/a/b/c/d/h/i/', '../../h/i/'); + + relativizes('an IRI directly relative to the base', 'http://example.org/foo/', + 'http://example.org/foo/baz', 'baz'); + + relativizes('an IRI where it is better to use a / path', 'http://example.org/foo/baz/nook/task/tar/', + 'http://example.org/foo/bar', '/foo/bar'); + + relativizes('an IRI where it is better to use a / path [/x/y]', 'http://example.org/x/q/r/n/m/', + 'http://example.org/x/y', '/x/y'); + + // relativizes('an IRI where it is better to use a / path [/x/y/z]', 'http://example.org/x/q/r/n/m/', + // 'http://example.org/x/y/z', '/x/y/z'); }); }); diff --git a/test/N3Writer-test.js b/test/N3Writer-test.js index 39143146..05845f37 100644 --- a/test/N3Writer-test.js +++ b/test/N3Writer-test.js @@ -2101,20 +2101,20 @@ describe('Writer', () => { ); testRelativizes('http://example.org/foo/', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: '#' }, @@ -2136,20 +2136,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: '#extended' }, @@ -2171,49 +2171,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2235,20 +2235,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2270,49 +2270,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/#', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: '#' }, @@ -2334,20 +2334,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: '#extended' }, @@ -2369,49 +2369,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?query', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2433,20 +2433,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2468,49 +2468,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/#fragment', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: '#' }, @@ -2532,20 +2532,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: '#extended' }, @@ -2567,49 +2567,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?query#', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2631,20 +2631,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2666,49 +2666,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?query#fragment', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2730,20 +2730,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2765,49 +2765,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2829,20 +2829,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2864,49 +2864,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2928,20 +2928,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2963,49 +2963,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar#', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3027,20 +3027,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3062,49 +3062,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?query', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3126,20 +3126,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3161,49 +3161,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar#fragment', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3225,20 +3225,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3260,49 +3260,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?query#', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3324,20 +3324,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3359,49 +3359,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?query#fragment', - { input: 'http://example.org/', expected: '../' }, - { input: 'http://example.org/?', expected: '../?' }, - { input: 'http://example.org/#', expected: '../#' }, - { input: 'http://example.org/?query', expected: '../?query' }, - { input: 'http://example.org/#fragment', expected: '../#fragment' }, - { input: 'http://example.org/?query#', expected: '../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../foo' }, - { input: 'http://example.org/foo?', expected: '../foo?' }, - { input: 'http://example.org/foo#', expected: '../foo#' }, - { input: 'http://example.org/foo?query', expected: '../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3423,20 +3423,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '../extended' }, - { input: 'http://example.org/?extended', expected: '../?extended' }, - { input: 'http://example.org/#extended', expected: '../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3458,49 +3458,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../?/extended' }, - { input: 'http://example.org/??extended', expected: '../??extended' }, - { input: 'http://example.org/#/extended', expected: '../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../#?extended' }, - { input: 'http://example.org/##extended', expected: '../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3522,20 +3522,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3557,49 +3557,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3621,20 +3621,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3656,49 +3656,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/#', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3720,20 +3720,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3755,49 +3755,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?query', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3819,20 +3819,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3854,49 +3854,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/#fragment', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3918,20 +3918,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3953,49 +3953,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?query#', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4017,20 +4017,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4052,49 +4052,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?query#fragment', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4116,20 +4116,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4151,49 +4151,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4215,20 +4215,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4250,49 +4250,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4314,20 +4314,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4349,49 +4349,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz#', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4413,20 +4413,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4448,49 +4448,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?query', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4512,20 +4512,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4547,49 +4547,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz#fragment', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4611,20 +4611,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4646,49 +4646,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?query#', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4710,20 +4710,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4745,49 +4745,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?query#fragment', - { input: 'http://example.org/', expected: '../../' }, - { input: 'http://example.org/?', expected: '../../?' }, - { input: 'http://example.org/#', expected: '../../#' }, - { input: 'http://example.org/?query', expected: '../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../foo' }, - { input: 'http://example.org/foo?', expected: '../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4809,20 +4809,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../extended' }, - { input: 'http://example.org/?extended', expected: '../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4844,63 +4844,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -4908,34 +4908,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -4943,63 +4943,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5007,34 +5007,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5042,63 +5042,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/#', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5106,34 +5106,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5141,63 +5141,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?query', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5205,34 +5205,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5240,63 +5240,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/#fragment', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5304,34 +5304,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5339,63 +5339,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?query#', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5403,34 +5403,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5438,63 +5438,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?query#fragment', - { input: 'http://example.org/', expected: '../../../' }, - { input: 'http://example.org/?', expected: '../../../?' }, - { input: 'http://example.org/#', expected: '../../../#' }, - { input: 'http://example.org/?query', expected: '../../../?query' }, - { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, - { input: 'http://example.org/?query#', expected: '../../../?query#' }, - { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, - { input: 'http://example.org/foo', expected: '../../../foo' }, - { input: 'http://example.org/foo?', expected: '../../../foo?' }, - { input: 'http://example.org/foo#', expected: '../../../foo#' }, - { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '../../' }, - { input: 'http://example.org/foo/?', expected: '../../?' }, - { input: 'http://example.org/foo/#', expected: '../../#' }, - { input: 'http://example.org/foo/?query', expected: '../../?query' }, - { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '../../bar' }, - { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, - { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/', expected: '/' }, + { input: 'http://example.org/?', expected: '/?' }, + { input: 'http://example.org/#', expected: '/#' }, + { input: 'http://example.org/?query', expected: '/?query' }, + { input: 'http://example.org/#fragment', expected: '/#fragment' }, + { input: 'http://example.org/?query#', expected: '/?query#' }, + { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, + { input: 'http://example.org/foo', expected: '/foo' }, + { input: 'http://example.org/foo?', expected: '/foo?' }, + { input: 'http://example.org/foo#', expected: '/foo#' }, + { input: 'http://example.org/foo?query', expected: '/foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '/foo/' }, + { input: 'http://example.org/foo/?', expected: '/foo/?' }, + { input: 'http://example.org/foo/#', expected: '/foo/#' }, + { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, + { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, + { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, + { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5502,34 +5502,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '../../../extended' }, - { input: 'http://example.org/?extended', expected: '../../../?extended' }, - { input: 'http://example.org/#extended', expected: '../../../#extended' }, - { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, - { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '../../extended' }, - { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, - { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '/extended' }, + { input: 'http://example.org/?extended', expected: '/?extended' }, + { input: 'http://example.org/#extended', expected: '/#extended' }, + { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '/fooextended' }, + { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, + { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, + { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5537,32 +5537,32 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, - { input: 'http://example.org/??extended', expected: '../../../??extended' }, - { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, - { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, - { input: 'http://example.org/##extended', expected: '../../../##extended' }, - { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '/?/extended' }, + { input: 'http://example.org/??extended', expected: '/??extended' }, + { input: 'http://example.org/#/extended', expected: '/#/extended' }, + { input: 'http://example.org/#?extended', expected: '/#?extended' }, + { input: 'http://example.org/##extended', expected: '/##extended' }, + { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, ); function testRelativizes(baseIRI, ...cases) { From eb1030a9d1ce47aab8b025b98ddac17aae27e040 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Mon, 26 May 2025 14:09:25 +0100 Subject: [PATCH 2/5] chore: remove unused tests --- test/BaseIRI-test.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/BaseIRI-test.js b/test/BaseIRI-test.js index 1a4888f5..b3292ead 100644 --- a/test/BaseIRI-test.js +++ b/test/BaseIRI-test.js @@ -138,9 +138,6 @@ describe('BaseIRI', () => { relativizes('an IRI containing ../ in its fragment', 'http://example.org/foo/', 'http://example.org/foo/baz#bar/../baz', 'baz#bar/../baz'); - // relativizes('an IRI directly relative to the base with two sub paths', 'http://example.org/a/b/c/d/e/f/', - // 'http://example.org/a/b/c/d/h/i/', '../../h/i/'); - relativizes('an IRI directly relative to the base', 'http://example.org/foo/', 'http://example.org/foo/baz', 'baz'); @@ -149,9 +146,6 @@ describe('BaseIRI', () => { relativizes('an IRI where it is better to use a / path [/x/y]', 'http://example.org/x/q/r/n/m/', 'http://example.org/x/y', '/x/y'); - - // relativizes('an IRI where it is better to use a / path [/x/y/z]', 'http://example.org/x/q/r/n/m/', - // 'http://example.org/x/y/z', '/x/y/z'); }); }); From c4bce9c663f78eab1cbf2e43b4714adbbd31ff10 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Mon, 26 May 2025 14:39:40 +0100 Subject: [PATCH 3/5] chore: fix off-by-one comparison --- src/BaseIRI.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BaseIRI.js b/src/BaseIRI.js index 40952240..f7487788 100644 --- a/src/BaseIRI.js +++ b/src/BaseIRI.js @@ -62,7 +62,7 @@ export default class BaseIRI { const parentLength = 3 * (segments.length - i - 1); const baseLength = segments[i] - segments[0]; - if (parentLength < baseLength) { + if (parentLength <= baseLength) { this._pathReplacements[segments[i]] = PARENT.repeat(segments.length - i - 1); } else { From 1cc2acc0b54e1fa00003ff98eac9e1a179b12e4c Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Mon, 26 May 2025 14:40:28 +0100 Subject: [PATCH 4/5] chore: remove duplicate test --- test/BaseIRI-test.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/BaseIRI-test.js b/test/BaseIRI-test.js index b3292ead..4f4d8bf4 100644 --- a/test/BaseIRI-test.js +++ b/test/BaseIRI-test.js @@ -138,9 +138,6 @@ describe('BaseIRI', () => { relativizes('an IRI containing ../ in its fragment', 'http://example.org/foo/', 'http://example.org/foo/baz#bar/../baz', 'baz#bar/../baz'); - relativizes('an IRI directly relative to the base', 'http://example.org/foo/', - 'http://example.org/foo/baz', 'baz'); - relativizes('an IRI where it is better to use a / path', 'http://example.org/foo/baz/nook/task/tar/', 'http://example.org/foo/bar', '/foo/bar'); From c64695c47f4c03efc59acdfd62ae11d06ea29c46 Mon Sep 17 00:00:00 2001 From: Jesse Wright <63333554+jeswr@users.noreply.github.com> Date: Thu, 29 May 2025 16:25:29 +0100 Subject: [PATCH 5/5] chore: make absoluteIris opt in --- src/BaseIRI.js | 8 +- src/N3Writer.js | 2 +- test/BaseIRI-test.js | 22 +- test/N3Writer-test.js | 4115 +++++++++++++++++++++-------------------- 4 files changed, 2131 insertions(+), 2016 deletions(-) diff --git a/src/BaseIRI.js b/src/BaseIRI.js index f7487788..c6c5273a 100644 --- a/src/BaseIRI.js +++ b/src/BaseIRI.js @@ -12,11 +12,12 @@ const QUERY = '?'; const FRAGMENT = '#'; export default class BaseIRI { - constructor(base) { + constructor(base, options = {}) { this.base = base; this._baseLength = 0; this._baseMatcher = null; this._pathReplacements = new Array(base.length + 1); + this._options = options; } static supports(base) { @@ -59,10 +60,7 @@ export default class BaseIRI { // Precalculate parent path substitutions for (let i = 0; i < segments.length; i++) { - const parentLength = 3 * (segments.length - i - 1); - const baseLength = segments[i] - segments[0]; - - if (parentLength <= baseLength) { + if (!this._options.absoluteIris || (3 * (segments.length - i - 1)) <= (segments[i] - segments[0])) { this._pathReplacements[segments[i]] = PARENT.repeat(segments.length - i - 1); } else { diff --git a/src/N3Writer.js b/src/N3Writer.js index 07f486be..3f4366a5 100644 --- a/src/N3Writer.js +++ b/src/N3Writer.js @@ -60,7 +60,7 @@ export default class N3Writer { this._prefixIRIs = Object.create(null); options.prefixes && this.addPrefixes(options.prefixes); if (options.baseIRI) { - this._baseIri = new BaseIRI(options.baseIRI); + this._baseIri = new BaseIRI(options.baseIRI, { absoluteIris: options.absoluteIris }); } } else { diff --git a/test/BaseIRI-test.js b/test/BaseIRI-test.js index 4f4d8bf4..562ee4ac 100644 --- a/test/BaseIRI-test.js +++ b/test/BaseIRI-test.js @@ -139,16 +139,28 @@ describe('BaseIRI', () => { 'http://example.org/foo/baz#bar/../baz', 'baz#bar/../baz'); relativizes('an IRI where it is better to use a / path', 'http://example.org/foo/baz/nook/task/tar/', - 'http://example.org/foo/bar', '/foo/bar'); + 'http://example.org/foo/bar', '../../../../bar'); + + relativizes('an IRI where it is better to use a / path', 'http://example.org/foo/baz/nook/task/tar/', + 'http://example.org/foo/bar', '/foo/bar', true); + + relativizes('an IRI where it is better to use a / path [/x/y]', 'http://example.org/x/q/r/n/m/', + 'http://example.org/x/y', '../../../../y'); relativizes('an IRI where it is better to use a / path [/x/y]', 'http://example.org/x/q/r/n/m/', - 'http://example.org/x/y', '/x/y'); + 'http://example.org/x/y', '/x/y', true); }); }); -function relativizes(description, base, absolute, relative) { - it(`${relative ? 'relativizes' : 'does not relativize'} ${description}`, () => { - const baseIri = new BaseIRI(base); +function relativizes(description, base, absolute, relative, absoluteIris = false) { + it(`${relative ? 'relativizes' : 'does not relativize'} ${description} [absoluteIris: ${absoluteIris}]`, () => { + const baseIri = new BaseIRI(base, { absoluteIris }); expect(baseIri.toRelative(absolute)).toBe(relative || absolute); }); + if (!absoluteIris) { + it(`${relative ? 'relativizes' : 'does not relativize'} ${description}`, () => { + const baseIri = new BaseIRI(base); + expect(baseIri.toRelative(absolute)).toBe(relative || absolute); + }); + } } diff --git a/test/N3Writer-test.js b/test/N3Writer-test.js index 05845f37..30ef7d5c 100644 --- a/test/N3Writer-test.js +++ b/test/N3Writer-test.js @@ -2101,20 +2101,20 @@ describe('Writer', () => { ); testRelativizes('http://example.org/foo/', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: '#' }, @@ -2136,20 +2136,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: '#extended' }, @@ -2171,49 +2171,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2235,20 +2235,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2270,49 +2270,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: '#' }, @@ -2334,20 +2334,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: '#extended' }, @@ -2369,49 +2369,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?query', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2433,20 +2433,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2468,49 +2468,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: '#' }, @@ -2532,20 +2532,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: '#extended' }, @@ -2567,49 +2567,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?query#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2631,20 +2631,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2666,49 +2666,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/?query#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: '?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2730,20 +2730,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: '?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2765,49 +2765,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2829,20 +2829,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2864,49 +2864,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -2928,20 +2928,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -2963,49 +2963,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3027,20 +3027,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3062,49 +3062,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?query', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3126,20 +3126,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3161,49 +3161,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3225,20 +3225,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3260,49 +3260,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?query#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3324,20 +3324,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3359,49 +3359,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar?query#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../' }, + { input: 'http://example.org/?', expected: '../?' }, + { input: 'http://example.org/#', expected: '../#' }, + { input: 'http://example.org/?query', expected: '../?query' }, + { input: 'http://example.org/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/?query#', expected: '../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../foo' }, + { input: 'http://example.org/foo?', expected: '../foo?' }, + { input: 'http://example.org/foo#', expected: '../foo#' }, + { input: 'http://example.org/foo?query', expected: '../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: './' }, { input: 'http://example.org/foo/?', expected: './?' }, { input: 'http://example.org/foo/#', expected: './#' }, @@ -3423,20 +3423,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: 'bar/#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: 'bar/?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: 'bar/?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../extended' }, + { input: 'http://example.org/?extended', expected: '../?extended' }, + { input: 'http://example.org/#extended', expected: '../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: 'extended' }, { input: 'http://example.org/foo/?extended', expected: './?extended' }, { input: 'http://example.org/foo/#extended', expected: './#extended' }, @@ -3458,49 +3458,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: 'bar/#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: 'bar/?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: 'bar/?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../?/extended' }, + { input: 'http://example.org/??extended', expected: '../??extended' }, + { input: 'http://example.org/#/extended', expected: '../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../#?extended' }, + { input: 'http://example.org/##extended', expected: '../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3522,20 +3522,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3557,49 +3557,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3621,20 +3621,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3656,49 +3656,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3720,20 +3720,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3755,49 +3755,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?query', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3819,20 +3819,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3854,49 +3854,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -3918,20 +3918,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -3953,49 +3953,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?query#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4017,20 +4017,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4052,49 +4052,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/?query#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4116,20 +4116,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4151,49 +4151,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4215,20 +4215,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4250,49 +4250,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4314,20 +4314,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4349,49 +4349,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4413,20 +4413,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4448,49 +4448,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?query', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4512,20 +4512,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4547,49 +4547,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4611,20 +4611,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4646,49 +4646,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?query#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4710,20 +4710,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4745,49 +4745,49 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz?query#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, + { input: 'http://example.org/', expected: '../../' }, + { input: 'http://example.org/?', expected: '../../?' }, + { input: 'http://example.org/#', expected: '../../#' }, + { input: 'http://example.org/?query', expected: '../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../foo' }, + { input: 'http://example.org/foo?', expected: '../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../foo?query#fragment' }, { input: 'http://example.org/foo/', expected: '../' }, { input: 'http://example.org/foo/?', expected: '../?' }, { input: 'http://example.org/foo/#', expected: '../#' }, @@ -4809,20 +4809,20 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: './#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: './?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: './?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../extended' }, + { input: 'http://example.org/?extended', expected: '../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../foo?query#fragmentextended' }, { input: 'http://example.org/foo/extended', expected: '../extended' }, { input: 'http://example.org/foo/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/#extended', expected: '../#extended' }, @@ -4844,63 +4844,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: './#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: './?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: './?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '/foo/' }, - { input: 'http://example.org/foo/?', expected: '/foo/?' }, - { input: 'http://example.org/foo/#', expected: '/foo/#' }, - { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, - { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, - { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, - { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -4908,34 +4908,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, - { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, - { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -4943,63 +4943,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '/foo/' }, - { input: 'http://example.org/foo/?', expected: '/foo/?' }, - { input: 'http://example.org/foo/#', expected: '/foo/#' }, - { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, - { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, - { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, - { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5007,34 +5007,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, - { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, - { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5042,63 +5042,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '/foo/' }, - { input: 'http://example.org/foo/?', expected: '/foo/?' }, - { input: 'http://example.org/foo/#', expected: '/foo/#' }, - { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, - { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, - { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, - { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5106,34 +5106,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, - { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, - { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5141,63 +5141,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?query', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '/foo/' }, - { input: 'http://example.org/foo/?', expected: '/foo/?' }, - { input: 'http://example.org/foo/#', expected: '/foo/#' }, - { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, - { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, - { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, - { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5205,34 +5205,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, - { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, - { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5240,63 +5240,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/#fragment', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '/foo/' }, - { input: 'http://example.org/foo/?', expected: '/foo/?' }, - { input: 'http://example.org/foo/#', expected: '/foo/#' }, - { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, - { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, - { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, - { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5304,34 +5304,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, - { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, - { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5339,63 +5339,63 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?query#', - { input: 'http://example.org/', expected: '/' }, - { input: 'http://example.org/?', expected: '/?' }, - { input: 'http://example.org/#', expected: '/#' }, - { input: 'http://example.org/?query', expected: '/?query' }, - { input: 'http://example.org/#fragment', expected: '/#fragment' }, - { input: 'http://example.org/?query#', expected: '/?query#' }, - { input: 'http://example.org/?query#fragment', expected: '/?query#fragment' }, - { input: 'http://example.org/foo', expected: '/foo' }, - { input: 'http://example.org/foo?', expected: '/foo?' }, - { input: 'http://example.org/foo#', expected: '/foo#' }, - { input: 'http://example.org/foo?query', expected: '/foo?query' }, - { input: 'http://example.org/foo#fragment', expected: '/foo#fragment' }, - { input: 'http://example.org/foo?query#', expected: '/foo?query#' }, - { input: 'http://example.org/foo?query#fragment', expected: '/foo?query#fragment' }, - { input: 'http://example.org/foo/', expected: '/foo/' }, - { input: 'http://example.org/foo/?', expected: '/foo/?' }, - { input: 'http://example.org/foo/#', expected: '/foo/#' }, - { input: 'http://example.org/foo/?query', expected: '/foo/?query' }, - { input: 'http://example.org/foo/#fragment', expected: '/foo/#fragment' }, - { input: 'http://example.org/foo/?query#', expected: '/foo/?query#' }, - { input: 'http://example.org/foo/?query#fragment', expected: '/foo/?query#fragment' }, - { input: 'http://example.org/foo/bar', expected: '/foo/bar' }, - { input: 'http://example.org/foo/bar?', expected: '/foo/bar?' }, - { input: 'http://example.org/foo/bar#', expected: '/foo/bar#' }, - { input: 'http://example.org/foo/bar?query', expected: '/foo/bar?query' }, - { input: 'http://example.org/foo/bar#fragment', expected: '/foo/bar#fragment' }, - { input: 'http://example.org/foo/bar?query#', expected: '/foo/bar?query#' }, - { input: 'http://example.org/foo/bar?query#fragment', expected: '/foo/bar?query#fragment' }, + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, { input: 'http://example.org/foo/bar/', expected: '../' }, { input: 'http://example.org/foo/bar/?', expected: '../?' }, { input: 'http://example.org/foo/bar/#', expected: '../#' }, @@ -5403,34 +5403,34 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, - { input: 'http://example.org/extended', expected: '/extended' }, - { input: 'http://example.org/?extended', expected: '/?extended' }, - { input: 'http://example.org/#extended', expected: '/#extended' }, - { input: 'http://example.org/?queryextended', expected: '/?queryextended' }, - { input: 'http://example.org/#fragmentextended', expected: '/#fragmentextended' }, - { input: 'http://example.org/?query#extended', expected: '/?query#extended' }, - { input: 'http://example.org/?query#fragmentextended', expected: '/?query#fragmentextended' }, - { input: 'http://example.org/fooextended', expected: '/fooextended' }, - { input: 'http://example.org/foo?extended', expected: '/foo?extended' }, - { input: 'http://example.org/foo#extended', expected: '/foo#extended' }, - { input: 'http://example.org/foo?queryextended', expected: '/foo?queryextended' }, - { input: 'http://example.org/foo#fragmentextended', expected: '/foo#fragmentextended' }, - { input: 'http://example.org/foo?query#extended', expected: '/foo?query#extended' }, - { input: 'http://example.org/foo?query#fragmentextended', expected: '/foo?query#fragmentextended' }, - { input: 'http://example.org/foo/extended', expected: '/foo/extended' }, - { input: 'http://example.org/foo/?extended', expected: '/foo/?extended' }, - { input: 'http://example.org/foo/#extended', expected: '/foo/#extended' }, - { input: 'http://example.org/foo/?queryextended', expected: '/foo/?queryextended' }, - { input: 'http://example.org/foo/#fragmentextended', expected: '/foo/#fragmentextended' }, - { input: 'http://example.org/foo/?query#extended', expected: '/foo/?query#extended' }, - { input: 'http://example.org/foo/?query#fragmentextended', expected: '/foo/?query#fragmentextended' }, - { input: 'http://example.org/foo/barextended', expected: '/foo/barextended' }, - { input: 'http://example.org/foo/bar?extended', expected: '/foo/bar?extended' }, - { input: 'http://example.org/foo/bar#extended', expected: '/foo/bar#extended' }, - { input: 'http://example.org/foo/bar?queryextended', expected: '/foo/bar?queryextended' }, - { input: 'http://example.org/foo/bar#fragmentextended', expected: '/foo/bar#fragmentextended' }, - { input: 'http://example.org/foo/bar?query#extended', expected: '/foo/bar?query#extended' }, - { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '/foo/bar?query#fragmentextended' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, @@ -5438,35 +5438,134 @@ describe('Writer', () => { { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, - { input: 'http://example.org/?/extended', expected: '/?/extended' }, - { input: 'http://example.org/??extended', expected: '/??extended' }, - { input: 'http://example.org/#/extended', expected: '/#/extended' }, - { input: 'http://example.org/#?extended', expected: '/#?extended' }, - { input: 'http://example.org/##extended', expected: '/##extended' }, - { input: 'http://example.org/?query/extended', expected: '/?query/extended' }, - { input: 'http://example.org/?query?extended', expected: '/?query?extended' }, - { input: 'http://example.org/#fragment/extended', expected: '/#fragment/extended' }, - { input: 'http://example.org/#fragment?extended', expected: '/#fragment?extended' }, - { input: 'http://example.org/#fragment#extended', expected: '/#fragment#extended' }, - { input: 'http://example.org/?query#fragment/extended', expected: '/?query#fragment/extended' }, - { input: 'http://example.org/?query#fragment?extended', expected: '/?query#fragment?extended' }, - { input: 'http://example.org/?query#fragment#extended', expected: '/?query#fragment#extended' }, - { input: 'http://example.org/foo?/extended', expected: '/foo?/extended' }, - { input: 'http://example.org/foo??extended', expected: '/foo??extended' }, - { input: 'http://example.org/foo#/extended', expected: '/foo#/extended' }, - { input: 'http://example.org/foo#?extended', expected: '/foo#?extended' }, - { input: 'http://example.org/foo##extended', expected: '/foo##extended' }, - { input: 'http://example.org/foo?query/extended', expected: '/foo?query/extended' }, - { input: 'http://example.org/foo?query?extended', expected: '/foo?query?extended' }, - { input: 'http://example.org/foo#fragment/extended', expected: '/foo#fragment/extended' }, - { input: 'http://example.org/foo#fragment?extended', expected: '/foo#fragment?extended' }, - { input: 'http://example.org/foo#fragment#extended', expected: '/foo#fragment#extended' }, - { input: 'http://example.org/foo?query#fragment/extended', expected: '/foo?query#fragment/extended' }, - { input: 'http://example.org/foo?query#fragment?extended', expected: '/foo?query#fragment?extended' }, - { input: 'http://example.org/foo?query#fragment#extended', expected: '/foo?query#fragment#extended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, ); testRelativizes('http://example.org/foo/bar/baz/?query#fragment', + { input: 'http://example.org/', expected: '../../../' }, + { input: 'http://example.org/?', expected: '../../../?' }, + { input: 'http://example.org/#', expected: '../../../#' }, + { input: 'http://example.org/?query', expected: '../../../?query' }, + { input: 'http://example.org/#fragment', expected: '../../../#fragment' }, + { input: 'http://example.org/?query#', expected: '../../../?query#' }, + { input: 'http://example.org/?query#fragment', expected: '../../../?query#fragment' }, + { input: 'http://example.org/foo', expected: '../../../foo' }, + { input: 'http://example.org/foo?', expected: '../../../foo?' }, + { input: 'http://example.org/foo#', expected: '../../../foo#' }, + { input: 'http://example.org/foo?query', expected: '../../../foo?query' }, + { input: 'http://example.org/foo#fragment', expected: '../../../foo#fragment' }, + { input: 'http://example.org/foo?query#', expected: '../../../foo?query#' }, + { input: 'http://example.org/foo?query#fragment', expected: '../../../foo?query#fragment' }, + { input: 'http://example.org/foo/', expected: '../../' }, + { input: 'http://example.org/foo/?', expected: '../../?' }, + { input: 'http://example.org/foo/#', expected: '../../#' }, + { input: 'http://example.org/foo/?query', expected: '../../?query' }, + { input: 'http://example.org/foo/#fragment', expected: '../../#fragment' }, + { input: 'http://example.org/foo/?query#', expected: '../../?query#' }, + { input: 'http://example.org/foo/?query#fragment', expected: '../../?query#fragment' }, + { input: 'http://example.org/foo/bar', expected: '../../bar' }, + { input: 'http://example.org/foo/bar?', expected: '../../bar?' }, + { input: 'http://example.org/foo/bar#', expected: '../../bar#' }, + { input: 'http://example.org/foo/bar?query', expected: '../../bar?query' }, + { input: 'http://example.org/foo/bar#fragment', expected: '../../bar#fragment' }, + { input: 'http://example.org/foo/bar?query#', expected: '../../bar?query#' }, + { input: 'http://example.org/foo/bar?query#fragment', expected: '../../bar?query#fragment' }, + { input: 'http://example.org/foo/bar/', expected: '../' }, + { input: 'http://example.org/foo/bar/?', expected: '../?' }, + { input: 'http://example.org/foo/bar/#', expected: '../#' }, + { input: 'http://example.org/foo/bar/?query', expected: '../?query' }, + { input: 'http://example.org/foo/bar/#fragment', expected: '../#fragment' }, + { input: 'http://example.org/foo/bar/?query#', expected: '../?query#' }, + { input: 'http://example.org/foo/bar/?query#fragment', expected: '../?query#fragment' }, + { input: 'http://example.org/extended', expected: '../../../extended' }, + { input: 'http://example.org/?extended', expected: '../../../?extended' }, + { input: 'http://example.org/#extended', expected: '../../../#extended' }, + { input: 'http://example.org/?queryextended', expected: '../../../?queryextended' }, + { input: 'http://example.org/#fragmentextended', expected: '../../../#fragmentextended' }, + { input: 'http://example.org/?query#extended', expected: '../../../?query#extended' }, + { input: 'http://example.org/?query#fragmentextended', expected: '../../../?query#fragmentextended' }, + { input: 'http://example.org/fooextended', expected: '../../../fooextended' }, + { input: 'http://example.org/foo?extended', expected: '../../../foo?extended' }, + { input: 'http://example.org/foo#extended', expected: '../../../foo#extended' }, + { input: 'http://example.org/foo?queryextended', expected: '../../../foo?queryextended' }, + { input: 'http://example.org/foo#fragmentextended', expected: '../../../foo#fragmentextended' }, + { input: 'http://example.org/foo?query#extended', expected: '../../../foo?query#extended' }, + { input: 'http://example.org/foo?query#fragmentextended', expected: '../../../foo?query#fragmentextended' }, + { input: 'http://example.org/foo/extended', expected: '../../extended' }, + { input: 'http://example.org/foo/?extended', expected: '../../?extended' }, + { input: 'http://example.org/foo/#extended', expected: '../../#extended' }, + { input: 'http://example.org/foo/?queryextended', expected: '../../?queryextended' }, + { input: 'http://example.org/foo/#fragmentextended', expected: '../../#fragmentextended' }, + { input: 'http://example.org/foo/?query#extended', expected: '../../?query#extended' }, + { input: 'http://example.org/foo/?query#fragmentextended', expected: '../../?query#fragmentextended' }, + { input: 'http://example.org/foo/barextended', expected: '../../barextended' }, + { input: 'http://example.org/foo/bar?extended', expected: '../../bar?extended' }, + { input: 'http://example.org/foo/bar#extended', expected: '../../bar#extended' }, + { input: 'http://example.org/foo/bar?queryextended', expected: '../../bar?queryextended' }, + { input: 'http://example.org/foo/bar#fragmentextended', expected: '../../bar#fragmentextended' }, + { input: 'http://example.org/foo/bar?query#extended', expected: '../../bar?query#extended' }, + { input: 'http://example.org/foo/bar?query#fragmentextended', expected: '../../bar?query#fragmentextended' }, + { input: 'http://example.org/foo/bar/extended', expected: '../extended' }, + { input: 'http://example.org/foo/bar/?extended', expected: '../?extended' }, + { input: 'http://example.org/foo/bar/#extended', expected: '../#extended' }, + { input: 'http://example.org/foo/bar/?queryextended', expected: '../?queryextended' }, + { input: 'http://example.org/foo/bar/#fragmentextended', expected: '../#fragmentextended' }, + { input: 'http://example.org/foo/bar/?query#extended', expected: '../?query#extended' }, + { input: 'http://example.org/foo/bar/?query#fragmentextended', expected: '../?query#fragmentextended' }, + { input: 'http://example.org/?/extended', expected: '../../../?/extended' }, + { input: 'http://example.org/??extended', expected: '../../../??extended' }, + { input: 'http://example.org/#/extended', expected: '../../../#/extended' }, + { input: 'http://example.org/#?extended', expected: '../../../#?extended' }, + { input: 'http://example.org/##extended', expected: '../../../##extended' }, + { input: 'http://example.org/?query/extended', expected: '../../../?query/extended' }, + { input: 'http://example.org/?query?extended', expected: '../../../?query?extended' }, + { input: 'http://example.org/#fragment/extended', expected: '../../../#fragment/extended' }, + { input: 'http://example.org/#fragment?extended', expected: '../../../#fragment?extended' }, + { input: 'http://example.org/#fragment#extended', expected: '../../../#fragment#extended' }, + { input: 'http://example.org/?query#fragment/extended', expected: '../../../?query#fragment/extended' }, + { input: 'http://example.org/?query#fragment?extended', expected: '../../../?query#fragment?extended' }, + { input: 'http://example.org/?query#fragment#extended', expected: '../../../?query#fragment#extended' }, + { input: 'http://example.org/foo?/extended', expected: '../../../foo?/extended' }, + { input: 'http://example.org/foo??extended', expected: '../../../foo??extended' }, + { input: 'http://example.org/foo#/extended', expected: '../../../foo#/extended' }, + { input: 'http://example.org/foo#?extended', expected: '../../../foo#?extended' }, + { input: 'http://example.org/foo##extended', expected: '../../../foo##extended' }, + { input: 'http://example.org/foo?query/extended', expected: '../../../foo?query/extended' }, + { input: 'http://example.org/foo?query?extended', expected: '../../../foo?query?extended' }, + { input: 'http://example.org/foo#fragment/extended', expected: '../../../foo#fragment/extended' }, + { input: 'http://example.org/foo#fragment?extended', expected: '../../../foo#fragment?extended' }, + { input: 'http://example.org/foo#fragment#extended', expected: '../../../foo#fragment#extended' }, + { input: 'http://example.org/foo?query#fragment/extended', expected: '../../../foo?query#fragment/extended' }, + { input: 'http://example.org/foo?query#fragment?extended', expected: '../../../foo?query#fragment?extended' }, + { input: 'http://example.org/foo?query#fragment#extended', expected: '../../../foo?query#fragment#extended' }, + ); + + testRelativizes({ baseIRI: 'http://example.org/foo/bar/baz/?query#fragment', absoluteIris: true }, { input: 'http://example.org/', expected: '/' }, { input: 'http://example.org/?', expected: '/?' }, { input: 'http://example.org/#', expected: '/#' }, @@ -5566,10 +5665,16 @@ describe('Writer', () => { ); function testRelativizes(baseIRI, ...cases) { + let absoluteIris = false; + if (typeof baseIRI === 'object') { + absoluteIris = baseIRI.absoluteIris; + baseIRI = baseIRI.baseIRI; + } + describe(`baseIRI ${baseIRI}`, () => { const parser = new Parser({ baseIRI }); for (const { input, expected } of cases) { - const writer = new Writer({ baseIRI }); + const writer = new Writer({ baseIRI, absoluteIris }); const quad = new Quad(new NamedNode('urn:ex:s'), new NamedNode('urn:ex:p'), new NamedNode(input)); it(`relativizes <${input}> to <${expected}>`, async () => { writer.addQuad(quad);