Blame tests/uri001.hs

Packit 0e2aa3
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
Packit 0e2aa3
--------------------------------------------------------------------------------
Packit 0e2aa3
--  $Id: URITest.hs,v 1.8 2005/07/19 22:01:27 gklyne Exp $
Packit 0e2aa3
--
Packit 0e2aa3
--  Copyright (c) 2004, G. KLYNE.  All rights reserved.
Packit 0e2aa3
--  See end of this file for licence information.
Packit 0e2aa3
--------------------------------------------------------------------------------
Packit 0e2aa3
-- |
Packit 0e2aa3
--  Module      :  URITest
Packit 0e2aa3
--  Copyright   :  (c) 2004, Graham Klyne
Packit 0e2aa3
--  License     :  BSD-style (see end of this file)
Packit 0e2aa3
--
Packit 0e2aa3
--  Maintainer  :  Graham Klyne
Packit 0e2aa3
--  Stability   :  provisional
Packit 0e2aa3
--  Portability :  H98
Packit 0e2aa3
--
Packit 0e2aa3
--  This Module contains test cases for module URI.
Packit 0e2aa3
--
Packit 0e2aa3
--  To run this test without using Cabal to build the package
Packit 0e2aa3
--  (2013-01-05, instructions tested on MacOS):
Packit 0e2aa3
--  1. Install Haskell platform
Packit 0e2aa3
--  2. cabal install test-framework
Packit 0e2aa3
--  3. cabal install test-framework-hunit
Packit 0e2aa3
--  4. ghc -XDeriveDataTypeable -D"MIN_VERSION_base(x,y,z)=1" ../Network/URI.hs uri001.hs
Packit 0e2aa3
--  5. ./uri001
Packit 0e2aa3
--
Packit 0e2aa3
--  Previous build instructions:
Packit 0e2aa3
--  Using GHC, I compile with this command line:
Packit 0e2aa3
--  ghc --make -fglasgow-exts
Packit 0e2aa3
--      -i..\;C:\Dev\Haskell\Lib\HUnit;C:\Dev\Haskell\Lib\Parsec
Packit 0e2aa3
--      -o URITest.exe URITest -main-is URITest.main
Packit 0e2aa3
--  The -i line may need changing for alternative installations.
Packit 0e2aa3
--
Packit 0e2aa3
--------------------------------------------------------------------------------
Packit 0e2aa3
Packit 0e2aa3
module Main where
Packit 0e2aa3
Packit 0e2aa3
import Network.URI
Packit 0e2aa3
    ( URI(..), URIAuth(..)
Packit 0e2aa3
    , nullURI
Packit 0e2aa3
    , parseURI, parseURIReference, parseRelativeReference, parseAbsoluteURI
Packit 0e2aa3
    , parseAbsoluteURI
Packit 0e2aa3
    , isURI, isURIReference, isRelativeReference, isAbsoluteURI
Packit 0e2aa3
    , uriIsAbsolute, uriIsRelative
Packit 0e2aa3
    , relativeTo, nonStrictRelativeTo
Packit 0e2aa3
    , relativeFrom
Packit 0e2aa3
    , uriToString
Packit 0e2aa3
    , isUnescapedInURIComponent
Packit 0e2aa3
    , isUnescapedInURI, escapeURIString, unEscapeString
Packit 0e2aa3
    , normalizeCase, normalizeEscape, normalizePathSegments
Packit 0e2aa3
    , pathSegments
Packit 0e2aa3
    )
Packit 0e2aa3
Packit 0e2aa3
import Test.HUnit
Packit 0e2aa3
Packit 0e2aa3
import Data.Maybe (fromJust)
Packit 0e2aa3
import Data.List (intercalate)
Packit 0e2aa3
import System.IO (openFile, IOMode(WriteMode), hClose)
Packit 0e2aa3
import qualified Test.Framework as TF
Packit 0e2aa3
import qualified Test.Framework.Providers.HUnit as TF
Packit 0e2aa3
import qualified Test.Framework.Providers.QuickCheck2 as TF
Packit 0e2aa3
Packit 0e2aa3
-- Test supplied string for valid URI reference syntax
Packit 0e2aa3
--   isValidURIRef :: String -> Bool
Packit 0e2aa3
-- Test supplied string for valid absolute URI reference syntax
Packit 0e2aa3
--   isAbsoluteURIRef :: String -> Bool
Packit 0e2aa3
-- Test supplied string for valid absolute URI syntax
Packit 0e2aa3
--   isAbsoluteURI :: String -> Bool
Packit 0e2aa3
Packit 0e2aa3
data URIType = AbsId    -- URI form (absolute, no fragment)
Packit 0e2aa3
             | AbsRf    -- Absolute URI reference
Packit 0e2aa3
             | RelRf    -- Relative URI reference
Packit 0e2aa3
             | InvRf    -- Invalid URI reference
