# -*- tcl -*-
# ------------------------------------------------------------------------------

source [file join \
	[file dirname [file dirname [file join [pwd] [info script]]]] \
	devtools testutilities.tcl]

testsNeedTcl     8.5
testsNeedTcltest 1.0

testing {
    useLocal uri.tcl uri
}

# ------------------------------------------------------------------------------
# 2016-12-16 to 2017-01-09 revisions (KJN)
# ------------------------------------------------------------------------------
# (1) Test results corrected to match RFC 3986 Sec. 5.4.1 for tests:
#     uri-rfc2396-1.7 uri-rfc2396-1.9 uri-rfc2396-2.7 uri-rfc2396-2.9
# (2) Add tests uri-rfc2396-1.14a uri-rfc2396-2.14a from the list in RFC 3986.
# (3) All tests now pass: existing "knownBug" constraints removed.
# (4) Add tests uri-rfc2396-3.*, uri-rfc2396-4.* for different cases of query
#     and fragment.
# (5) Add tests uri-rfc2396-5.*, uri-rfc2396-8.* for uri::resolve without
#     explicit call to uri::canonicalize.
# (6) Add tests uri-rfc2396-11.*,  uri-rfc2396-12.* from RFC 3986 Sec. 5.4.2
#     "Abnormal Examples".
# (7) Tests uri-rfc2396-11.19, uri-rfc2396-12.19 fail - new "knownBug"
#     constraints and explanation added.
# ------------------------------------------------------------------------------

# Test the "Normal Examples" from RFC 3986 Sec. 5.4.1.

test uri-rfc2396-1.1 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g:h]
} g:h

test uri-rfc2396-1.2 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g]
} http://a/b/c/g

test uri-rfc2396-1.3 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ./g]
} http://a/b/c/g

test uri-rfc2396-1.4 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g/]
} http://a/b/c/g/

test uri-rfc2396-1.5 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q /g]
} http://a/g

test uri-rfc2396-1.6 {uri::resolve} {} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q //g]
} http://g

test uri-rfc2396-1.7 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ?y]
} {http://a/b/c/d;p?y}

test uri-rfc2396-1.8 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g?y]
} http://a/b/c/g?y

test uri-rfc2396-1.9 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q \#s]
} {http://a/b/c/d;p?q#s}

test uri-rfc2396-1.10 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g\#s]
} http://a/b/c/g#s

test uri-rfc2396-1.11 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g?y\#s]
} http://a/b/c/g?y#s

test uri-rfc2396-1.12 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q \;x]
} {http://a/b/c/;x}

test uri-rfc2396-1.13 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g\;x]
} {http://a/b/c/g;x}

test uri-rfc2396-1.14 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g\;x?y#s]
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-1.14a {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q {}]
} {http://a/b/c/d;p?q}

test uri-rfc2396-1.15 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q .]
} http://a/b/c/

test uri-rfc2396-1.16 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ./]
} http://a/b/c/

test uri-rfc2396-1.17 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ..]
} http://a/b/

test uri-rfc2396-1.18 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../]
} http://a/b/

test uri-rfc2396-1.19 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../g]
} http://a/b/g

test uri-rfc2396-1.20 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../..]
} http://a/

test uri-rfc2396-1.21 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../../]
} http://a/

test uri-rfc2396-1.22 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../../g]
} http://a/g


# Cf. the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# The tests below are similar, but the base URL omits the query-string "?q".

test uri-rfc2396-2.1 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g:h]
} g:h

test uri-rfc2396-2.2 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g]
} http://a/b/c/g

test uri-rfc2396-2.3 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ./g]
} http://a/b/c/g

test uri-rfc2396-2.4 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g/]
} http://a/b/c/g/

test uri-rfc2396-2.5 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p /g]
} http://a/g

test uri-rfc2396-2.6 {uri::resolve} {} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p //g]
} http://g

test uri-rfc2396-2.7 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ?y]
} {http://a/b/c/d;p?y}

test uri-rfc2396-2.8 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g?y]
} http://a/b/c/g?y

test uri-rfc2396-2.9 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p \#s]
} {http://a/b/c/d;p#s}

test uri-rfc2396-2.10 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g\#s]
} http://a/b/c/g#s

test uri-rfc2396-2.11 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g?y\#s]
} http://a/b/c/g?y#s

