|
| 1 | +module Test.Main where |
| 2 | + |
| 3 | +import Prelude hiding ((/)) |
| 4 | + |
| 5 | +import Data.Either (Either(..)) |
| 6 | +import Data.Generic.Rep (class Generic) |
| 7 | +import Data.Generic.Rep.Show (genericShow) |
| 8 | +import Data.String.Gen (genAlphaString) |
| 9 | +import Data.Symbol (SProxy(..)) |
| 10 | +import Effect (Effect) |
| 11 | +import Routing.Duplex (RouteDuplex', flag, int, param, parse, print, record, rest, root, segment, string, (:=)) |
| 12 | +import Routing.Duplex.Generic (noArgs) |
| 13 | +import Routing.Duplex.Generic as RDG |
| 14 | +import Routing.Duplex.Generic.Syntax ((/), (?)) |
| 15 | +import Test.QuickCheck (Result(..), arbitrary, quickCheckGen, (===)) |
| 16 | +import Test.QuickCheck.Gen (Gen, arrayOf, chooseInt) |
| 17 | + |
| 18 | +data TestRoute |
| 19 | + = Root |
| 20 | + | Foo String Int String { a :: String, b :: Boolean } |
| 21 | + | Bar { id :: String, search :: String } |
| 22 | + | Baz String (Array String) |
| 23 | + |
| 24 | +derive instance eqTestRoute :: Eq TestRoute |
| 25 | +derive instance genericTestRoute :: Generic TestRoute _ |
| 26 | +instance showTestRoute :: Show TestRoute where show = genericShow |
| 27 | + |
| 28 | +genTestRoute :: Gen TestRoute |
| 29 | +genTestRoute = do |
| 30 | + chooseInt 1 4 >>= case _ of |
| 31 | + 1 -> pure Root |
| 32 | + 2 -> |
| 33 | + Foo |
| 34 | + <$> genAlphaString |
| 35 | + <*> arbitrary |
| 36 | + <*> genAlphaString |
| 37 | + <*> ({ a: _, b: _ } <$> genAlphaString <*> arbitrary) |
| 38 | + 3 -> Bar <$> ({ id: _, search: _ } <$> genAlphaString <*> genAlphaString) |
| 39 | + _ -> Baz <$> genAlphaString <*> (arrayOf genAlphaString) |
| 40 | + |
| 41 | +_id = SProxy :: SProxy "id" |
| 42 | +_search = SProxy :: SProxy "search" |
| 43 | + |
| 44 | +route :: RouteDuplex' TestRoute |
| 45 | +route = |
| 46 | + root $ RDG.sum |
| 47 | + { "Root": noArgs |
| 48 | + , "Foo": fooRoute |
| 49 | + , "Bar": barRoute |
| 50 | + , "Baz": bazRoute |
| 51 | + } |
| 52 | + where |
| 53 | + fooRoute = |
| 54 | + segment / int segment / segment ? { a: string, b: flag } |
| 55 | + |
| 56 | + barRoute = |
| 57 | + record |
| 58 | + # _id := segment |
| 59 | + # _search := param "search" |
| 60 | + |
| 61 | + bazRoute = |
| 62 | + segment / rest |
| 63 | + |
| 64 | +main :: Effect Unit |
| 65 | +main = do |
| 66 | + quickCheckGen do |
| 67 | + r <- genTestRoute |
| 68 | + let |
| 69 | + url = print route r |
| 70 | + res = parse route url |
| 71 | + pure $ case res of |
| 72 | + Left err -> |
| 73 | + Failed $ |
| 74 | + show err <> ":" |
| 75 | + <> "\n " <> show r |
| 76 | + <> "\n " <> show url |
| 77 | + Right r' -> |
| 78 | + r === r' |
0 commit comments