Packit 0e2aa3
isValidT :: URIType -> Bool
Packit 0e2aa3
isValidT InvRf = False
Packit 0e2aa3
isValidT _     = True
Packit 0e2aa3
Packit 0e2aa3
isAbsRfT :: URIType -> Bool
Packit 0e2aa3
isAbsRfT AbsId = True
Packit 0e2aa3
isAbsRfT AbsRf = True
Packit 0e2aa3
isAbsRfT _     = False
Packit 0e2aa3
Packit 0e2aa3
isRelRfT :: URIType -> Bool
Packit 0e2aa3
isRelRfT RelRf = True
Packit 0e2aa3
isRelRfT _     = False
Packit 0e2aa3
Packit 0e2aa3
isAbsIdT :: URIType -> Bool
Packit 0e2aa3
isAbsIdT AbsId = True
Packit 0e2aa3
isAbsIdT _     = False
Packit 0e2aa3
Packit 0e2aa3
testEq :: (Eq a, Show a) => String -> a -> a -> Assertion
Packit 0e2aa3
testEq lab a1 a2 = assertEqual lab a1 a2
Packit 0e2aa3
Packit 0e2aa3
testURIRef :: URIType -> String -> Assertion
Packit 0e2aa3
testURIRef t u = sequence_
Packit 0e2aa3
  [ testEq ("test_isURIReference:"++u) (isValidT t) (isURIReference u)
Packit 0e2aa3
  , testEq ("test_isRelativeReference:"++u)  (isRelRfT t) (isRelativeReference  u)
Packit 0e2aa3
  , testEq ("test_isAbsoluteURI:"++u)  (isAbsIdT t) (isAbsoluteURI  u)
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
testURIRefComponents :: String -> (Maybe URI) -> String -> Assertion
Packit 0e2aa3
testURIRefComponents _lab uv us =
Packit 0e2aa3
    testEq ("testURIRefComponents:"++us) uv (parseURIReference us)
Packit 0e2aa3
Packit 0e2aa3
Packit 0e2aa3
testURIRef001 = testURIRef AbsRf "http://example.org/aaa/bbb#ccc"
Packit 0e2aa3
testURIRef002 = testURIRef AbsId "mailto:local@domain.org"
Packit 0e2aa3
testURIRef003 = testURIRef AbsRf "mailto:local@domain.org#frag"
Packit 0e2aa3
testURIRef004 = testURIRef AbsRf "HTTP://EXAMPLE.ORG/AAA/BBB#CCC"
Packit 0e2aa3
testURIRef005 = testURIRef RelRf "//example.org/aaa/bbb#ccc"
Packit 0e2aa3
testURIRef006 = testURIRef RelRf "/aaa/bbb#ccc"
Packit 0e2aa3
testURIRef007 = testURIRef RelRf "bbb#ccc"
Packit 0e2aa3
testURIRef008 = testURIRef RelRf "#ccc"
Packit 0e2aa3
testURIRef009 = testURIRef RelRf "#"
Packit 0e2aa3
testURIRef010 = testURIRef RelRf "/"
Packit 0e2aa3
-- escapes
Packit 0e2aa3
testURIRef011 = testURIRef AbsRf "http://example.org/aaa%2fbbb#ccc"
Packit 0e2aa3
testURIRef012 = testURIRef AbsRf "http://example.org/aaa%2Fbbb#ccc"
Packit 0e2aa3
testURIRef013 = testURIRef RelRf "%2F"
Packit 0e2aa3
testURIRef014 = testURIRef RelRf "aaa%2Fbbb"
Packit 0e2aa3
-- ports
Packit 0e2aa3
testURIRef015 = testURIRef AbsRf "http://example.org:80/aaa/bbb#ccc"
Packit 0e2aa3
testURIRef016 = testURIRef AbsRf "http://example.org:/aaa/bbb#ccc"
Packit 0e2aa3
testURIRef017 = testURIRef AbsRf "http://example.org./aaa/bbb#ccc"
Packit 0e2aa3
testURIRef018 = testURIRef AbsRf "http://example.123./aaa/bbb#ccc"
Packit 0e2aa3
-- bare authority
Packit 0e2aa3
testURIRef019 = testURIRef AbsId "http://example.org"
Packit 0e2aa3
-- IPv6 literals (from RFC2732):
Packit 0e2aa3
testURIRef021 = testURIRef AbsId "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html"
Packit 0e2aa3
testURIRef022 = testURIRef AbsId "http://[1080:0:0:0:8:800:200C:417A]/index.html"
Packit 0e2aa3
testURIRef023 = testURIRef AbsId "http://[3ffe:2a00:100:7031::1]"
Packit 0e2aa3
testURIRef024 = testURIRef AbsId "http://[1080::8:800:200C:417A]/foo"
Packit 0e2aa3
testURIRef025 = testURIRef AbsId "http://[::192.9.5.5]/ipng"
Packit 0e2aa3
testURIRef026 = testURIRef AbsId "http://[::FFFF:129.144.52.38]:80/index.html"
Packit 0e2aa3
testURIRef027 = testURIRef AbsId "http://[2010:836B:4179::836B:4179]"
Packit 0e2aa3
testURIRef028 = testURIRef RelRf "//[2010:836B:4179::836B:4179]"
Packit 0e2aa3
testURIRef029 = testURIRef InvRf "[2010:836B:4179::836B:4179]"
Packit 0e2aa3
-- RFC2396 test cases
Packit 0e2aa3
testURIRef031 = testURIRef RelRf "./aaa"
Packit 0e2aa3
testURIRef032 = testURIRef RelRf "../aaa"
Packit 0e2aa3
testURIRef033 = testURIRef AbsId "g:h"
Packit 0e2aa3
testURIRef034 = testURIRef RelRf "g"
Packit 0e2aa3
testURIRef035 = testURIRef RelRf "./g"
Packit 0e2aa3
testURIRef036 = testURIRef RelRf "g/"
Packit 0e2aa3
testURIRef037 = testURIRef RelRf "/g"
Packit 0e2aa3
testURIRef038 = testURIRef RelRf "//g"
Packit 0e2aa3
testURIRef039 = testURIRef RelRf "?y"
Packit 0e2aa3
testURIRef040 = testURIRef RelRf "g?y"
Packit 0e2aa3
testURIRef041 = testURIRef RelRf "#s"
Packit 0e2aa3
testURIRef042 = testURIRef RelRf "g#s"
Packit 0e2aa3
testURIRef043 = testURIRef RelRf "g?y#s"
Packit 0e2aa3
testURIRef044 = testURIRef RelRf ";x"
Packit 0e2aa3
testURIRef045 = testURIRef RelRf "g;x"
Packit 0e2aa3
testURIRef046 = testURIRef RelRf "g;x?y#s"
Packit 0e2aa3
testURIRef047 = testURIRef RelRf "."
Packit 0e2aa3
testURIRef048 = testURIRef RelRf "./"
Packit 0e2aa3
testURIRef049 = testURIRef RelRf ".."
Packit 0e2aa3
testURIRef050 = testURIRef RelRf "../"
Packit 0e2aa3
testURIRef051 = testURIRef RelRf "../g"
Packit 0e2aa3
testURIRef052 = testURIRef RelRf "../.."
Packit 0e2aa3
testURIRef053 = testURIRef RelRf "../../"
Packit 0e2aa3
testURIRef054 = testURIRef RelRf "../../g"
Packit 0e2aa3
testURIRef055 = testURIRef RelRf "../../../g"
Packit 0e2aa3
testURIRef056 = testURIRef RelRf "../../../../g"
Packit 0e2aa3
testURIRef057 = testURIRef RelRf "/./g"
Packit 0e2aa3
testURIRef058 = testURIRef RelRf "/../g"
Packit 0e2aa3
testURIRef059 = testURIRef RelRf "g."
Packit 0e2aa3
testURIRef060 = testURIRef RelRf ".g"
Packit 0e2aa3
testURIRef061 = testURIRef RelRf "g.."
Packit 0e2aa3
testURIRef062 = testURIRef RelRf "..g"
Packit 0e2aa3
testURIRef063 = testURIRef RelRf "./../g"
Packit 0e2aa3
testURIRef064 = testURIRef RelRf "./g/."
Packit 0e2aa3
testURIRef065 = testURIRef RelRf "g/./h"
Packit 0e2aa3
testURIRef066 = testURIRef RelRf "g/../h"
Packit 0e2aa3
testURIRef067 = testURIRef RelRf "g;x=1/./y"
Packit 0e2aa3
testURIRef068 = testURIRef RelRf "g;x=1/../y"
Packit 0e2aa3
testURIRef069 = testURIRef RelRf "g?y/./x"
Packit 0e2aa3
testURIRef070 = testURIRef RelRf "g?y/../x"
Packit 0e2aa3
testURIRef071 = testURIRef RelRf "g#s/./x"
Packit 0e2aa3
testURIRef072 = testURIRef RelRf "g#s/../x"
Packit 0e2aa3
testURIRef073 = testURIRef RelRf ""
Packit 0e2aa3
testURIRef074 = testURIRef RelRf "A'C"
Packit 0e2aa3
testURIRef075 = testURIRef RelRf "A$C"
Packit 0e2aa3
testURIRef076 = testURIRef RelRf "A@C"
Packit 0e2aa3
testURIRef077 = testURIRef RelRf "A,C"
Packit 0e2aa3
-- Invalid
Packit 0e2aa3
testURIRef080 = testURIRef InvRf "http://foo.org:80Path/More"
Packit 0e2aa3
testURIRef081 = testURIRef InvRf "::"
Packit 0e2aa3
testURIRef082 = testURIRef InvRf " "
Packit 0e2aa3
testURIRef083 = testURIRef InvRf "%"
Packit 0e2aa3
testURIRef084 = testURIRef InvRf "A%Z"
Packit 0e2aa3
testURIRef085 = testURIRef InvRf "%ZZ"
Packit 0e2aa3
testURIRef086 = testURIRef InvRf "%AZ"
Packit 0e2aa3
testURIRef087 = testURIRef InvRf "A C"
Packit 0e2aa3
-- testURIRef088 = -- (case removed)
Packit 0e2aa3
-- testURIRef089 = -- (case removed)
Packit 0e2aa3
testURIRef090 = testURIRef InvRf "A\"C"
Packit 0e2aa3
testURIRef091 = testURIRef InvRf "A`C"
Packit 0e2aa3
testURIRef092 = testURIRef InvRf "A
Packit 0e2aa3
testURIRef093 = testURIRef InvRf "A>C"
Packit 0e2aa3
testURIRef094 = testURIRef InvRf "A^C"
Packit 0e2aa3
testURIRef095 = testURIRef InvRf "A\\C"
Packit 0e2aa3
testURIRef096 = testURIRef InvRf "A{C"
Packit 0e2aa3
testURIRef097 = testURIRef InvRf "A|C"
Packit 0e2aa3
testURIRef098 = testURIRef InvRf "A}C"
Packit 0e2aa3
-- From RFC2396:
Packit 0e2aa3
-- rel_segment   = 1*( unreserved | escaped |
Packit 0e2aa3
--                     ";" | "@" | "&" | "=" | "+" | "$" | "," )
Packit 0e2aa3
-- unreserved    = alphanum | mark
Packit 0e2aa3
-- mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
Packit 0e2aa3
--                 "(" | ")"
Packit 0e2aa3
-- Note RFC 2732 allows '[', ']' ONLY for reserved purpose of IPv6 literals,
Packit 0e2aa3
-- or does it?
Packit 0e2aa3
testURIRef101 = testURIRef InvRf "A[C"
Packit 0e2aa3
testURIRef102 = testURIRef InvRf "A]C"
Packit 0e2aa3
testURIRef103 = testURIRef InvRf "A[**]C"
Packit 0e2aa3
testURIRef104 = testURIRef InvRf "http://[xyz]/"
Packit 0e2aa3
testURIRef105 = testURIRef InvRf "http://]/"
Packit 0e2aa3
testURIRef106 = testURIRef InvRf "http://example.org/[2010:836B:4179::836B:4179]"
Packit 0e2aa3
testURIRef107 = testURIRef InvRf "http://example.org/abc#[2010:836B:4179::836B:4179]"
Packit 0e2aa3
testURIRef108 = testURIRef InvRf "http://example.org/xxx/[qwerty]#a[b]"
Packit 0e2aa3
-- Random other things that crop up
Packit 0e2aa3
testURIRef111 = testURIRef AbsRf "http://example/Andrȷ"
Packit 0e2aa3
testURIRef112 = testURIRef AbsId "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"
Packit 0e2aa3
testURIRef113 = testURIRef AbsId "http://46229EFFE16A9BD60B9F1BE88B2DB047ADDED785/demo.mp3"
Packit 0e2aa3
testURIRef114 = testURIRef InvRf "http://example.org/xxx/qwerty#a#b"
Packit 0e2aa3
testURIRef115 = testURIRef InvRf "dcp.tcp.pft://192.168.0.1:1002:3002?fec=1&crc=0"
Packit 0e2aa3
testURIRef116 = testURIRef AbsId "dcp.tcp.pft://192.168.0.1:1002?fec=1&crc=0"
Packit 0e2aa3
testURIRef117 = testURIRef AbsId "foo://"
Packit 0e2aa3
-- URIs prefixed with IPv4 addresses
Packit 0e2aa3
testURIRef118 = testURIRef AbsId "http://192.168.0.1.example.com/"
Packit 0e2aa3
testURIRef119 = testURIRef AbsId "http://192.168.0.1.example.com./"
Packit 0e2aa3
-- URI prefixed with 3 octets of an IPv4 address and a subdomain part with a leading digit.
Packit 0e2aa3
testURIRef120 = testURIRef AbsId "http://192.168.0.1test.example.com/"
Packit 0e2aa3
-- URI with IPv(future) address
Packit 0e2aa3
testURIRef121 = testURIRef AbsId "http://[v9.123.abc;456.def]/"
Packit 0e2aa3
testURIRef122 = testEq "v.future authority"
Packit 0e2aa3
                       (Just (URIAuth "" "[v9.123.abc;456.def]" ":42"))
Packit 0e2aa3
                       ((maybe Nothing uriAuthority) . parseURI $ "http://[v9.123.abc;456.def]:42/")
Packit 0e2aa3
-- URI with non-ASCII characters, fail with Network.HTTP escaping code (see below)
Packit 0e2aa3
-- Currently not supported by Network.URI, but captured here for possible future reference
Packit 0e2aa3
-- when IRI support may be added.
Packit 0e2aa3
testURIRef123 = testURIRef AbsId "http://example.com/test123/䡥汬漬⁗潲汤/index.html"
Packit 0e2aa3
testURIRef124 = testURIRef AbsId "http://example.com/test124/Москва/index.html"
Packit 0e2aa3
Packit 0e2aa3
-- From report by Alexander Ivanov:
Packit 0e2aa3
-- should return " 䡥汬漬⁗潲汤", but returns "Hello, World" instead
Packit 0e2aa3
-- print $ urlDecode $ urlEncode " 䡥汬漬⁗潲汤"
Packit 0e2aa3
-- should return "Москва"
Packit 0e2aa3
-- print $ urlDecode $ urlEncode "Москва"
Packit 0e2aa3
Packit 0e2aa3
testURIRefSuite = TF.testGroup "Test URIrefs" testURIRefList
Packit 0e2aa3
testURIRefList =
Packit 0e2aa3
  [ TF.testCase "testURIRef001" testURIRef001
Packit 0e2aa3
  , TF.testCase "testURIRef002" testURIRef002
Packit 0e2aa3
  , TF.testCase "testURIRef003" testURIRef003
Packit 0e2aa3
  , TF.testCase "testURIRef004" testURIRef004
Packit 0e2aa3
  , TF.testCase "testURIRef005" testURIRef005
Packit 0e2aa3
  , TF.testCase "testURIRef006" testURIRef006
Packit 0e2aa3
  , TF.testCase "testURIRef007" testURIRef007
Packit 0e2aa3
  , TF.testCase "testURIRef008" testURIRef008
Packit 0e2aa3
  , TF.testCase "testURIRef009" testURIRef009
Packit 0e2aa3
  , TF.testCase "testURIRef010" testURIRef010
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef011" testURIRef011
Packit 0e2aa3
  , TF.testCase "testURIRef012" testURIRef012
Packit 0e2aa3
  , TF.testCase "testURIRef013" testURIRef013
Packit 0e2aa3
  , TF.testCase "testURIRef014" testURIRef014
Packit 0e2aa3
  , TF.testCase "testURIRef015" testURIRef015
Packit 0e2aa3
  , TF.testCase "testURIRef016" testURIRef016
Packit 0e2aa3
  , TF.testCase "testURIRef017" testURIRef017
Packit 0e2aa3
  , TF.testCase "testURIRef018" testURIRef018
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef019" testURIRef019
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef021" testURIRef021
Packit 0e2aa3
  , TF.testCase "testURIRef022" testURIRef022
Packit 0e2aa3
  , TF.testCase "testURIRef023" testURIRef023
Packit 0e2aa3
  , TF.testCase "testURIRef024" testURIRef024
Packit 0e2aa3
  , TF.testCase "testURIRef025" testURIRef025
Packit 0e2aa3
  , TF.testCase "testURIRef026" testURIRef026
Packit 0e2aa3
  , TF.testCase "testURIRef027" testURIRef027
Packit 0e2aa3
  , TF.testCase "testURIRef028" testURIRef028
Packit 0e2aa3
  , TF.testCase "testURIRef029" testURIRef029
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef031" testURIRef031
Packit 0e2aa3
  , TF.testCase "testURIRef032" testURIRef032
Packit 0e2aa3
  , TF.testCase "testURIRef033" testURIRef033
Packit 0e2aa3
  , TF.testCase "testURIRef034" testURIRef034
Packit 0e2aa3
  , TF.testCase "testURIRef035" testURIRef035
Packit 0e2aa3
  , TF.testCase "testURIRef036" testURIRef036
Packit 0e2aa3
  , TF.testCase "testURIRef037" testURIRef037
Packit 0e2aa3
  , TF.testCase "testURIRef038" testURIRef038
Packit 0e2aa3
  , TF.testCase "testURIRef039" testURIRef039
Packit 0e2aa3
  , TF.testCase "testURIRef040" testURIRef040
Packit 0e2aa3
  , TF.testCase "testURIRef041" testURIRef041
Packit 0e2aa3
  , TF.testCase "testURIRef042" testURIRef042
Packit 0e2aa3
  , TF.testCase "testURIRef043" testURIRef043
Packit 0e2aa3
  , TF.testCase "testURIRef044" testURIRef044
Packit 0e2aa3
  , TF.testCase "testURIRef045" testURIRef045
Packit 0e2aa3
  , TF.testCase "testURIRef046" testURIRef046
Packit 0e2aa3
  , TF.testCase "testURIRef047" testURIRef047
Packit 0e2aa3
  , TF.testCase "testURIRef048" testURIRef048
Packit 0e2aa3
  , TF.testCase "testURIRef049" testURIRef049
Packit 0e2aa3
  , TF.testCase "testURIRef050" testURIRef050
Packit 0e2aa3
  , TF.testCase "testURIRef051" testURIRef051
Packit 0e2aa3
  , TF.testCase "testURIRef052" testURIRef052
Packit 0e2aa3
  , TF.testCase "testURIRef053" testURIRef053
Packit 0e2aa3
  , TF.testCase "testURIRef054" testURIRef054
Packit 0e2aa3
  , TF.testCase "testURIRef055" testURIRef055
Packit 0e2aa3
  , TF.testCase "testURIRef056" testURIRef056
Packit 0e2aa3
  , TF.testCase "testURIRef057" testURIRef057
Packit 0e2aa3
  , TF.testCase "testURIRef058" testURIRef058
Packit 0e2aa3
  , TF.testCase "testURIRef059" testURIRef059
Packit 0e2aa3
  , TF.testCase "testURIRef060" testURIRef060
Packit 0e2aa3
  , TF.testCase "testURIRef061" testURIRef061
Packit 0e2aa3
  , TF.testCase "testURIRef062" testURIRef062
Packit 0e2aa3
  , TF.testCase "testURIRef063" testURIRef063
Packit 0e2aa3
  , TF.testCase "testURIRef064" testURIRef064
Packit 0e2aa3
  , TF.testCase "testURIRef065" testURIRef065
Packit 0e2aa3
  , TF.testCase "testURIRef066" testURIRef066
Packit 0e2aa3
  , TF.testCase "testURIRef067" testURIRef067
Packit 0e2aa3
  , TF.testCase "testURIRef068" testURIRef068
Packit 0e2aa3
  , TF.testCase "testURIRef069" testURIRef069
Packit 0e2aa3
  , TF.testCase "testURIRef070" testURIRef070
Packit 0e2aa3
  , TF.testCase "testURIRef071" testURIRef071
Packit 0e2aa3
  , TF.testCase "testURIRef072" testURIRef072
Packit 0e2aa3
  , TF.testCase "testURIRef073" testURIRef073
Packit 0e2aa3
  , TF.testCase "testURIRef074" testURIRef074
Packit 0e2aa3
  , TF.testCase "testURIRef075" testURIRef075
Packit 0e2aa3
  , TF.testCase "testURIRef076" testURIRef076
Packit 0e2aa3
  , TF.testCase "testURIRef077" testURIRef077
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef080" testURIRef080
Packit 0e2aa3
  , TF.testCase "testURIRef081" testURIRef081
Packit 0e2aa3
  , TF.testCase "testURIRef082" testURIRef082
Packit 0e2aa3
  , TF.testCase "testURIRef083" testURIRef083
Packit 0e2aa3
  , TF.testCase "testURIRef084" testURIRef084
Packit 0e2aa3
  , TF.testCase "testURIRef085" testURIRef085
Packit 0e2aa3
  , TF.testCase "testURIRef086" testURIRef086
Packit 0e2aa3
  , TF.testCase "testURIRef087" testURIRef087
Packit 0e2aa3
    -- testURIRef088,
Packit 0e2aa3
    -- testURIRef089,
Packit 0e2aa3
  , TF.testCase "testURIRef090" testURIRef090
Packit 0e2aa3
  , TF.testCase "testURIRef091" testURIRef091
Packit 0e2aa3
  , TF.testCase "testURIRef092" testURIRef092
Packit 0e2aa3
  , TF.testCase "testURIRef093" testURIRef093
Packit 0e2aa3
  , TF.testCase "testURIRef094" testURIRef094
Packit 0e2aa3
  , TF.testCase "testURIRef095" testURIRef095
Packit 0e2aa3
  , TF.testCase "testURIRef096" testURIRef096
Packit 0e2aa3
  , TF.testCase "testURIRef097" testURIRef097
Packit 0e2aa3
  , TF.testCase "testURIRef098" testURIRef098
Packit 0e2aa3
    -- testURIRef099,
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef101" testURIRef101
Packit 0e2aa3
  , TF.testCase "testURIRef102" testURIRef102
Packit 0e2aa3
  , TF.testCase "testURIRef103" testURIRef103
Packit 0e2aa3
  , TF.testCase "testURIRef104" testURIRef104
Packit 0e2aa3
  , TF.testCase "testURIRef105" testURIRef105
Packit 0e2aa3
  , TF.testCase "testURIRef106" testURIRef106
Packit 0e2aa3
  , TF.testCase "testURIRef107" testURIRef107
Packit 0e2aa3
  , TF.testCase "testURIRef108" testURIRef108
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef111" testURIRef111
Packit 0e2aa3
  , TF.testCase "testURIRef112" testURIRef112
Packit 0e2aa3
  , TF.testCase "testURIRef113" testURIRef113
Packit 0e2aa3
  , TF.testCase "testURIRef114" testURIRef114
Packit 0e2aa3
  , TF.testCase "testURIRef115" testURIRef115
Packit 0e2aa3
  , TF.testCase "testURIRef116" testURIRef116
Packit 0e2aa3
  , TF.testCase "testURIRef117" testURIRef117
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef118" testURIRef118
Packit 0e2aa3
  , TF.testCase "testURIRef119" testURIRef119
Packit 0e2aa3
  , TF.testCase "testURIRef120" testURIRef120
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testURIRef121" testURIRef121
Packit 0e2aa3
  , TF.testCase "testURIRef122" testURIRef122
Packit 0e2aa3
    -- IRI test cases not currently supported
Packit 0e2aa3
  -- , TF.testCase "testURIRef123" testURIRef123
Packit 0e2aa3
  -- , TF.testCase "testURIRef124" testURIRef124
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- test decomposition of URI into components
Packit 0e2aa3
testComponent01 = testURIRefComponents "testComponent01"
Packit 0e2aa3
        ( Just $ URI
Packit 0e2aa3
            { uriScheme    = "http:"
Packit 0e2aa3
            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
Packit 0e2aa3
            , uriPath      = "/aaa/bbb"
Packit 0e2aa3
            , uriQuery     = "?qqq"
Packit 0e2aa3
            , uriFragment  = "#fff"
Packit 0e2aa3
            } )
Packit 0e2aa3
        "http://user:pass@example.org:99/aaa/bbb?qqq#fff"
Packit 0e2aa3
testComponent02 = testURIRefComponents "testComponent02"
Packit 0e2aa3
        ( const Nothing
Packit 0e2aa3
        ( Just $ URI
Packit 0e2aa3
            { uriScheme    = "http:"
Packit 0e2aa3
            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
Packit 0e2aa3
            , uriPath      = "aaa/bbb"
Packit 0e2aa3
            , uriQuery     = ""
Packit 0e2aa3
            , uriFragment  = ""
Packit 0e2aa3
            } )
Packit 0e2aa3
        )
Packit 0e2aa3
        "http://user:pass@example.org:99aaa/bbb"
Packit 0e2aa3
testComponent03 = testURIRefComponents "testComponent03"
Packit 0e2aa3
        ( Just $ URI
Packit 0e2aa3
            { uriScheme    = "http:"
Packit 0e2aa3
            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
Packit 0e2aa3
            , uriPath      = ""
Packit 0e2aa3
            , uriQuery     = "?aaa/bbb"
Packit 0e2aa3
            , uriFragment  = ""
Packit 0e2aa3
            } )
Packit 0e2aa3
        "http://user:pass@example.org:99?aaa/bbb"
Packit 0e2aa3
testComponent04 = testURIRefComponents "testComponent03"
Packit 0e2aa3
        ( Just $ URI
Packit 0e2aa3
            { uriScheme    = "http:"
Packit 0e2aa3
            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
Packit 0e2aa3
            , uriPath      = ""
Packit 0e2aa3
            , uriQuery     = ""
Packit 0e2aa3
            , uriFragment  = "#aaa/bbb"
Packit 0e2aa3
            } )
Packit 0e2aa3
        "http://user:pass@example.org:99#aaa/bbb"
Packit 0e2aa3
-- These test cases contributed by Robert Buck (mathworks.com)
Packit 0e2aa3
testComponent11 = testURIRefComponents "testComponent03"
Packit 0e2aa3
        ( Just $ URI
Packit 0e2aa3
            { uriScheme    = "about:"
Packit 0e2aa3
            , uriAuthority = Nothing
Packit 0e2aa3
            , uriPath      = ""
Packit 0e2aa3
            , uriQuery     = ""
Packit 0e2aa3
            , uriFragment  = ""
Packit 0e2aa3
            } )
Packit 0e2aa3
        "about:"
Packit 0e2aa3
testComponent12 = testURIRefComponents "testComponent03"
Packit 0e2aa3
        ( Just $ URI
Packit 0e2aa3
            { uriScheme    = "file:"
Packit 0e2aa3
            , uriAuthority = Just (URIAuth "" "windowsauth" "")
Packit 0e2aa3
            , uriPath      = "/d$"
Packit 0e2aa3
            , uriQuery     = ""
Packit 0e2aa3
            , uriFragment  = ""
Packit 0e2aa3
            } )
Packit 0e2aa3
        "file://windowsauth/d$"
Packit 0e2aa3
Packit 0e2aa3
testComponentSuite = TF.testGroup "Test URIrefs" $
Packit 0e2aa3
  [ TF.testCase "testComponent01" testComponent01
Packit 0e2aa3
  , TF.testCase "testComponent02" testComponent02
Packit 0e2aa3
  , TF.testCase "testComponent03" testComponent03
Packit 0e2aa3
  , TF.testCase "testComponent04" testComponent04
Packit 0e2aa3
  , TF.testCase "testComponent11" testComponent11
Packit 0e2aa3
  , TF.testCase "testComponent12" testComponent12
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- Get reference relative to given base
Packit 0e2aa3
--   relativeRef :: String -> String -> String
Packit 0e2aa3
--
Packit 0e2aa3
-- Get absolute URI given base and relative reference
Packit 0e2aa3
--   absoluteURI :: String -> String -> String
Packit 0e2aa3
--
Packit 0e2aa3
-- Test cases taken from: http://www.w3.org/2000/10/swap/uripath.py
Packit 0e2aa3
-- (Thanks, Dan Connolly)
Packit 0e2aa3
--
Packit 0e2aa3
-- NOTE:  absoluteURI base (relativeRef base u) is always equivalent to u.
Packit 0e2aa3
-- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html
Packit 0e2aa3
Packit 0e2aa3
testRelSplit :: String -> String -> String -> String -> Assertion
Packit 0e2aa3
testRelSplit label base uabs urel =
Packit 0e2aa3
    testEq label urel (mkrel puabs pubas)
Packit 0e2aa3
    where
Packit 0e2aa3
        mkrel (Just u1) (Just u2) = show (u1 `relativeFrom` u2)
Packit 0e2aa3
        mkrel Nothing   _         = "Invalid URI: "++urel
Packit 0e2aa3
        mkrel _         Nothing   = "Invalid URI: "++uabs
Packit 0e2aa3
        puabs = parseURIReference uabs
Packit 0e2aa3
        pubas = parseURIReference base
Packit 0e2aa3
Packit 0e2aa3
testRelJoin  :: String -> String -> String -> String -> Assertion
Packit 0e2aa3
testRelJoin label base urel uabs =
Packit 0e2aa3
    testEq label uabs (mkabs purel pubas)
Packit 0e2aa3
    where
Packit 0e2aa3
        mkabs (Just u1) (Just u2) = show (u1 `relativeTo` u2)
Packit 0e2aa3
        mkabs Nothing   _         = "Invalid URI: "++urel
Packit 0e2aa3
        mkabs _         Nothing   = "Invalid URI: "++uabs
Packit 0e2aa3
        purel = parseURIReference urel
Packit 0e2aa3
        pubas = parseURIReference base
Packit 0e2aa3
Packit 0e2aa3
testRelative :: String -> String -> String -> String -> Assertion
Packit 0e2aa3
testRelative label base uabs urel = sequence_
Packit 0e2aa3
    [
Packit 0e2aa3
    (testRelSplit (label++"(rel)") base uabs urel),
Packit 0e2aa3
    (testRelJoin  (label++"(abs)") base urel uabs)
Packit 0e2aa3
    ]
Packit 0e2aa3
Packit 0e2aa3
testRelative01 = testRelative "testRelative01"
Packit 0e2aa3
                    "foo:xyz" "bar:abc" "bar:abc"
Packit 0e2aa3
testRelative02 = testRelative "testRelative02"
Packit 0e2aa3
                    "http://example/x/y/z" "http://example/x/abc" "../abc"
Packit 0e2aa3
testRelative03 = testRelative "testRelative03"
Packit 0e2aa3
                    "http://example2/x/y/z" "http://example/x/abc" "//example/x/abc"
Packit 0e2aa3
                    -- "http://example2/x/y/z" "http://example/x/abc" "http://example/x/abc"
Packit 0e2aa3
testRelative04 = testRelative "testRelative04"
Packit 0e2aa3
                    "http://ex/x/y/z" "http://ex/x/r" "../r"
Packit 0e2aa3
testRelative05 = testRelative "testRelative05"
Packit 0e2aa3
                    "http://ex/x/y/z" "http://ex/r" "/r"
Packit 0e2aa3
                    -- "http://ex/x/y/z" "http://ex/r" "../../r"
Packit 0e2aa3
testRelative06 = testRelative "testRelative06"
Packit 0e2aa3
                    "http://ex/x/y/z" "http://ex/x/y/q/r" "q/r"
Packit 0e2aa3
testRelative07 = testRelative "testRelative07"
Packit 0e2aa3
                    "http://ex/x/y" "http://ex/x/q/r#s" "q/r#s"
Packit 0e2aa3
testRelative08 = testRelative "testRelative08"
Packit 0e2aa3
                    "http://ex/x/y" "http://ex/x/q/r#s/t" "q/r#s/t"
Packit 0e2aa3
testRelative09 = testRelative "testRelative09"
Packit 0e2aa3
                    "http://ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"
Packit 0e2aa3
testRelative10 = testRelative "testRelative10"
Packit 0e2aa3
                    -- "http://ex/x/y" "http://ex/x/y" "y"
Packit 0e2aa3
                    "http://ex/x/y" "http://ex/x/y" ""
Packit 0e2aa3
testRelative11 = testRelative "testRelative11"
Packit 0e2aa3
                    -- "http://ex/x/y/" "http://ex/x/y/" "./"
Packit 0e2aa3
                    "http://ex/x/y/" "http://ex/x/y/" ""
Packit 0e2aa3
testRelative12 = testRelative "testRelative12"
Packit 0e2aa3
                    -- "http://ex/x/y/pdq" "http://ex/x/y/pdq" "pdq"
Packit 0e2aa3
                    "http://ex/x/y/pdq" "http://ex/x/y/pdq" ""
Packit 0e2aa3
testRelative13 = testRelative "testRelative13"
Packit 0e2aa3
                    "http://ex/x/y/" "http://ex/x/y/z/" "z/"
Packit 0e2aa3
testRelative14 = testRelative "testRelative14"
Packit 0e2aa3
                    -- "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "animal.rdf#Animal"
Packit 0e2aa3
                    "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "#Animal"
Packit 0e2aa3
testRelative15 = testRelative "testRelative15"
Packit 0e2aa3
                    "file:/e/x/y/z" "file:/e/x/abc" "../abc"
Packit 0e2aa3
testRelative16 = testRelative "testRelative16"
Packit 0e2aa3
                    "file:/example2/x/y/z" "file:/example/x/abc" "/example/x/abc"
Packit 0e2aa3
testRelative17 = testRelative "testRelative17"
Packit 0e2aa3
                    "file:/ex/x/y/z" "file:/ex/x/r" "../r"
Packit 0e2aa3
testRelative18 = testRelative "testRelative18"
Packit 0e2aa3
                    "file:/ex/x/y/z" "file:/r" "/r"
Packit 0e2aa3
testRelative19 = testRelative "testRelative19"
Packit 0e2aa3
                    "file:/ex/x/y" "file:/ex/x/q/r" "q/r"
Packit 0e2aa3
testRelative20 = testRelative "testRelative20"
Packit 0e2aa3
                    "file:/ex/x/y" "file:/ex/x/q/r#s" "q/r#s"
Packit 0e2aa3
testRelative21 = testRelative "testRelative21"
Packit 0e2aa3
                    "file:/ex/x/y" "file:/ex/x/q/r#" "q/r#"
Packit 0e2aa3
testRelative22 = testRelative "testRelative22"
Packit 0e2aa3
                    "file:/ex/x/y" "file:/ex/x/q/r#s/t" "q/r#s/t"
Packit 0e2aa3
testRelative23 = testRelative "testRelative23"
Packit 0e2aa3
                    "file:/ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"
Packit 0e2aa3
testRelative24 = testRelative "testRelative24"
Packit 0e2aa3
                    -- "file:/ex/x/y" "file:/ex/x/y" "y"
Packit 0e2aa3
                    "file:/ex/x/y" "file:/ex/x/y" ""
Packit 0e2aa3
testRelative25 = testRelative "testRelative25"
Packit 0e2aa3
                    -- "file:/ex/x/y/" "file:/ex/x/y/" "./"
Packit 0e2aa3
                    "file:/ex/x/y/" "file:/ex/x/y/" ""
Packit 0e2aa3
testRelative26 = testRelative "testRelative26"
Packit 0e2aa3
                    -- "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" "pdq"
Packit 0e2aa3
                    "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" ""
Packit 0e2aa3
testRelative27 = testRelative "testRelative27"
Packit 0e2aa3
                    "file:/ex/x/y/" "file:/ex/x/y/z/" "z/"
Packit 0e2aa3
testRelative28 = testRelative "testRelative28"
Packit 0e2aa3
                    "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"
Packit 0e2aa3
                    "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"
Packit 0e2aa3
                    -- "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"
Packit 0e2aa3
                    -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"
Packit 0e2aa3
testRelative29 = testRelative "testRelative29"
Packit 0e2aa3
                    "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"
Packit 0e2aa3
                    "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"
Packit 0e2aa3
                    -- "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"
Packit 0e2aa3
                    -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"
Packit 0e2aa3
testRelative30 = testRelative "testRelative30"
Packit 0e2aa3
                    "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"
Packit 0e2aa3
testRelative31 = testRelative "testRelative31"
Packit 0e2aa3
                    "file:/some/dir/foo" "file:/some/dir/#" "./#"
Packit 0e2aa3
testRelative32 = testRelative "testRelative32"
Packit 0e2aa3
                    "http://ex/x/y" "http://ex/x/q:r" "./q:r"
Packit 0e2aa3
                    -- see RFC2396bis, section 5       ^^
Packit 0e2aa3
testRelative33 = testRelative "testRelative33"
Packit 0e2aa3
                    "http://ex/x/y" "http://ex/x/p=q:r" "./p=q:r"
Packit 0e2aa3
                    -- "http://ex/x/y" "http://ex/x/p=q:r" "p=q:r"
Packit 0e2aa3
testRelative34 = testRelative "testRelative34"
Packit 0e2aa3
                    "http://ex/x/y?pp/qq" "http://ex/x/y?pp/rr" "?pp/rr"
Packit 0e2aa3
testRelative35 = testRelative "testRelative35"
Packit 0e2aa3
                    "http://ex/x/y?pp/qq" "http://ex/x/y/z" "y/z"
Packit 0e2aa3
testRelative36 = testRelative "testRelative36"
Packit 0e2aa3
                    "mailto:local"
Packit 0e2aa3
                    "mailto:local/qual@domain.org#frag"
Packit 0e2aa3
                    "local/qual@domain.org#frag"
Packit 0e2aa3
testRelative37 = testRelative "testRelative37"
Packit 0e2aa3
                    "mailto:local/qual1@domain1.org"
Packit 0e2aa3
                    "mailto:local/more/qual2@domain2.org#frag"
Packit 0e2aa3
                    "more/qual2@domain2.org#frag"
Packit 0e2aa3
testRelative38 = testRelative "testRelative38"
Packit 0e2aa3
                    "http://ex/x/z?q" "http://ex/x/y?q" "y?q"
Packit 0e2aa3
testRelative39 = testRelative "testRelative39"
Packit 0e2aa3
                    "http://ex?p" "http://ex/x/y?q" "/x/y?q"
Packit 0e2aa3
testRelative40 = testRelative "testRelative40"
Packit 0e2aa3
                    "foo:a/b" "foo:a/c/d" "c/d"
Packit 0e2aa3
testRelative41 = testRelative "testRelative41"
Packit 0e2aa3
                    "foo:a/b" "foo:/c/d" "/c/d"
Packit 0e2aa3
testRelative42 = testRelative "testRelative42"
Packit 0e2aa3
                    "foo:a/b?c#d" "foo:a/b?c" ""
Packit 0e2aa3
testRelative43 = testRelative "testRelative42"
Packit 0e2aa3
                    "foo:a" "foo:b/c" "b/c"
Packit 0e2aa3
testRelative44 = testRelative "testRelative44"
Packit 0e2aa3
                    "foo:/a/y/z" "foo:/a/b/c" "../b/c"
Packit 0e2aa3
testRelative45 = testRelJoin "testRelative45"
Packit 0e2aa3
                    "foo:a" "./b/c" "foo:b/c"
Packit 0e2aa3
testRelative46 = testRelJoin "testRelative46"
Packit 0e2aa3
                    "foo:a" "/./b/c" "foo:/b/c"
Packit 0e2aa3
testRelative47 = testRelJoin "testRelative47"
Packit 0e2aa3
                    "foo://a//b/c" "../../d" "foo://a/d"
Packit 0e2aa3
testRelative48 = testRelJoin "testRelative48"
Packit 0e2aa3
                    "foo:a" "." "foo:"
Packit 0e2aa3
testRelative49 = testRelJoin "testRelative49"
Packit 0e2aa3
                    "foo:a" ".." "foo:"
Packit 0e2aa3
Packit 0e2aa3
-- add escape tests
Packit 0e2aa3
testRelative50 = testRelative "testRelative50"
Packit 0e2aa3
                    "http://example/x/y%2Fz" "http://example/x/abc" "abc"
Packit 0e2aa3
testRelative51 = testRelative "testRelative51"
Packit 0e2aa3
                    "http://example/a/x/y/z" "http://example/a/x%2Fabc" "../../x%2Fabc"
Packit 0e2aa3
testRelative52 = testRelative "testRelative52"
Packit 0e2aa3
                    "http://example/a/x/y%2Fz" "http://example/a/x%2Fabc" "../x%2Fabc"
Packit 0e2aa3
testRelative53 = testRelative "testRelative53"
Packit 0e2aa3
                    "http://example/x%2Fy/z" "http://example/x%2Fy/abc" "abc"
Packit 0e2aa3
testRelative54 = testRelative "testRelative54"
Packit 0e2aa3
                    "http://ex/x/y" "http://ex/x/q%3Ar" "q%3Ar"
Packit 0e2aa3
testRelative55 = testRelative "testRelative55"
Packit 0e2aa3
                    "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"
Packit 0e2aa3
-- Apparently, TimBL prefers the following way to 41, 42 above
Packit 0e2aa3
-- cf. http://lists.w3.org/Archives/Public/uri/2003Feb/0028.html
Packit 0e2aa3
-- He also notes that there may be different relative fuctions
Packit 0e2aa3
-- that satisfy the basic equivalence axiom:
Packit 0e2aa3
-- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html
Packit 0e2aa3
testRelative56 = testRelative "testRelative56"
Packit 0e2aa3
                    "http://example/x/y/z" "http://example/x%2Fabc" "/x%2Fabc"
Packit 0e2aa3
testRelative57 = testRelative "testRelative57"
Packit 0e2aa3
                    "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"
Packit 0e2aa3
Packit 0e2aa3
-- Other oddball tests
Packit 0e2aa3
    -- Check segment normalization code:
Packit 0e2aa3
testRelative60 = testRelJoin "testRelative60"
Packit 0e2aa3
                    "ftp://example/x/y" "http://example/a/b/../../c" "http://example/c"
Packit 0e2aa3
testRelative61 = testRelJoin "testRelative61"
Packit 0e2aa3
                    "ftp://example/x/y" "http://example/a/b/c/../../" "http://example/a/"
Packit 0e2aa3
testRelative62 = testRelJoin "testRelative62"
Packit 0e2aa3
                    "ftp://example/x/y" "http://example/a/b/c/./" "http://example/a/b/c/"
Packit 0e2aa3
testRelative63 = testRelJoin "testRelative63"
Packit 0e2aa3
                    "ftp://example/x/y" "http://example/a/b/c/.././" "http://example/a/b/"
Packit 0e2aa3
testRelative64 = testRelJoin "testRelative64"
Packit 0e2aa3
                    "ftp://example/x/y" "http://example/a/b/c/d/../../../../e" "http://example/e"
Packit 0e2aa3
testRelative65 = testRelJoin "testRelative65"
Packit 0e2aa3
                    "ftp://example/x/y" "http://example/a/b/c/d/../.././../../e" "http://example/e"
Packit 0e2aa3
    -- Check handling of queries and fragments with non-relative paths
Packit 0e2aa3
testRelative70 = testRelative "testRelative70"
Packit 0e2aa3
                    "mailto:local1@domain1?query1" "mailto:local2@domain2"
Packit 0e2aa3
                    "local2@domain2"
Packit 0e2aa3
testRelative71 = testRelative "testRelative71"
Packit 0e2aa3
                    "mailto:local1@domain1" "mailto:local2@domain2?query2"
Packit 0e2aa3
                    "local2@domain2?query2"
Packit 0e2aa3
testRelative72 = testRelative "testRelative72"
Packit 0e2aa3
                    "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"
Packit 0e2aa3
                    "local2@domain2?query2"
Packit 0e2aa3
testRelative73 = testRelative "testRelative73"
Packit 0e2aa3
                    "mailto:local@domain?query1" "mailto:local@domain?query2"
Packit 0e2aa3
                    "?query2"
Packit 0e2aa3
testRelative74 = testRelative "testRelative74"
Packit 0e2aa3
                    "mailto:?query1" "mailto:local@domain?query2"
Packit 0e2aa3
                    "local@domain?query2"
Packit 0e2aa3
testRelative75 = testRelative "testRelative75"
Packit 0e2aa3
                    "mailto:local@domain?query1" "mailto:local@domain?query2"
Packit 0e2aa3
                    "?query2"
Packit 0e2aa3
testRelative76 = testRelative "testRelative76"
Packit 0e2aa3
                    "foo:bar" "http://example/a/b?c/../d"  "http://example/a/b?c/../d"
Packit 0e2aa3
testRelative77 = testRelative "testRelative77"
Packit 0e2aa3
                    "foo:bar" "http://example/a/b#c/../d"  "http://example/a/b#c/../d"
Packit 0e2aa3
{- These (78-81) are some awkward test cases thrown up by a question on the URI list:
Packit 0e2aa3
     http://lists.w3.org/Archives/Public/uri/2005Jul/0013
Packit 0e2aa3
   Mote that RFC 3986 discards path segents after the final '/' only when merging two
Packit 0e2aa3
   paths - otherwise the final segment in the base URI is mnaintained.  This leads to
Packit 0e2aa3
   difficulty in constructinmg a reversible relativeTo/relativeFrom pair of functions.
Packit 0e2aa3
-}
Packit 0e2aa3
testRelative78 = testRelative "testRelative78"
Packit 0e2aa3
                    "http://www.example.com/data/limit/.." "http://www.example.com/data/limit/test.xml"
Packit 0e2aa3
                    "test.xml"
Packit 0e2aa3
testRelative79 = testRelative "testRelative79"
Packit 0e2aa3
                    "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"
Packit 0e2aa3
testRelative80 = testRelative "testRelative80"
Packit 0e2aa3
                    "file:/some/dir/foo" "file:/some/dir/#" "./#"
Packit 0e2aa3
testRelative81 = testRelative "testRelative81"
Packit 0e2aa3
                    "file:/some/dir/.." "file:/some/dir/#blort" "./#blort"
Packit 0e2aa3
Packit 0e2aa3
-- testRelative  base abs rel
Packit 0e2aa3
-- testRelSplit  base abs rel
Packit 0e2aa3
-- testRelJoin   base rel abs
Packit 0e2aa3
testRelative91 = testRelSplit "testRelative91"
Packit 0e2aa3
                    "http://example.org/base/uri" "http:this"
Packit 0e2aa3
                    "this"
Packit 0e2aa3
testRelative92 = testRelJoin "testRelative92"
Packit 0e2aa3
                    "http://example.org/base/uri" "http:this"
Packit 0e2aa3
                    "http:this"
Packit 0e2aa3
testRelative93 = testRelJoin "testRelative93"
Packit 0e2aa3
                    "http:base" "http:this"
Packit 0e2aa3
                    "http:this"
Packit 0e2aa3
testRelative94 = testRelJoin "testRelative94"
Packit 0e2aa3
                    "f:/a" ".//g"
Packit 0e2aa3
                    "f://g"
Packit 0e2aa3
testRelative95 = testRelJoin "testRelative95"
Packit 0e2aa3
                    "f://example.org/base/a" "b/c//d/e"
Packit 0e2aa3
                    "f://example.org/base/b/c//d/e"
Packit 0e2aa3
testRelative96 = testRelJoin "testRelative96"
Packit 0e2aa3
                    "mid:m@example.ord/c@example.org" "m2@example.ord/c2@example.org"
Packit 0e2aa3
                    "mid:m@example.ord/m2@example.ord/c2@example.org"
Packit 0e2aa3
testRelative97 = testRelJoin "testRelative97"
Packit 0e2aa3
                    "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/" "mini1.xml"
Packit 0e2aa3
                    "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/mini1.xml"
Packit 0e2aa3
testRelative98 = testRelative "testRelative98"
Packit 0e2aa3
                    "foo:a/y/z" "foo:a/b/c" "../b/c"
Packit 0e2aa3
testRelative99 = testRelJoin "testRelative99"
Packit 0e2aa3
                    "f:/a/" "..//g"
Packit 0e2aa3
                    "f://g"
Packit 0e2aa3
Packit 0e2aa3
Packit 0e2aa3
testRelativeSuite = TF.testGroup "Test Relative URIs" testRelativeList
Packit 0e2aa3
testRelativeList  =
Packit 0e2aa3
  [ TF.testCase "testRelative01" testRelative01
Packit 0e2aa3
  , TF.testCase "testRelative02" testRelative02
Packit 0e2aa3
  , TF.testCase "testRelative03" testRelative03
Packit 0e2aa3
  , TF.testCase "testRelative04" testRelative04
Packit 0e2aa3
  , TF.testCase "testRelative05" testRelative05
Packit 0e2aa3
  , TF.testCase "testRelative06" testRelative06
Packit 0e2aa3
  , TF.testCase "testRelative07" testRelative07
Packit 0e2aa3
  , TF.testCase "testRelative08" testRelative08
Packit 0e2aa3
  , TF.testCase "testRelative09" testRelative09
Packit 0e2aa3
  , TF.testCase "testRelative10" testRelative10
Packit 0e2aa3
  , TF.testCase "testRelative11" testRelative11
Packit 0e2aa3
  , TF.testCase "testRelative12" testRelative12
Packit 0e2aa3
  , TF.testCase "testRelative13" testRelative13
Packit 0e2aa3
  , TF.testCase "testRelative14" testRelative14
Packit 0e2aa3
  , TF.testCase "testRelative15" testRelative15
Packit 0e2aa3
  , TF.testCase "testRelative16" testRelative16
Packit 0e2aa3
  , TF.testCase "testRelative17" testRelative17
Packit 0e2aa3
  , TF.testCase "testRelative18" testRelative18
Packit 0e2aa3
  , TF.testCase "testRelative19" testRelative19
Packit 0e2aa3
  , TF.testCase "testRelative20" testRelative20
Packit 0e2aa3
  , TF.testCase "testRelative21" testRelative21
Packit 0e2aa3
  , TF.testCase "testRelative22" testRelative22
Packit 0e2aa3
  , TF.testCase "testRelative23" testRelative23
Packit 0e2aa3
  , TF.testCase "testRelative24" testRelative24
Packit 0e2aa3
  , TF.testCase "testRelative25" testRelative25
Packit 0e2aa3
  , TF.testCase "testRelative26" testRelative26
Packit 0e2aa3
  , TF.testCase "testRelative27" testRelative27
Packit 0e2aa3
  , TF.testCase "testRelative28" testRelative28
Packit 0e2aa3
  , TF.testCase "testRelative29" testRelative29
Packit 0e2aa3
  , TF.testCase "testRelative30" testRelative30
Packit 0e2aa3
  , TF.testCase "testRelative31" testRelative31
Packit 0e2aa3
  , TF.testCase "testRelative32" testRelative32
Packit 0e2aa3
  , TF.testCase "testRelative33" testRelative33
Packit 0e2aa3
  , TF.testCase "testRelative34" testRelative34
Packit 0e2aa3
  , TF.testCase "testRelative35" testRelative35
Packit 0e2aa3
  , TF.testCase "testRelative36" testRelative36
Packit 0e2aa3
  , TF.testCase "testRelative37" testRelative37
Packit 0e2aa3
  , TF.testCase "testRelative38" testRelative38
Packit 0e2aa3
  , TF.testCase "testRelative39" testRelative39
Packit 0e2aa3
  , TF.testCase "testRelative40" testRelative40
Packit 0e2aa3
  , TF.testCase "testRelative41" testRelative41
Packit 0e2aa3
  , TF.testCase "testRelative42" testRelative42
Packit 0e2aa3
  , TF.testCase "testRelative43" testRelative43
Packit 0e2aa3
  , TF.testCase "testRelative44" testRelative44
Packit 0e2aa3
  , TF.testCase "testRelative45" testRelative45
Packit 0e2aa3
  , TF.testCase "testRelative46" testRelative46
Packit 0e2aa3
  , TF.testCase "testRelative47" testRelative47
Packit 0e2aa3
  , TF.testCase "testRelative48" testRelative48
Packit 0e2aa3
  , TF.testCase "testRelative49" testRelative49
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testRelative50" testRelative50
Packit 0e2aa3
  , TF.testCase "testRelative51" testRelative51
Packit 0e2aa3
  , TF.testCase "testRelative52" testRelative52
Packit 0e2aa3
  , TF.testCase "testRelative53" testRelative53
Packit 0e2aa3
  , TF.testCase "testRelative54" testRelative54
Packit 0e2aa3
  , TF.testCase "testRelative55" testRelative55
Packit 0e2aa3
  , TF.testCase "testRelative56" testRelative56
Packit 0e2aa3
  , TF.testCase "testRelative57" testRelative57
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testRelative60" testRelative60
Packit 0e2aa3
  , TF.testCase "testRelative61" testRelative61
Packit 0e2aa3
  , TF.testCase "testRelative62" testRelative62
Packit 0e2aa3
  , TF.testCase "testRelative63" testRelative63
Packit 0e2aa3
  , TF.testCase "testRelative64" testRelative64
Packit 0e2aa3
  , TF.testCase "testRelative65" testRelative65
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testRelative70" testRelative70
Packit 0e2aa3
  , TF.testCase "testRelative71" testRelative71
Packit 0e2aa3
  , TF.testCase "testRelative72" testRelative72
Packit 0e2aa3
  , TF.testCase "testRelative73" testRelative73
Packit 0e2aa3
  , TF.testCase "testRelative74" testRelative74
Packit 0e2aa3
  , TF.testCase "testRelative75" testRelative75
Packit 0e2aa3
  , TF.testCase "testRelative76" testRelative76
Packit 0e2aa3
  , TF.testCase "testRelative77" testRelative77
Packit 0e2aa3
  -- Awkward cases:
Packit 0e2aa3
  , TF.testCase "testRelative78" testRelative78
Packit 0e2aa3
  , TF.testCase "testRelative79" testRelative79
Packit 0e2aa3
  , TF.testCase "testRelative80" testRelative80
Packit 0e2aa3
  , TF.testCase "testRelative81" testRelative81
Packit 0e2aa3
    --
Packit 0e2aa3
  -- , TF.testCase "testRelative90" testRelative90
Packit 0e2aa3
  , TF.testCase "testRelative91" testRelative91
Packit 0e2aa3
  , TF.testCase "testRelative92" testRelative92
Packit 0e2aa3
  , TF.testCase "testRelative93" testRelative93
Packit 0e2aa3
  , TF.testCase "testRelative94" testRelative94
Packit 0e2aa3
  , TF.testCase "testRelative95" testRelative95
Packit 0e2aa3
  , TF.testCase "testRelative96" testRelative96
Packit 0e2aa3
  , TF.testCase "testRelative97" testRelative97
Packit 0e2aa3
  , TF.testCase "testRelative98" testRelative98
Packit 0e2aa3
  , TF.testCase "testRelative99" testRelative99
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- RFC2396 relative-to-absolute URI tests
Packit 0e2aa3
Packit 0e2aa3
rfcbase  = "http://a/b/c/d;p?q"
Packit 0e2aa3
-- normal cases, RFC2396bis 5.4.1
Packit 0e2aa3
testRFC01 = testRelJoin "testRFC01" rfcbase "g:h" "g:h"
Packit 0e2aa3
testRFC02 = testRelJoin "testRFC02" rfcbase "g" "http://a/b/c/g"
Packit 0e2aa3
testRFC03 = testRelJoin "testRFC03" rfcbase "./g" "http://a/b/c/g"
Packit 0e2aa3
testRFC04 = testRelJoin "testRFC04" rfcbase "g/" "http://a/b/c/g/"
Packit 0e2aa3
testRFC05 = testRelJoin "testRFC05" rfcbase "/g" "http://a/g"
Packit 0e2aa3
testRFC06 = testRelJoin "testRFC06" rfcbase "//g" "http://g"
Packit 0e2aa3
testRFC07 = testRelJoin "testRFC07" rfcbase "?y" "http://a/b/c/d;p?y"
Packit 0e2aa3
testRFC08 = testRelJoin "testRFC08" rfcbase "g?y" "http://a/b/c/g?y"
Packit 0e2aa3
testRFC09 = testRelJoin "testRFC09" rfcbase "?q#s" "http://a/b/c/d;p?q#s"
Packit 0e2aa3
testRFC23 = testRelJoin "testRFC10" rfcbase "#s" "http://a/b/c/d;p?q#s"
Packit 0e2aa3
testRFC10 = testRelJoin "testRFC11" rfcbase "g#s" "http://a/b/c/g#s"
Packit 0e2aa3
testRFC11 = testRelJoin "testRFC12" rfcbase "g?y#s" "http://a/b/c/g?y#s"
Packit 0e2aa3
testRFC12 = testRelJoin "testRFC13" rfcbase ";x" "http://a/b/c/;x"
Packit 0e2aa3
testRFC13 = testRelJoin "testRFC14" rfcbase "g;x" "http://a/b/c/g;x"
Packit 0e2aa3
testRFC14 = testRelJoin "testRFC15" rfcbase "g;x?y#s" "http://a/b/c/g;x?y#s"
Packit 0e2aa3
testRFC24 = testRelJoin "testRFC16" rfcbase "" "http://a/b/c/d;p?q"
Packit 0e2aa3
testRFC15 = testRelJoin "testRFC17" rfcbase "." "http://a/b/c/"
Packit 0e2aa3
testRFC16 = testRelJoin "testRFC18" rfcbase "./" "http://a/b/c/"
Packit 0e2aa3
testRFC17 = testRelJoin "testRFC19" rfcbase ".." "http://a/b/"
Packit 0e2aa3
testRFC18 = testRelJoin "testRFC20" rfcbase "../" "http://a/b/"
Packit 0e2aa3
testRFC19 = testRelJoin "testRFC21" rfcbase "../g" "http://a/b/g"
Packit 0e2aa3
testRFC20 = testRelJoin "testRFC22" rfcbase "../.." "http://a/"
Packit 0e2aa3
testRFC21 = testRelJoin "testRFC23" rfcbase "../../" "http://a/"
Packit 0e2aa3
testRFC22 = testRelJoin "testRFC24" rfcbase "../../g" "http://a/g"
Packit 0e2aa3
-- abnormal cases, RFC2396bis 5.4.2
Packit 0e2aa3
testRFC31 = testRelJoin "testRFC31" rfcbase "?q" rfcbase
Packit 0e2aa3
testRFC32 = testRelJoin "testRFC32" rfcbase "../../../g" "http://a/g"
Packit 0e2aa3
testRFC33 = testRelJoin "testRFC33" rfcbase "../../../../g" "http://a/g"
Packit 0e2aa3
testRFC34 = testRelJoin "testRFC34" rfcbase "/./g" "http://a/g"
Packit 0e2aa3
testRFC35 = testRelJoin "testRFC35" rfcbase "/../g" "http://a/g"
Packit 0e2aa3
testRFC36 = testRelJoin "testRFC36" rfcbase "g." "http://a/b/c/g."
Packit 0e2aa3
testRFC37 = testRelJoin "testRFC37" rfcbase ".g" "http://a/b/c/.g"
Packit 0e2aa3
testRFC38 = testRelJoin "testRFC38" rfcbase "g.." "http://a/b/c/g.."
Packit 0e2aa3
testRFC39 = testRelJoin "testRFC39" rfcbase "..g" "http://a/b/c/..g"
Packit 0e2aa3
testRFC40 = testRelJoin "testRFC40" rfcbase "./../g" "http://a/b/g"
Packit 0e2aa3
testRFC41 = testRelJoin "testRFC41" rfcbase "./g/." "http://a/b/c/g/"
Packit 0e2aa3
testRFC42 = testRelJoin "testRFC42" rfcbase "g/./h" "http://a/b/c/g/h"
Packit 0e2aa3
testRFC43 = testRelJoin "testRFC43" rfcbase "g/../h" "http://a/b/c/h"
Packit 0e2aa3
testRFC44 = testRelJoin "testRFC44" rfcbase "g;x=1/./y" "http://a/b/c/g;x=1/y"
Packit 0e2aa3
testRFC45 = testRelJoin "testRFC45" rfcbase "g;x=1/../y" "http://a/b/c/y"
Packit 0e2aa3
testRFC46 = testRelJoin "testRFC46" rfcbase "g?y/./x" "http://a/b/c/g?y/./x"
Packit 0e2aa3
testRFC47 = testRelJoin "testRFC47" rfcbase "g?y/../x" "http://a/b/c/g?y/../x"
Packit 0e2aa3
testRFC48 = testRelJoin "testRFC48" rfcbase "g#s/./x" "http://a/b/c/g#s/./x"
Packit 0e2aa3
testRFC49 = testRelJoin "testRFC49" rfcbase "g#s/../x" "http://a/b/c/g#s/../x"
Packit 0e2aa3
testRFC50 = testRelJoin "testRFC50" rfcbase "http:x" "http:x"
Packit 0e2aa3
Packit 0e2aa3
-- Null path tests
Packit 0e2aa3
-- See RFC2396bis, section 5.2,
Packit 0e2aa3
-- "If the base URI's path component is the empty string, then a single
Packit 0e2aa3
--  slash character is copied to the buffer"
Packit 0e2aa3
testRFC60 = testRelative "testRFC60" "http://ex"     "http://ex/x/y?q" "/x/y?q"
Packit 0e2aa3
testRFC61 = testRelJoin  "testRFC61" "http://ex"     "x/y?q"           "http://ex/x/y?q"
Packit 0e2aa3
testRFC62 = testRelative "testRFC62" "http://ex?p"   "http://ex/x/y?q" "/x/y?q"
Packit 0e2aa3
testRFC63 = testRelJoin  "testRFC63" "http://ex?p"   "x/y?q"           "http://ex/x/y?q"
Packit 0e2aa3
testRFC64 = testRelative "testRFC64" "http://ex#f"   "http://ex/x/y?q" "/x/y?q"
Packit 0e2aa3
testRFC65 = testRelJoin  "testRFC65" "http://ex#f"   "x/y?q"           "http://ex/x/y?q"
Packit 0e2aa3
testRFC66 = testRelative "testRFC66" "http://ex?p"   "http://ex/x/y#g" "/x/y#g"
Packit 0e2aa3
testRFC67 = testRelJoin  "testRFC67" "http://ex?p"   "x/y#g"           "http://ex/x/y#g"
Packit 0e2aa3
testRFC68 = testRelative "testRFC68" "http://ex"     "http://ex/"      "/"
Packit 0e2aa3
testRFC69 = testRelJoin  "testRFC69" "http://ex"     "./"              "http://ex/"
Packit 0e2aa3
testRFC70 = testRelative "testRFC70" "http://ex"     "http://ex/a/b"   "/a/b"
Packit 0e2aa3
testRFC71 = testRelative "testRFC71" "http://ex/a/b" "http://ex"       "./"
Packit 0e2aa3
Packit 0e2aa3
testRFC2396Suite = TF.testGroup "Test RFC2396 examples" testRFC2396List
Packit 0e2aa3
testRFC2396List  =
Packit 0e2aa3
  [ TF.testCase "testRFC01" testRFC01
Packit 0e2aa3
  , TF.testCase "testRFC02" testRFC02
Packit 0e2aa3
  , TF.testCase "testRFC03" testRFC03
Packit 0e2aa3
  , TF.testCase "testRFC04" testRFC04
Packit 0e2aa3
  , TF.testCase "testRFC05" testRFC05
Packit 0e2aa3
  , TF.testCase "testRFC06" testRFC06
Packit 0e2aa3
  , TF.testCase "testRFC07" testRFC07
Packit 0e2aa3
  , TF.testCase "testRFC08" testRFC08
Packit 0e2aa3
  , TF.testCase "testRFC09" testRFC09
Packit 0e2aa3
  , TF.testCase "testRFC10" testRFC10
Packit 0e2aa3
  , TF.testCase "testRFC11" testRFC11
Packit 0e2aa3
  , TF.testCase "testRFC12" testRFC12
Packit 0e2aa3
  , TF.testCase "testRFC13" testRFC13
Packit 0e2aa3
  , TF.testCase "testRFC14" testRFC14
Packit 0e2aa3
  , TF.testCase "testRFC15" testRFC15
Packit 0e2aa3
  , TF.testCase "testRFC16" testRFC16
Packit 0e2aa3
  , TF.testCase "testRFC17" testRFC17
Packit 0e2aa3
  , TF.testCase "testRFC18" testRFC18
Packit 0e2aa3
  , TF.testCase "testRFC19" testRFC19
Packit 0e2aa3
  , TF.testCase "testRFC20" testRFC20
Packit 0e2aa3
  , TF.testCase "testRFC21" testRFC21
Packit 0e2aa3
  , TF.testCase "testRFC22" testRFC22
Packit 0e2aa3
  , TF.testCase "testRFC23" testRFC23
Packit 0e2aa3
  , TF.testCase "testRFC24" testRFC24
Packit 0e2aa3
    -- testRFC30,
Packit 0e2aa3
  , TF.testCase "testRFC31" testRFC31
Packit 0e2aa3
  , TF.testCase "testRFC32" testRFC32
Packit 0e2aa3
  , TF.testCase "testRFC33" testRFC33
Packit 0e2aa3
  , TF.testCase "testRFC34" testRFC34
Packit 0e2aa3
  , TF.testCase "testRFC35" testRFC35
Packit 0e2aa3
  , TF.testCase "testRFC36" testRFC36
Packit 0e2aa3
  , TF.testCase "testRFC37" testRFC37
Packit 0e2aa3
  , TF.testCase "testRFC38" testRFC38
Packit 0e2aa3
  , TF.testCase "testRFC39" testRFC39
Packit 0e2aa3
  , TF.testCase "testRFC40" testRFC40
Packit 0e2aa3
  , TF.testCase "testRFC41" testRFC41
Packit 0e2aa3
  , TF.testCase "testRFC42" testRFC42
Packit 0e2aa3
  , TF.testCase "testRFC43" testRFC43
Packit 0e2aa3
  , TF.testCase "testRFC44" testRFC44
Packit 0e2aa3
  , TF.testCase "testRFC45" testRFC45
Packit 0e2aa3
  , TF.testCase "testRFC46" testRFC46
Packit 0e2aa3
  , TF.testCase "testRFC47" testRFC47
Packit 0e2aa3
  , TF.testCase "testRFC48" testRFC48
Packit 0e2aa3
  , TF.testCase "testRFC49" testRFC49
Packit 0e2aa3
  , TF.testCase "testRFC50" testRFC50
Packit 0e2aa3
    --
Packit 0e2aa3
  , TF.testCase "testRFC60" testRFC60
Packit 0e2aa3
  , TF.testCase "testRFC61" testRFC61
Packit 0e2aa3
  , TF.testCase "testRFC62" testRFC62
Packit 0e2aa3
  , TF.testCase "testRFC63" testRFC63
Packit 0e2aa3
  , TF.testCase "testRFC64" testRFC64
Packit 0e2aa3
  , TF.testCase "testRFC65" testRFC65
Packit 0e2aa3
  , TF.testCase "testRFC66" testRFC66
Packit 0e2aa3
  , TF.testCase "testRFC67" testRFC67
Packit 0e2aa3
  , TF.testCase "testRFC68" testRFC68
Packit 0e2aa3
  , TF.testCase "testRFC69" testRFC69
Packit 0e2aa3
  , TF.testCase "testRFC70" testRFC70
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- And some other oddballs:
Packit 0e2aa3
mailbase = "mailto:local/option@domain.org?notaquery#frag"
Packit 0e2aa3
testMail01 = testRelJoin "testMail01"
Packit 0e2aa3
            mailbase "more@domain"
Packit 0e2aa3
            "mailto:local/more@domain"
Packit 0e2aa3
testMail02 = testRelJoin "testMail02"
Packit 0e2aa3
            mailbase "#newfrag"
Packit 0e2aa3
            "mailto:local/option@domain.org?notaquery#newfrag"
Packit 0e2aa3
testMail03 = testRelJoin "testMail03"
Packit 0e2aa3
            mailbase "l1/q1@domain"
Packit 0e2aa3
            "mailto:local/l1/q1@domain"
Packit 0e2aa3
Packit 0e2aa3
testMail11 = testRelJoin "testMail11"
Packit 0e2aa3
             "mailto:local1@domain1?query1" "mailto:local2@domain2"
Packit 0e2aa3
             "mailto:local2@domain2"
Packit 0e2aa3
testMail12 = testRelJoin "testMail12"
Packit 0e2aa3
             "mailto:local1@domain1" "mailto:local2@domain2?query2"
Packit 0e2aa3
             "mailto:local2@domain2?query2"
Packit 0e2aa3
testMail13 = testRelJoin "testMail13"
Packit 0e2aa3
             "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"
Packit 0e2aa3
             "mailto:local2@domain2?query2"
Packit 0e2aa3
testMail14 = testRelJoin "testMail14"
Packit 0e2aa3
             "mailto:local@domain?query1" "mailto:local@domain?query2"
Packit 0e2aa3
             "mailto:local@domain?query2"
Packit 0e2aa3
testMail15 = testRelJoin "testMail15"
Packit 0e2aa3
             "mailto:?query1" "mailto:local@domain?query2"
Packit 0e2aa3
             "mailto:local@domain?query2"
Packit 0e2aa3
testMail16 = testRelJoin "testMail16"
Packit 0e2aa3
             "mailto:local@domain?query1" "?query2"
Packit 0e2aa3
             "mailto:local@domain?query2"
Packit 0e2aa3
testInfo17 = testRelJoin "testInfo17"
Packit 0e2aa3
             "info:name/1234/../567" "name/9876/../543"
Packit 0e2aa3
             "info:name/name/543"
Packit 0e2aa3
testInfo18 = testRelJoin "testInfo18"
Packit 0e2aa3
             "info:/name/1234/../567" "name/9876/../543"
Packit 0e2aa3
             "info:/name/name/543"
Packit 0e2aa3
Packit 0e2aa3
testOddballSuite = TF.testGroup "Test oddball examples" testOddballList
Packit 0e2aa3
testOddballList  =
Packit 0e2aa3
  [ TF.testCase "testMail01" testMail01
Packit 0e2aa3
  , TF.testCase "testMail02" testMail02
Packit 0e2aa3
  , TF.testCase "testMail03" testMail03
Packit 0e2aa3
  , TF.testCase "testMail11" testMail11
Packit 0e2aa3
  , TF.testCase "testMail12" testMail12
Packit 0e2aa3
  , TF.testCase "testMail13" testMail13
Packit 0e2aa3
  , TF.testCase "testMail14" testMail14
Packit 0e2aa3
  , TF.testCase "testMail15" testMail15
Packit 0e2aa3
  , TF.testCase "testMail16" testMail16
Packit 0e2aa3
  , TF.testCase "testInfo17" testInfo17
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
--  Normalization tests
Packit 0e2aa3
Packit 0e2aa3
--  Case normalization; cf. RFC2396bis section 6.2.2.1
Packit 0e2aa3
--  NOTE:  authority case normalization is not performed
Packit 0e2aa3
testNormalize01 = testEq "testNormalize01"
Packit 0e2aa3
                  "http://EXAMPLE.com/Root/%2A?%2B#%2C"
Packit 0e2aa3
                  (normalizeCase "HTTP://EXAMPLE.com/Root/%2a?%2b#%2c")
Packit 0e2aa3
Packit 0e2aa3
--  Encoding normalization; cf. RFC2396bis section 6.2.2.2
Packit 0e2aa3
testNormalize11 = testEq "testNormalize11"
Packit 0e2aa3
                  "HTTP://EXAMPLE.com/Root/~Me/"
Packit 0e2aa3
                  (normalizeEscape "HTTP://EXAMPLE.com/Root/%7eMe/")
Packit 0e2aa3
testNormalize12 = testEq "testNormalize12"
Packit 0e2aa3
                  "foo:%40AZ%5b%60az%7b%2f09%3a-._~"
Packit 0e2aa3
                  (normalizeEscape "foo:%40%41%5a%5b%60%61%7a%7b%2f%30%39%3a%2d%2e%5f%7e")
Packit 0e2aa3
testNormalize13 = testEq "testNormalize13"
Packit 0e2aa3
                  "foo:%3a%2f%3f%23%5b%5d%40"
Packit 0e2aa3
                  (normalizeEscape "foo:%3a%2f%3f%23%5b%5d%40")
Packit 0e2aa3
Packit 0e2aa3
--  Path segment normalization; cf. RFC2396bis section 6.2.2.4
Packit 0e2aa3
testNormalize21 = testEq "testNormalize21"
Packit 0e2aa3
                    "http://example/c"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/../../c")
Packit 0e2aa3
testNormalize22 = testEq "testNormalize22"
Packit 0e2aa3
                    "http://example/a/"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/c/../../")
Packit 0e2aa3
testNormalize23 = testEq "testNormalize23"
Packit 0e2aa3
                    "http://example/a/b/c/"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/c/./")
Packit 0e2aa3
testNormalize24 = testEq "testNormalize24"
Packit 0e2aa3
                    "http://example/a/b/"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/c/.././")
Packit 0e2aa3
testNormalize25 = testEq "testNormalize25"
Packit 0e2aa3
                    "http://example/e"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/c/d/../../../../e")
Packit 0e2aa3
testNormalize26 = testEq "testNormalize26"
Packit 0e2aa3
                    "http://example/e"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/c/d/../.././../../e")
Packit 0e2aa3
testNormalize27 = testEq "testNormalize27"
Packit 0e2aa3
                    "http://example/e"
Packit 0e2aa3
                    (normalizePathSegments "http://example/a/b/../.././../../e")
Packit 0e2aa3
testNormalize28 = testEq "testNormalize28"
Packit 0e2aa3
                    "foo:e"
Packit 0e2aa3
                    (normalizePathSegments "foo:a/b/../.././../../e")
Packit 0e2aa3
Packit 0e2aa3
testNormalizeSuite = TF.testGroup "testNormalizeSuite"
Packit 0e2aa3
  [ TF.testCase "testNormalize01" testNormalize01
Packit 0e2aa3
  , TF.testCase "testNormalize11" testNormalize11
Packit 0e2aa3
  , TF.testCase "testNormalize12" testNormalize12
Packit 0e2aa3
  , TF.testCase "testNormalize13" testNormalize13
Packit 0e2aa3
  , TF.testCase "testNormalize21" testNormalize21
Packit 0e2aa3
  , TF.testCase "testNormalize22" testNormalize22
Packit 0e2aa3
  , TF.testCase "testNormalize23" testNormalize23
Packit 0e2aa3
  , TF.testCase "testNormalize24" testNormalize24
Packit 0e2aa3
  , TF.testCase "testNormalize25" testNormalize25
Packit 0e2aa3
  , TF.testCase "testNormalize26" testNormalize26
Packit 0e2aa3
  , TF.testCase "testNormalize27" testNormalize27
Packit 0e2aa3
  , TF.testCase "testNormalize28" testNormalize28
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- URI formatting (show) tests
Packit 0e2aa3
Packit 0e2aa3
ts02URI = URI   { uriScheme    = "http:"
Packit 0e2aa3
                , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")
Packit 0e2aa3
                , uriPath      = "/aaa/bbb"
Packit 0e2aa3
                , uriQuery     = "?ccc"
Packit 0e2aa3
                , uriFragment  = "#ddd/eee"
Packit 0e2aa3
                }
Packit 0e2aa3
Packit 0e2aa3
ts04URI = URI   { uriScheme    = "http:"
Packit 0e2aa3
                , uriAuthority = Just (URIAuth "user:anonymous@" "example.org" ":99")
Packit 0e2aa3
                , uriPath      = "/aaa/bbb"
Packit 0e2aa3
                , uriQuery     = "?ccc"
Packit 0e2aa3
                , uriFragment  = "#ddd/eee"
Packit 0e2aa3
                }
Packit 0e2aa3
Packit 0e2aa3
ts02str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"
Packit 0e2aa3
ts03str = "http://user:pass@example.org:99/aaa/bbb?ccc#ddd/eee"
Packit 0e2aa3
ts04str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"
Packit 0e2aa3
Packit 0e2aa3
testShowURI01 = testEq "testShowURI01" ""      (show nullURI)
Packit 0e2aa3
testShowURI02 = testEq "testShowURI02" ts02str (show ts02URI)
Packit 0e2aa3
testShowURI03 = testEq "testShowURI03" ts03str ((uriToString id ts02URI) "")
Packit 0e2aa3
testShowURI04 = testEq "testShowURI04" ts04str (show ts04URI)
Packit 0e2aa3
Packit 0e2aa3
testShowURI = TF.testGroup "testShowURI"
Packit 0e2aa3
  [ TF.testCase "testShowURI01" testShowURI01
Packit 0e2aa3
  , TF.testCase "testShowURI02" testShowURI02
Packit 0e2aa3
  , TF.testCase "testShowURI03" testShowURI03
Packit 0e2aa3
  , TF.testCase "testShowURI04" testShowURI04
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
Packit 0e2aa3
-- URI escaping tests
Packit 0e2aa3
Packit 0e2aa3
te01str = "http://example.org/az/09-_/.~:/?#[]@!$&'()*+,;="
Packit 0e2aa3
te02str = "http://example.org/a/c%/d /e"
Packit 0e2aa3
te02esc = "http://example.org/a%3C/b%3E/c%25/d%20/e"
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString01 = testEq "testEscapeURIString01"
Packit 0e2aa3
    te01str (escapeURIString isUnescapedInURI te01str)
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString02 = testEq "testEscapeURIString02"
Packit 0e2aa3
    te02esc (escapeURIString isUnescapedInURI te02str)
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString03 = testEq "testEscapeURIString03"
Packit 0e2aa3
    te01str (unEscapeString te01str)
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString04 = testEq "testEscapeURIString04"
Packit 0e2aa3
    te02str (unEscapeString te02esc)
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString05 = testEq "testEscapeURIString05"
Packit 0e2aa3
    "http%3A%2F%2Fexample.org%2Faz%2F09-_%2F.~%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D"
Packit 0e2aa3
    (escapeURIString isUnescapedInURIComponent te01str)
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString06 = testEq "testEscapeURIString06"
Packit 0e2aa3
    "hello%C3%B8%C2%A9%E6%97%A5%E6%9C%AC"
Packit 0e2aa3
    (escapeURIString isUnescapedInURIComponent "helloø©日本")
Packit 0e2aa3
Packit 0e2aa3
propEscapeUnEscapeLoop :: String -> Bool
Packit 0e2aa3
propEscapeUnEscapeLoop s = s == (unEscapeString $! escaped)
Packit 0e2aa3
        where
Packit 0e2aa3
        escaped = escapeURIString (const False) s
Packit 0e2aa3
        {-# NOINLINE escaped #-}
Packit 0e2aa3
Packit 0e2aa3
testEscapeURIString = TF.testGroup "testEscapeURIString"
Packit 0e2aa3
  [ TF.testCase "testEscapeURIString01" testEscapeURIString01
Packit 0e2aa3
  , TF.testCase "testEscapeURIString02" testEscapeURIString02
Packit 0e2aa3
  , TF.testCase "testEscapeURIString03" testEscapeURIString03
Packit 0e2aa3
  , TF.testCase "testEscapeURIString04" testEscapeURIString04
Packit 0e2aa3
  , TF.testCase "testEscapeURIString05" testEscapeURIString05
Packit 0e2aa3
  , TF.testCase "testEscapeURIString06" testEscapeURIString06
Packit 0e2aa3
  , TF.testProperty "propEscapeUnEscapeLoop" propEscapeUnEscapeLoop
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- URI string normalization tests
Packit 0e2aa3
Packit 0e2aa3
tn01str = "eXAMPLE://a/b/%7bfoo%7d"
Packit 0e2aa3
tn01nrm = "example://a/b/%7Bfoo%7D"
Packit 0e2aa3
Packit 0e2aa3
tn02str = "example://a/b/%63/"
Packit 0e2aa3
tn02nrm = "example://a/b/c/"
Packit 0e2aa3
Packit 0e2aa3
tn03str = "example://a/./b/../b/c/foo"
Packit 0e2aa3
tn03nrm = "example://a/b/c/foo"
Packit 0e2aa3
Packit 0e2aa3
tn04str = "eXAMPLE://a/b/%7bfoo%7d"     -- From RFC2396bis, 6.2.2
Packit 0e2aa3
tn04nrm = "example://a/b/%7Bfoo%7D"
Packit 0e2aa3
Packit 0e2aa3
tn06str = "file:/x/..//y"
Packit 0e2aa3
tn06nrm = "file://y"
Packit 0e2aa3
Packit 0e2aa3
tn07str = "file:x/..//y/"
Packit 0e2aa3
tn07nrm = "file:/y/"
Packit 0e2aa3
Packit 0e2aa3
testNormalizeURIString01 = testEq "testNormalizeURIString01"
Packit 0e2aa3
    tn01nrm (normalizeCase tn01str)
Packit 0e2aa3
testNormalizeURIString02 = testEq "testNormalizeURIString02"
Packit 0e2aa3
    tn02nrm (normalizeEscape tn02str)
Packit 0e2aa3
testNormalizeURIString03 = testEq "testNormalizeURIString03"
Packit 0e2aa3
    tn03nrm (normalizePathSegments tn03str)
Packit 0e2aa3
testNormalizeURIString04 = testEq "testNormalizeURIString04"
Packit 0e2aa3
    tn04nrm ((normalizeCase . normalizeEscape . normalizePathSegments) tn04str)
Packit 0e2aa3
testNormalizeURIString05 = testEq "testNormalizeURIString05"
Packit 0e2aa3
    tn04nrm ((normalizePathSegments . normalizeEscape . normalizeCase) tn04str)
Packit 0e2aa3
testNormalizeURIString06 = testEq "testNormalizeURIString06"
Packit 0e2aa3
    tn06nrm (normalizePathSegments tn06str)
Packit 0e2aa3
testNormalizeURIString07 = testEq "testNormalizeURIString07"
Packit 0e2aa3
    tn07nrm (normalizePathSegments tn07str)
Packit 0e2aa3
Packit 0e2aa3
testNormalizeURIString = TF.testGroup "testNormalizeURIString"
Packit 0e2aa3
  [ TF.testCase "testNormalizeURIString01" testNormalizeURIString01
Packit 0e2aa3
  , TF.testCase "testNormalizeURIString02" testNormalizeURIString02
Packit 0e2aa3
  , TF.testCase "testNormalizeURIString03" testNormalizeURIString03
Packit 0e2aa3
  , TF.testCase "testNormalizeURIString04" testNormalizeURIString04
Packit 0e2aa3
  , TF.testCase "testNormalizeURIString05" testNormalizeURIString05
Packit 0e2aa3
  , TF.testCase "testNormalizeURIString06" testNormalizeURIString06
Packit 0e2aa3
  , TF.testCase "testNormalizeURIString07" testNormalizeURIString07
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- Test strict vs non-strict relativeTo logic
Packit 0e2aa3
Packit 0e2aa3
trbase = fromJust $ parseURIReference "http://bar.org/"
Packit 0e2aa3
Packit 0e2aa3
testRelativeTo01 = testEq "testRelativeTo01"
Packit 0e2aa3
    "http://bar.org/foo"
Packit 0e2aa3
    (show $
Packit 0e2aa3
      (fromJust $ parseURIReference "foo") `relativeTo` trbase)
Packit 0e2aa3
Packit 0e2aa3
testRelativeTo02 = testEq "testRelativeTo02"
Packit 0e2aa3
    "http:foo"
Packit 0e2aa3
    (show $
Packit 0e2aa3
      (fromJust $ parseURIReference "http:foo") `relativeTo` trbase)
Packit 0e2aa3
Packit 0e2aa3
testRelativeTo03 = testEq "testRelativeTo03"
Packit 0e2aa3
    "http://bar.org/foo"
Packit 0e2aa3
    (show $
Packit 0e2aa3
      (fromJust $ parseURIReference "http:foo") `nonStrictRelativeTo` trbase)
Packit 0e2aa3
Packit 0e2aa3
testRelativeTo = TF.testGroup "testRelativeTo"
Packit 0e2aa3
  [ TF.testCase "testRelativeTo01" testRelativeTo01
Packit 0e2aa3
  , TF.testCase "testRelativeTo02" testRelativeTo02
Packit 0e2aa3
  , TF.testCase "testRelativeTo03" testRelativeTo03
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- Test alternative parsing functions
Packit 0e2aa3
testAltFn01 = testEq "testAltFn01" "Just http://a.b/c#f"
Packit 0e2aa3
    (show . parseURI $ "http://a.b/c#f")
Packit 0e2aa3
testAltFn02 = testEq "testAltFn02" "Just http://a.b/c#f"
Packit 0e2aa3
    (show . parseURIReference $ "http://a.b/c#f")
Packit 0e2aa3
testAltFn03 = testEq "testAltFn03" "Just c/d#f"
Packit 0e2aa3
    (show . parseRelativeReference $ "c/d#f")
Packit 0e2aa3
testAltFn04 = testEq "testAltFn04" "Nothing"
Packit 0e2aa3
    (show . parseRelativeReference $ "http://a.b/c#f")
Packit 0e2aa3
testAltFn05 = testEq "testAltFn05" "Just http://a.b/c"
Packit 0e2aa3
    (show . parseAbsoluteURI $ "http://a.b/c")
Packit 0e2aa3
testAltFn06 = testEq "testAltFn06" "Nothing"
Packit 0e2aa3
    (show . parseAbsoluteURI $ "http://a.b/c#f")
Packit 0e2aa3
testAltFn07 = testEq "testAltFn07" "Nothing"
Packit 0e2aa3
    (show . parseAbsoluteURI $ "c/d")
Packit 0e2aa3
testAltFn08 = testEq "testAltFn08" "Just http://a.b/c"
Packit 0e2aa3
    (show . parseAbsoluteURI $ "http://a.b/c")
Packit 0e2aa3
Packit 0e2aa3
testAltFn11 = testEq "testAltFn11" True  (isURI "http://a.b/c#f")
Packit 0e2aa3
testAltFn12 = testEq "testAltFn12" True  (isURIReference "http://a.b/c#f")
Packit 0e2aa3
testAltFn13 = testEq "testAltFn13" True  (isRelativeReference "c/d#f")
Packit 0e2aa3
testAltFn14 = testEq "testAltFn14" False (isRelativeReference "http://a.b/c#f")
Packit 0e2aa3
testAltFn15 = testEq "testAltFn15" True  (isAbsoluteURI "http://a.b/c")
Packit 0e2aa3
testAltFn16 = testEq "testAltFn16" False (isAbsoluteURI "http://a.b/c#f")
Packit 0e2aa3
testAltFn17 = testEq "testAltFn17" False (isAbsoluteURI "c/d")
Packit 0e2aa3
Packit 0e2aa3
testAltFn = TF.testGroup "testAltFn"
Packit 0e2aa3
  [ TF.testCase "testAltFn01" testAltFn01
Packit 0e2aa3
  , TF.testCase "testAltFn02" testAltFn02
Packit 0e2aa3
  , TF.testCase "testAltFn03" testAltFn03
Packit 0e2aa3
  , TF.testCase "testAltFn04" testAltFn04
Packit 0e2aa3
  , TF.testCase "testAltFn05" testAltFn05
Packit 0e2aa3
  , TF.testCase "testAltFn06" testAltFn06
Packit 0e2aa3
  , TF.testCase "testAltFn07" testAltFn07
Packit 0e2aa3
  , TF.testCase "testAltFn08" testAltFn08
Packit 0e2aa3
  , TF.testCase "testAltFn11" testAltFn11
Packit 0e2aa3
  , TF.testCase "testAltFn12" testAltFn12
Packit 0e2aa3
  , TF.testCase "testAltFn13" testAltFn13
Packit 0e2aa3
  , TF.testCase "testAltFn14" testAltFn14
Packit 0e2aa3
  , TF.testCase "testAltFn15" testAltFn15
Packit 0e2aa3
  , TF.testCase "testAltFn16" testAltFn16
Packit 0e2aa3
  , TF.testCase "testAltFn17" testAltFn17
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
testUriIsAbsolute :: String -> Assertion
Packit 0e2aa3
testUriIsAbsolute str =
Packit 0e2aa3
    assertBool str (uriIsAbsolute uri)
Packit 0e2aa3
    where
Packit 0e2aa3
    Just uri = parseURIReference str
Packit 0e2aa3
Packit 0e2aa3
testUriIsRelative :: String -> Assertion
Packit 0e2aa3
testUriIsRelative str =
Packit 0e2aa3
    assertBool str (uriIsRelative uri)
Packit 0e2aa3
    where
Packit 0e2aa3
    Just uri = parseURIReference str
Packit 0e2aa3
Packit 0e2aa3
testIsAbsolute = TF.testGroup "testIsAbsolute"
Packit 0e2aa3
  [ TF.testCase "testIsAbsolute01" $ testUriIsAbsolute "http://google.com"
Packit 0e2aa3
  , TF.testCase "testIsAbsolute02" $ testUriIsAbsolute "ftp://p.x.ca/woo?hai=a"
Packit 0e2aa3
  , TF.testCase "testIsAbsolute03" $ testUriIsAbsolute "mailto:bob@example.com"
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
testIsRelative = TF.testGroup "testIsRelative"
Packit 0e2aa3
  [ TF.testCase "testIsRelative01" $ testUriIsRelative "//google.com"
Packit 0e2aa3
  , TF.testCase "testIsRelative02" $ testUriIsRelative "/hello"
Packit 0e2aa3
  , TF.testCase "testIsRelative03" $ testUriIsRelative "this/is/a/path"
Packit 0e2aa3
  , TF.testCase "testIsRelative04" $ testUriIsRelative "?what=that"
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
testPathSegmentsRoundTrip :: URI -> Assertion
Packit 0e2aa3
testPathSegmentsRoundTrip u =
Packit 0e2aa3
  let segs = pathSegments u
Packit 0e2aa3
Packit 0e2aa3
      dropSuffix _suf []              = []
Packit 0e2aa3
      dropSuffix suf [x] | suf == x   = []
Packit 0e2aa3
                         | otherwise = [x]
Packit 0e2aa3
      dropSuffix suf (x:xs)          = x : dropSuffix suf xs
Packit 0e2aa3
Packit 0e2aa3
      dropPrefix _pre []                 = []
Packit 0e2aa3
      dropPrefix pre (x:xs) | pre == x   = xs
Packit 0e2aa3
                            | otherwise = (x:xs)
Packit 0e2aa3
      strippedUriPath = dropSuffix '/' $ dropPrefix '/' $ uriPath u
Packit 0e2aa3
  in
Packit 0e2aa3
     (Data.List.intercalate "/" segs @?= strippedUriPath)
Packit 0e2aa3
Packit 0e2aa3
assertJust _f Nothing = assertFailure "URI failed to parse"
Packit 0e2aa3
assertJust f  (Just x) = f x
Packit 0e2aa3
Packit 0e2aa3
testPathSegments = TF.testGroup "testPathSegments"
Packit 0e2aa3
  [ TF.testCase "testPathSegments03" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURIReference ""
Packit 0e2aa3
  , TF.testCase "testPathSegments04" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURIReference "/"
Packit 0e2aa3
  , TF.testCase "testPathSegments05" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURIReference "//"
Packit 0e2aa3
  , TF.testCase "testPathSegments06" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURIReference "foo//bar/"
Packit 0e2aa3
  , TF.testCase "testPathSegments07" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURIReference "/foo//bar/"
Packit 0e2aa3
  , TF.testCase "testPathSegments03" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURI "http://example.org"
Packit 0e2aa3
  , TF.testCase "testPathSegments04" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURI "http://example.org/"
Packit 0e2aa3
  , TF.testCase "testPathSegments05" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURI "http://example.org//"
Packit 0e2aa3
  , TF.testCase "testPathSegments06" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURI "http://ex.ca/foo//bar/"
Packit 0e2aa3
  , TF.testCase "testPathSegments07" $
Packit 0e2aa3
        assertJust testPathSegmentsRoundTrip $ parseURI "http://ex.ca/foo//bar/"
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
-- Full test suite
Packit 0e2aa3
allTests =
Packit 0e2aa3
  [ testURIRefSuite
Packit 0e2aa3
  , testComponentSuite
Packit 0e2aa3
  , testRelativeSuite
Packit 0e2aa3
  , testRFC2396Suite
Packit 0e2aa3
  , testOddballSuite
Packit 0e2aa3
  , testNormalizeSuite
Packit 0e2aa3
  , testShowURI
Packit 0e2aa3
  , testEscapeURIString
Packit 0e2aa3
  , testNormalizeURIString
Packit 0e2aa3
  , testRelativeTo
Packit 0e2aa3
  , testAltFn
Packit 0e2aa3
  , testIsAbsolute
Packit 0e2aa3
  , testIsRelative
Packit 0e2aa3
  , testPathSegments
Packit 0e2aa3
  ]
Packit 0e2aa3
Packit 0e2aa3
main = TF.defaultMain allTests
Packit 0e2aa3
Packit 0e2aa3
runTestFile t = do
Packit 0e2aa3
    h <- openFile "a.tmp" WriteMode
Packit 0e2aa3
    _ <- runTestText (putTextToHandle h False) t
Packit 0e2aa3
    hClose h
Packit 0e2aa3
tf = runTestFile
Packit 0e2aa3
tt = runTestTT
Packit 0e2aa3
Packit 0e2aa3
-- Miscellaneous values for hand-testing/debugging in Hugs:
Packit 0e2aa3
Packit 0e2aa3
uref = testURIRefSuite
Packit 0e2aa3
tr01 = testRelative01
Packit 0e2aa3
tr02 = testRelative02
Packit 0e2aa3
tr03 = testRelative03
Packit 0e2aa3
tr04 = testRelative04
Packit 0e2aa3
rel  = testRelativeSuite
Packit 0e2aa3
rfc  = testRFC2396Suite
Packit 0e2aa3
oddb = testOddballSuite
Packit 0e2aa3
Packit 0e2aa3
(Just bu02) = parseURIReference "http://example/x/y/z"
Packit 0e2aa3
(Just ou02) = parseURIReference "../abc"
Packit 0e2aa3
(Just ru02) = parseURIReference "http://example/x/abc"
Packit 0e2aa3
-- fileuri = testURIReference "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"
Packit 0e2aa3
Packit 0e2aa3
cu02 = ou02 `relativeTo` bu02
Packit 0e2aa3
Packit 0e2aa3
--------------------------------------------------------------------------------
Packit 0e2aa3
--
Packit 0e2aa3
--  Copyright (c) 2004, G. KLYNE.  All rights reserved.
Packit 0e2aa3
--  Distributed as free software under the following license.
Packit 0e2aa3
--
Packit 0e2aa3
--  Redistribution and use in source and binary forms, with or without
Packit 0e2aa3
--  modification, are permitted provided that the following conditions
Packit 0e2aa3
--  are met:
Packit 0e2aa3
--
Packit 0e2aa3
--  - Redistributions of source code must retain the above copyright notice,
Packit 0e2aa3
--  this list of conditions and the following disclaimer.
Packit 0e2aa3
--
Packit 0e2aa3
--  - Redistributions in binary form must reproduce the above copyright
Packit 0e2aa3
--  notice, this list of conditions and the following disclaimer in the
Packit 0e2aa3
--  documentation and/or other materials provided with the distribution.
Packit 0e2aa3
--
Packit 0e2aa3
--  - Neither name of the copyright holders nor the names of its
Packit 0e2aa3
--  contributors may be used to endorse or promote products derived from
Packit 0e2aa3
--  this software without specific prior written permission.
Packit 0e2aa3
--
Packit 0e2aa3
--  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS
Packit 0e2aa3
--  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0e2aa3
--  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0e2aa3
--  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0e2aa3
--  HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit 0e2aa3
--  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
Packit 0e2aa3
--  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
Packit 0e2aa3
--  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
Packit 0e2aa3
--  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
Packit 0e2aa3
--  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
Packit 0e2aa3
--  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit 0e2aa3
--
Packit 0e2aa3
--------------------------------------------------------------------------------
Packit 0e2aa3
-- $Source: /srv/cvs/cvs.haskell.org/fptools/libraries/network/tests/URITest.hs,v $
Packit 0e2aa3
-- $Author: gklyne $
Packit 0e2aa3
-- $Revision: 1.8 $
Packit 0e2aa3
-- $Log: URITest.hs,v $
Packit 0e2aa3
-- Revision 1.81 2012/08/01           aaronfriel
Packit 0e2aa3
-- Added additional test case for the "xip.io" service style URLs and absolute URLs prefixed with ipv4 addresses.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.8  2005/07/19 22:01:27  gklyne
Packit 0e2aa3
-- Added some additional test cases raised by discussion on URI@w3.org mailing list about 2005-07-19.  The test p[roposed by this discussion exposed a subtle bug in relativeFrom not being an exact inverse of relativeTo.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.7  2005/06/06 16:31:44  gklyne
Packit 0e2aa3
-- Added two new test cases.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.6  2005/05/31 17:18:36  gklyne
Packit 0e2aa3
-- Added some additional test cases triggered by URI-list discussions.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.5  2005/04/07 11:09:37  gklyne
Packit 0e2aa3
-- Added test cases for alternate parsing functions (including deprecated 'parseabsoluteURI')
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.4  2005/04/05 12:47:32  gklyne
Packit 0e2aa3
-- Added test case.
Packit 0e2aa3
-- Changed module name, now requires GHC -main-is to compile.
Packit 0e2aa3
-- All tests run OK with GHC 6.4 on MS-Windows.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.3  2004/11/05 17:29:09  gklyne
Packit 0e2aa3
-- Changed password-obscuring logic to reflect late change in revised URI
Packit 0e2aa3
-- specification (password "anonymous" is no longer a special case).
Packit 0e2aa3
-- Updated URI test module to use function 'escapeURIString'.
Packit 0e2aa3
-- (Should unEscapeString be similarly updated?)
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.2  2004/10/27 13:06:55  gklyne
Packit 0e2aa3
-- Updated URI module function names per:
Packit 0e2aa3
-- http://www.haskell.org//pipermail/cvs-libraries/2004-October/002916.html
Packit 0e2aa3
-- Added test cases to give better covereage of module functions.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.1  2004/10/14 16:11:30  gklyne
Packit 0e2aa3
-- Add URI unit test to cvs.haskell.org repository
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.17  2004/10/14 11:51:09  graham
Packit 0e2aa3
-- Confirm that URITest runs with GHC.
Packit 0e2aa3
-- Fix up some comments and other minor details.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.16  2004/10/14 11:45:30  graham
Packit 0e2aa3
-- Use moduke name main for GHC 6.2
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.15  2004/08/11 11:07:39  graham
Packit 0e2aa3
-- Add new test case.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.14  2004/06/30 11:35:27  graham
Packit 0e2aa3
-- Update URI code to use hierarchical libraries for Parsec and Network.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.13  2004/06/22 16:19:16  graham
Packit 0e2aa3
-- New URI test case added.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.12  2004/04/21 15:13:29  graham
Packit 0e2aa3
-- Add test case
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.11  2004/04/21 14:54:05  graham
Packit 0e2aa3
-- Fix up some tests
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.10  2004/04/20 14:54:13  graham
Packit 0e2aa3
-- Fix up test cases related to port number in authority,
Packit 0e2aa3
-- and add some more URI decomposition tests.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.9  2004/04/07 15:06:17  graham
Packit 0e2aa3
-- Add extra test case
Packit 0e2aa3
-- Revise syntax in line with changes to RFC2396bis
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.8  2004/03/17 14:34:58  graham
Packit 0e2aa3
-- Add Network.HTTP files to CVS
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.7  2004/03/16 14:19:38  graham
Packit 0e2aa3
-- Change licence to BSD style;  add nullURI definition; new test cases.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.6  2004/02/20 12:12:00  graham
Packit 0e2aa3
-- Add URI normalization functions
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.5  2004/02/19 23:19:35  graham
Packit 0e2aa3
-- Network.URI module passes all test cases
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.4  2004/02/17 20:06:02  graham
Packit 0e2aa3
-- Revised URI parser to reflect latest RFC2396bis (-04)
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.3  2004/02/11 14:32:14  graham
Packit 0e2aa3
-- Added work-in-progress notes.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.2  2004/02/02 14:00:39  graham
Packit 0e2aa3
-- Fix optional host name in URI.  Add test cases.
Packit 0e2aa3
--
Packit 0e2aa3
-- Revision 1.1  2004/01/27 21:13:45  graham
Packit 0e2aa3
-- New URI module and test suite added,
Packit 0e2aa3
-- implementing the GHC Network.URI interface.
Packit 0e2aa3
--