test uri-rfc2396-2.12 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p \;x]
} {http://a/b/c/;x}

test uri-rfc2396-2.13 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g\;x]
} {http://a/b/c/g;x}

test uri-rfc2396-2.14 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p g\;x?y#s]
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-2.14a {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p {}]
} {http://a/b/c/d;p}

test uri-rfc2396-2.15 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p .]
} http://a/b/c/

test uri-rfc2396-2.16 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ./]
} http://a/b/c/

test uri-rfc2396-2.17 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ..]
} http://a/b/

test uri-rfc2396-2.18 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ../]
} http://a/b/

test uri-rfc2396-2.19 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ../g]
} http://a/b/g

test uri-rfc2396-2.20 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ../..]
} http://a/

test uri-rfc2396-2.21 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ../../]
} http://a/

test uri-rfc2396-2.22 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p ../../g]
} http://a/g

# Cf. the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# The tests below are similar, but the base URL has a fragment #f

test uri-rfc2396-3.1 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g:h]
} g:h

test uri-rfc2396-3.2 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g]
} http://a/b/c/g

test uri-rfc2396-3.3 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ./g]
} http://a/b/c/g

test uri-rfc2396-3.4 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g/]
} http://a/b/c/g/

test uri-rfc2396-3.5 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f /g]
} http://a/g

test uri-rfc2396-3.6 {uri::resolve} {} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f //g]
} http://g

test uri-rfc2396-3.7 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ?y]
} {http://a/b/c/d;p?y}

test uri-rfc2396-3.8 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g?y]
} http://a/b/c/g?y

test uri-rfc2396-3.9 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f \#s]
} {http://a/b/c/d;p?q#s}

test uri-rfc2396-3.10 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g\#s]
} http://a/b/c/g#s

test uri-rfc2396-3.11 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g?y\#s]
} http://a/b/c/g?y#s

test uri-rfc2396-3.12 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f \;x]
} {http://a/b/c/;x}

test uri-rfc2396-3.13 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g\;x]
} {http://a/b/c/g;x}

test uri-rfc2396-3.14 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f g\;x?y#s]
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-3.14a {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f {}]
} {http://a/b/c/d;p?q}

test uri-rfc2396-3.15 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f .]
} http://a/b/c/

test uri-rfc2396-3.16 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ./]
} http://a/b/c/

test uri-rfc2396-3.17 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ..]
} http://a/b/

test uri-rfc2396-3.18 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ../]
} http://a/b/

test uri-rfc2396-3.19 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ../g]
} http://a/b/g

test uri-rfc2396-3.20 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ../..]
} http://a/

test uri-rfc2396-3.21 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ../../]
} http://a/

test uri-rfc2396-3.22 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q#f ../../g]
} http://a/g


# Cf. the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# The tests below are similar, but the base URL omits the query-string "?q" and has a fragment #f.

test uri-rfc2396-4.1 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g:h]
} g:h

test uri-rfc2396-4.2 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g]
} http://a/b/c/g

test uri-rfc2396-4.3 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ./g]
} http://a/b/c/g

test uri-rfc2396-4.4 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g/]
} http://a/b/c/g/

test uri-rfc2396-4.5 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f /g]
} http://a/g

test uri-rfc2396-4.6 {uri::resolve} {} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f //g]
} http://g

test uri-rfc2396-4.7 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ?y]
} {http://a/b/c/d;p?y}

test uri-rfc2396-4.8 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g?y]
} http://a/b/c/g?y

test uri-rfc2396-4.9 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f \#s]
} {http://a/b/c/d;p#s}

test uri-rfc2396-4.10 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g\#s]
} http://a/b/c/g#s

test uri-rfc2396-4.11 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g?y\#s]
} http://a/b/c/g?y#s

test uri-rfc2396-4.12 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f \;x]
} {http://a/b/c/;x}

test uri-rfc2396-4.13 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g\;x]
} {http://a/b/c/g;x}

test uri-rfc2396-4.14 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f g\;x?y#s]
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-4.14a {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f {}]
} {http://a/b/c/d;p}

test uri-rfc2396-4.15 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f .]
} http://a/b/c/

test uri-rfc2396-4.16 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ./]
} http://a/b/c/

test uri-rfc2396-4.17 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ..]
} http://a/b/

