git.iko.soy/typeable/hjsonpointer
on c1075bb help sign in
80 lines 2.4 kB history raw
1module Main where
3import Control.Monad
4import Data.Aeson
5import qualified Data.HashMap.Strict as H
6import Data.JsonPointer
7import Data.Monoid
8import Data.Text (Text)
9import qualified Data.Text as T
10import Data.Text.Encoding
11import qualified Data.Vector as V
12import Network.HTTP.Types.URI
13import Test.Framework (defaultMain, testGroup)
14import Test.Framework.Providers.HUnit (testCase)
15import Test.HUnit hiding (Test)
18main :: IO ()
19main = 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 ]
26specExample :: Value
27specExample =
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 ]
41jsonString :: Assertion
42jsonString =
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 ]
60uriFragment :: Assertion
61uriFragment =
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