@@ -0,0 +1,80 @@
1+module Main where
2+
3+import Control.Monad
4+import Data.Aeson
5+import qualified Data.HashMap.Strict as H
6+import Data.JsonPointer
7+import Data.Monoid
8+import Data.Text (Text)
9+import qualified Data.Text as T
10+import Data.Text.Encoding
11+import qualified Data.Vector as V
12+import Network.HTTP.Types.URI
13+import Test.Framework (defaultMain, testGroup)
14+import Test.Framework.Providers.HUnit (testCase)
15+import Test.HUnit hiding (Test)
16+
17+
18+main :: IO ()
19+main = defaultMain
20+ [ testGroup "unit"
21+ [ testCase "Can be represented in a JSON string value" jsonString
22+ , testCase "Can be represented in a URI fragment identifier" uriFragment
23+ ]
24+ ]
25+
26+specExample :: Value
27+specExample =
28+ Object $ H.fromList
29+ [ ("foo" , Array $ V.fromList ["bar", "baz"])
30+ , ("" , Number 0)
31+ , ("a/b" , Number 1)
32+ , ("c%d" , Number 2)
33+ , ("e^f" , Number 3)
34+ , ("g|h" , Number 4)
35+ , ("i\\j", Number 5)
36+ , ("k\"l", Number 6)
37+ , (" " , Number 7)
38+ , ("m~n" , Number 8)
39+ ]
40+
41+jsonString :: Assertion
42+jsonString =
43+ void $ mapM
44+ (\(a,expected) -> assertEqual ("Tried to resolve " <> show a) (Right expected)
45+ $ jsonPointer a >>= resolvePointer specExample)
46+ [ ("" , specExample)
47+ , ("/foo" , Array $ V.fromList ["bar", "baz"])
48+ , ("/foo/0", String "bar")
49+ , ("/" , Number 0)
50+ , ("/a~1b" , Number 1)
51+ , ("/c%d" , Number 2)
52+ , ("/e^f" , Number 3)
53+ , ("/g|h" , Number 4)
54+ , ("/i\\j" , Number 5)
55+ , ("/k\"l" , Number 6)
56+ , ("/ " , Number 7)
57+ , ("/m~0n" , Number 8)
58+ ]
59+
60+uriFragment :: Assertion
61+uriFragment =
62+ void $ mapM
63+ (\(a,expected) -> assertEqual ("Tried to resolve " <> show a) (Right expected)
64+ $ jsonPointer (decodeFragment a) >>= resolvePointer specExample)
65+ [ ("#" , specExample)
66+ , ("#/foo" , Array $ V.fromList ["bar", "baz"])
67+ , ("#/foo/0", String "bar")
68+ , ("#/" , Number 0)
69+ , ("#/a~1b" , Number 1)
70+ , ("#/c%25d", Number 2)
71+ , ("#/e%5Ef", Number 3)
72+ , ("#/g%7Ch", Number 4)
73+ , ("#/i%5Cj", Number 5)
74+ , ("#/k%22l", Number 6)
75+ , ("#/%20" , Number 7)
76+ , ("#/m~0n" , Number 8)
77+ ]
78+ where
79+ decodeFragment :: Text -> Text
80+ decodeFragment = T.drop 1 . decodeUtf8 . urlDecode True . encodeUtf8