packages feed

domain-aeson-0.1.1: hspec-test/Main.hs

module Main where

import Domain
import DomainAeson
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck.Arbitrary.Generic
import Test.QuickCheck.Classes
import Test.QuickCheck.Instances
import Prelude

declare
  Nothing
  (eqDeriver <> showDeriver <> genericDeriver <> toJsonDeriver <> fromJsonDeriver)
  [schema|

    ServiceAddress:
      sum:
        network: NetworkAddress
        local: FilePath

    NetworkAddress:
      product:
        protocol: TransportProtocol
        host: Host
        port: Word16

    TransportProtocol:
      enum:
        - tcp
        - udp

    Host:
      sum:
        ip: Ip
        name: Text

    Ip:
      sum:
        v4: Word32
        v6: Word128

    Word128:
      product:
        part1: Word64
        part2: Word64

    |]

deriving via (GenericArbitrary ServiceAddress) instance Arbitrary ServiceAddress

deriving via (GenericArbitrary NetworkAddress) instance Arbitrary NetworkAddress

deriving via (GenericArbitrary TransportProtocol) instance Arbitrary TransportProtocol

deriving via (GenericArbitrary Host) instance Arbitrary Host

deriving via (GenericArbitrary Ip) instance Arbitrary Ip

deriving via (GenericArbitrary Word128) instance Arbitrary Word128

main :: IO ()
main =
  hspec $ do
    lawsSpec $ jsonLaws (Proxy @ServiceAddress)
    lawsSpec $ jsonLaws (Proxy @NetworkAddress)
    lawsSpec $ jsonLaws (Proxy @TransportProtocol)
    lawsSpec $ jsonLaws (Proxy @Host)
    lawsSpec $ jsonLaws (Proxy @Ip)
    lawsSpec $ jsonLaws (Proxy @Word128)

lawsSpec :: Laws -> Spec
lawsSpec (Laws name properties) =
  describe name $ for_ properties $ \(lawName, property) ->
    prop lawName property