ron-hs-0.4.0: test/DerivingVia.hs
{-# LANGUAGE DeriveGeneric, DerivingVia, DataKinds #-}
{-# LANGUAGE OverloadedLists #-}
module DerivingVia
( derivingViaTests
) where
import Data.Ron.Class (ToRon (..), FromRon (..), RonSettings (..))
import Data.Ron.Value (Value (..))
import GHC.Generics (Generic)
import Test.Tasty.HUnit (testCase, (@?=))
import Test.Tasty (testGroup)
import Data.Ron.Class.Deriving
data Record1 = Record1
{ _rField :: Int
, _rOtherField :: Maybe Int
}
deriving (Eq, Show, Generic)
deriving (ToRon, FromRon) via RonWith
'[ FieldsDropPrefix
, FieldsToSnakeCase
, ConvertWith ImplicitSome
] Record1
record1 = Record1 1 (Just 2)
record1ron = Record "Record1"
[ ("field", Integral 1)
, ("other_field", Integral 2)
]
data AppendA
data AppendB
instance ReflectSettingsOptions AppendA where
reflectS _ s@RonSettings {fieldModifier} = s
{ fieldModifier = (<> "aaa") . fieldModifier }
instance ReflectSettingsOptions AppendB where
reflectS _ s@RonSettings {fieldModifier} = s
{ fieldModifier = (<> "bbb") . fieldModifier }
newtype Record2 = Record2
{ field' :: Int
}
deriving (Eq, Show, Generic)
deriving (ToRon, FromRon) via RonWith
'[ AppendA
, AppendB
] Record2
record2 = Record2 1337
record2ron = Record "Record2" [ ("field'aaabbb", Integral 1337) ]
derivingViaTests = testGroup "deriving via"
[ testGroup "inbuilt field modifiers are correct"
[ testCase "encode" $
toRon record1 @?= record1ron
, testCase "decode" $
fromRon record1ron @?= Right record1
]
, testGroup "options apply left to right"
[ testCase "encode" $
toRon record2 @?= record2ron
, testCase "decode" $
fromRon record2ron @?= Right record2
]
]