test uri-rfc2396-4.18 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ../]
} http://a/b/

test uri-rfc2396-4.19 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ../g]
} http://a/b/g

test uri-rfc2396-4.20 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ../..]
} http://a/

test uri-rfc2396-4.21 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ../../]
} http://a/

test uri-rfc2396-4.22 {uri::resolve} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p#f ../../g]
} http://a/g

# Test the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# Without explicit canonicalization.

test uri-rfc2396-5.1 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g:h
} g:h

test uri-rfc2396-5.2 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g
} http://a/b/c/g

test uri-rfc2396-5.3 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ./g
} http://a/b/c/g

test uri-rfc2396-5.4 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g/
} http://a/b/c/g/

test uri-rfc2396-5.5 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q /g
} http://a/g

test uri-rfc2396-5.6 {uri::resolve} {} {
    uri::resolve http://a/b/c/d\;p?q //g
} http://g

test uri-rfc2396-5.7 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ?y
} {http://a/b/c/d;p?y}

test uri-rfc2396-5.8 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g?y
} http://a/b/c/g?y

test uri-rfc2396-5.9 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q \#s
} {http://a/b/c/d;p?q#s}

test uri-rfc2396-5.10 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g\#s
} http://a/b/c/g#s

test uri-rfc2396-5.11 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g?y\#s
} http://a/b/c/g?y#s

test uri-rfc2396-5.12 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q \;x
} {http://a/b/c/;x}

test uri-rfc2396-5.13 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g\;x
} {http://a/b/c/g;x}

test uri-rfc2396-5.14 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q g\;x?y#s
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-5.14a {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q {}
} {http://a/b/c/d;p?q}

test uri-rfc2396-5.15 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q .
} http://a/b/c/

test uri-rfc2396-5.16 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ./
} http://a/b/c/

test uri-rfc2396-5.17 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ..
} http://a/b/

test uri-rfc2396-5.18 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ../
} http://a/b/

test uri-rfc2396-5.19 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ../g
} http://a/b/g

test uri-rfc2396-5.20 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ../..
} http://a/

test uri-rfc2396-5.21 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ../../
} http://a/

test uri-rfc2396-5.22 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q ../../g
} http://a/g


# Cf. the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# The tests below are similar, but the base URL omits the query-string "?q".
# Without explicit canonicalization.

test uri-rfc2396-6.1 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g:h
} g:h

test uri-rfc2396-6.2 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g
} http://a/b/c/g

test uri-rfc2396-6.3 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ./g
} http://a/b/c/g

test uri-rfc2396-6.4 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g/
} http://a/b/c/g/

test uri-rfc2396-6.5 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p /g
} http://a/g

test uri-rfc2396-6.6 {uri::resolve} {} {
    uri::resolve http://a/b/c/d\;p //g
} http://g

test uri-rfc2396-6.7 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ?y
} {http://a/b/c/d;p?y}

test uri-rfc2396-6.8 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g?y
} http://a/b/c/g?y

test uri-rfc2396-6.9 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p \#s
} {http://a/b/c/d;p#s}

test uri-rfc2396-6.10 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g\#s
} http://a/b/c/g#s

test uri-rfc2396-6.11 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g?y\#s
} http://a/b/c/g?y#s

test uri-rfc2396-6.12 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p \;x
} {http://a/b/c/;x}

test uri-rfc2396-6.13 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g\;x
} {http://a/b/c/g;x}

test uri-rfc2396-6.14 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p g\;x?y#s
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-6.14a {uri::resolve} {
    uri::resolve http://a/b/c/d\;p {}
} {http://a/b/c/d;p}

test uri-rfc2396-6.15 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p .
} http://a/b/c/

test uri-rfc2396-6.16 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ./
} http://a/b/c/

test uri-rfc2396-6.17 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ..
} http://a/b/

test uri-rfc2396-6.18 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ../
} http://a/b/

test uri-rfc2396-6.19 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ../g
} http://a/b/g

test uri-rfc2396-6.20 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ../..
} http://a/

test uri-rfc2396-6.21 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ../../
} http://a/

test uri-rfc2396-6.22 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p ../../g
} http://a/g

# Cf. the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# The tests below are similar, but the base URL has a fragment #f
# Without explicit canonicalization.

test uri-rfc2396-7.1 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g:h
} g:h

test uri-rfc2396-7.2 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g
} http://a/b/c/g

test uri-rfc2396-7.3 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ./g
} http://a/b/c/g

test uri-rfc2396-7.4 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g/
} http://a/b/c/g/

test uri-rfc2396-7.5 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f /g
} http://a/g

test uri-rfc2396-7.6 {uri::resolve} {} {
    uri::resolve http://a/b/c/d\;p?q#f //g
} http://g

test uri-rfc2396-7.7 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ?y
} {http://a/b/c/d;p?y}

test uri-rfc2396-7.8 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g?y
} http://a/b/c/g?y

test uri-rfc2396-7.9 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f \#s
} {http://a/b/c/d;p?q#s}

test uri-rfc2396-7.10 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g\#s
} http://a/b/c/g#s

test uri-rfc2396-7.11 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g?y\#s
} http://a/b/c/g?y#s

test uri-rfc2396-7.12 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f \;x
} {http://a/b/c/;x}

test uri-rfc2396-7.13 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g\;x
} {http://a/b/c/g;x}

test uri-rfc2396-7.14 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f g\;x?y#s
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-7.14a {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f {}
} {http://a/b/c/d;p?q}

test uri-rfc2396-7.15 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f .
} http://a/b/c/

test uri-rfc2396-7.16 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ./
} http://a/b/c/

test uri-rfc2396-7.17 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ..
} http://a/b/

test uri-rfc2396-7.18 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ../
} http://a/b/

test uri-rfc2396-7.19 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ../g
} http://a/b/g

test uri-rfc2396-7.20 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ../..
} http://a/

test uri-rfc2396-7.21 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ../../
} http://a/

test uri-rfc2396-7.22 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p?q#f ../../g
} http://a/g

# Cf. the "Normal Examples" from RFC 3986 Sec. 5.4.1.
# The tests below are similar, but the base URL omits the query-string "?q" and has a fragment #f.
# Without explicit canonicalization.

test uri-rfc2396-8.1 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g:h
} g:h

test uri-rfc2396-8.2 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g
} http://a/b/c/g

test uri-rfc2396-8.3 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ./g
} http://a/b/c/g

test uri-rfc2396-8.4 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g/
} http://a/b/c/g/

test uri-rfc2396-8.5 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f /g
} http://a/g

test uri-rfc2396-8.6 {uri::resolve} {} {
    uri::resolve http://a/b/c/d\;p#f //g
} http://g

test uri-rfc2396-8.7 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ?y
} {http://a/b/c/d;p?y}

test uri-rfc2396-8.8 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g?y
} http://a/b/c/g?y

test uri-rfc2396-8.9 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f \#s
} {http://a/b/c/d;p#s}

test uri-rfc2396-8.10 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g\#s
} http://a/b/c/g#s

test uri-rfc2396-8.11 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g?y\#s
} http://a/b/c/g?y#s

test uri-rfc2396-8.12 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f \;x
} {http://a/b/c/;x}

test uri-rfc2396-8.13 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g\;x
} {http://a/b/c/g;x}

test uri-rfc2396-8.14 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f g\;x?y#s
} {http://a/b/c/g;x?y#s}

test uri-rfc2396-8.14a {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f {}
} {http://a/b/c/d;p}

test uri-rfc2396-8.15 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f .
} http://a/b/c/

test uri-rfc2396-8.16 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ./
} http://a/b/c/

test uri-rfc2396-8.17 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ..
} http://a/b/

test uri-rfc2396-8.18 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ../
} http://a/b/

test uri-rfc2396-8.19 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ../g
} http://a/b/g

test uri-rfc2396-8.20 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ../..
} http://a/

test uri-rfc2396-8.21 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ../../
} http://a/

test uri-rfc2396-8.22 {uri::resolve} {
    uri::resolve http://a/b/c/d\;p#f ../../g
} http://a/g


# Now tests from RFC 3986 Sec. 5.4.2. "Abnormal Examples".

test uri-rfc2396-11.1  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../../../g]
} http://a/g

test uri-rfc2396-11.2  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ../../../../g]
} http://a/g

test uri-rfc2396-11.3  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q /./g]
} http://a/g

test uri-rfc2396-11.4  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q /../g]
} http://a/g

test uri-rfc2396-11.5  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g.]
} http://a/b/c/g.

test uri-rfc2396-11.6  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q .g]
} http://a/b/c/.g

test uri-rfc2396-11.7  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g..]
} http://a/b/c/g..

test uri-rfc2396-11.8  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ..g]
} http://a/b/c/..g

test uri-rfc2396-11.9  {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ./../g]
} http://a/b/g

test uri-rfc2396-11.10 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q ./g/.]
} http://a/b/c/g/

test uri-rfc2396-11.11 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g/./h]
} http://a/b/c/g/h

test uri-rfc2396-11.12 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g/../h]
} http://a/b/c/h

test uri-rfc2396-11.13 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g\;x=1/./y]
} {http://a/b/c/g;x=1/y}

test uri-rfc2396-11.14 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g\;x=1/../y]
} http://a/b/c/y

test uri-rfc2396-11.15 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g?y/./x]
} http://a/b/c/g?y/./x

test uri-rfc2396-11.16 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g?y/../x]
} http://a/b/c/g?y/../x

test uri-rfc2396-11.17 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g#s/./x]
} http://a/b/c/g#s/./x

test uri-rfc2396-11.18 {uri::resolve abnormal examples} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q g#s/../x]
} http://a/b/c/g#s/../x

test uri-rfc2396-11.19 {uri::resolve abnormal examples
    RFC 3986 Sec. 5.4.2 advises avoiding this usage which is a loophole
    in RFC 1630, which allows a relative URI to specify the scheme if it
    is the same as the scheme of the base URI.
    uri::resolve is a "strict parser" in the sense of RFC 3986 Sec. 5.2.2:
    however, it does not handle the loophole correctly and fails this test.
} {knownBug rfc1630-loophole-avoid-use} {
    uri::canonicalize [uri::resolve http://a/b/c/d\;p?q http:g]
} http:g

# Cf. tests from RFC 3986 Sec. 5.4.2. "Abnormal Examples".
# Without explicit canonicalization.

test uri-rfc2396-12.1  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q ../../../g
} http://a/g

test uri-rfc2396-12.2  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q ../../../../g
} http://a/g

test uri-rfc2396-12.3  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q /./g
} http://a/g

test uri-rfc2396-12.4  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q /../g
} http://a/g

test uri-rfc2396-12.5  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g.
} http://a/b/c/g.

test uri-rfc2396-12.6  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q .g
} http://a/b/c/.g

test uri-rfc2396-12.7  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g..
} http://a/b/c/g..

test uri-rfc2396-12.8  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q ..g
} http://a/b/c/..g

test uri-rfc2396-12.9  {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q ./../g
} http://a/b/g

test uri-rfc2396-12.10 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q ./g/.
} http://a/b/c/g/

test uri-rfc2396-12.11 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g/./h
} http://a/b/c/g/h

test uri-rfc2396-12.12 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g/../h
} http://a/b/c/h

test uri-rfc2396-12.13 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g\;x=1/./y
} {http://a/b/c/g;x=1/y}

test uri-rfc2396-12.14 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g\;x=1/../y
} http://a/b/c/y

test uri-rfc2396-12.15 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g?y/./x
} http://a/b/c/g?y/./x

test uri-rfc2396-12.16 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g?y/../x
} http://a/b/c/g?y/../x

test uri-rfc2396-12.17 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g#s/./x
} http://a/b/c/g#s/./x

test uri-rfc2396-12.18 {uri::resolve abnormal examples} {
    uri::resolve http://a/b/c/d\;p?q g#s/../x
} http://a/b/c/g#s/../x

test uri-rfc2396-12.19 {uri::resolve abnormal examples
    RFC 3986 Sec. 5.4.2 advises avoiding this usage which is a loophole
    in RFC 1630, which allows a relative URI to specify the scheme if it
    is the same as the scheme of the base URI.
    uri::resolve is a "strict parser" in the sense of RFC 3986 Sec. 5.2.2:
    however, it does not handle the loophole correctly and fails this test.
} {knownBug rfc1630-loophole-avoid-use} {
    uri::resolve http://a/b/c/d\;p?q http:g
} http:g



# ------------------------------------------------------------------------------

testsuiteCleanup
return

# ------------------------------------------------------------------------------
# Local Variables:
#   mode: tcl
#   indent-tabs-mode: nil
# End:
