packages feed

yamlet-1.0.0.0: tests/Yamlet/Test/Inspection.hs

{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fplugin=Test.Inspection.Plugin -dsuppress-all #-}

-- | The derived instances contain no generic representation.
--
-- The module exports every binding, because GHC 9.14 removes an unused
-- binding before the plugin checks it.
module Yamlet.Test.Inspection where

import Data.Text qualified as T
import Test.Inspection
import Test.Tasty
import Test.Tasty.HUnit

import Yamlet
import Yamlet.Test.Inspection.Obligations

-- Each type has a test for each method, which checks both obligations. The
-- encoders of Step keep the representation with every GHC, and those of
-- Shape with GHC before 9.12, which 'assertFailureIf' expects. The encoders
-- of lists and fields keep it because they call the encoder of the type. The
-- optimizer moves the node of the constructor without fields, Halt or Dot, to
-- the top level. Then the code of the last constructors is in a function with
-- two callers, which takes their representation.
inspectionTests :: TestTree
inspectionTests =
  testGroup
    "inspection"
    [ testGroup
        "Server"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeServer)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeServer)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeServer)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeServer)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeServerList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeServerList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeServerList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeServerList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeServerField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeServerField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeServerField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeServerField)
        ]
    , testGroup
        "Wide"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeWide)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeWide)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeWide)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeWide)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeWideList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeWideList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeWideList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeWideList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeWideField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeWideField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeWideField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeWideField)
        ]
    , testGroup
        "Name"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeName)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeName)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeName)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeName)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeNameList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeNameList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeNameList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeNameList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeNameField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeNameField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeNameField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeNameField)
        ]
    , testGroup
        "Box"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeBox)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeBox)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeBox)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeBox)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeBoxList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeBoxList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeBoxList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeBoxList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeBoxField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeBoxField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeBoxField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeBoxField)
        ]
    , testGroup
        "Velocity"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeVelocity)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeVelocity)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeVelocity)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeVelocity)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeVelocityList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeVelocityList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeVelocityList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeVelocityList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeVelocityField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeVelocityField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeVelocityField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeVelocityField)
        ]
    , testGroup
        "Distance"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeDistance)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeDistance)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeDistance)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeDistance)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeDistanceList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeDistanceList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeDistanceList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeDistanceList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeDistanceField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeDistanceField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeDistanceField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeDistanceField)
        ]
    , testGroup
        "Speed"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeSpeed)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeSpeed)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeSpeed)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeSpeed)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeSpeedList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeSpeedList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeSpeedList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeSpeedList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeSpeedField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeSpeedField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeSpeedField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeSpeedField)
        ]
    , testGroup
        "Config"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeConfig)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeConfig)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeConfig)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeConfig)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeConfigList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeConfigList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeConfigList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeConfigList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeConfigField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeConfigField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeConfigField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeConfigField)
        ]
    , testGroup
        "Preset"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodePreset)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodePreset)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodePreset)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodePreset)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodePresetList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodePresetList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodePresetList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodePresetList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodePresetField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodePresetField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodePresetField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodePresetField)
        ]
    , testGroup
        "Turn"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeTurn)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeTurn)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeTurn)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeTurn)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeTurnList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeTurnList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeTurnList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeTurnList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeTurnField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeTurnField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeTurnField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeTurnField)
        ]
    , testGroup
        "Shape"
        [ testCase "encode" $ do
            assertFailureIf
              (ghcVersion < (9, 12))
              $(inspectTest $ hasNoGenericRep 'encodeShape)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeShape)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeShape)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeShape)
        , testCase "encode a list" $ do
            assertFailureIf
              (ghcVersion < (9, 12))
              $(inspectTest $ hasNoGenericRep 'encodeShapeList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeShapeList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeShapeList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeShapeList)
        , testCase "encode a field" $ do
            assertFailureIf
              (ghcVersion < (9, 12))
              $(inspectTest $ hasNoGenericRep 'encodeShapeField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeShapeField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeShapeField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeShapeField)
        ]
    , testGroup
        "Step"
        [ testCase "encode" $ do
            assertFailureIf True $(inspectTest $ hasNoGenericRep 'encodeStep)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeStep)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeStep)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeStep)
        , testCase "encode a list" $ do
            assertFailureIf True $(inspectTest $ hasNoGenericRep 'encodeStepList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeStepList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeStepList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeStepList)
        , testCase "encode a field" $ do
            assertFailureIf True $(inspectTest $ hasNoGenericRep 'encodeStepField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeStepField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeStepField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeStepField)
        ]
    , testGroup
        "Figure"
        [ testCase "encode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeFigure)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeFigure)
        , testCase "decode" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeFigure)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeFigure)
        , testCase "encode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeFigureList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeFigureList)
        , testCase "decode a list" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeFigureList)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeFigureList)
        , testCase "encode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'encodeFigureField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'encodeFigureField)
        , testCase "decode a field" $ do
            assertSuccess $(inspectTest $ hasNoGenericRep 'decodeFigureField)
            assertSuccess $(inspectTest $ hasNoGenericDictionaries 'decodeFigureField)
        ]
    ]

----------------------------------------
-- Products

data Server = Server {host :: T.Text, port :: Int, tags :: Maybe [T.Text]}
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Server

data Wide = Wide
  { i00 :: Int
  , i01 :: Int
  , i02 :: Int
  , i03 :: Int
  , i04 :: Int
  , i05 :: Int
  , i06 :: Int
  , i07 :: Int
  , i08 :: Int
  , i09 :: Int
  , i10 :: Int
  , i11 :: Int
  , i12 :: Int
  , i13 :: Int
  , i14 :: Int
  , i15 :: Int
  , i16 :: Int
  , i17 :: Int
  , i18 :: Int
  , i19 :: Int
  , i20 :: Int
  , i21 :: Int
  , i22 :: Int
  , i23 :: Int
  , i24 :: Int
  , i25 :: Int
  , i26 :: Int
  , i27 :: Int
  , i28 :: Int
  , i29 :: Int
  , i30 :: Int
  , i31 :: Int
  , i32 :: Int
  , i33 :: Int
  , t00 :: T.Text
  , t01 :: T.Text
  , t02 :: T.Text
  , t03 :: T.Text
  , t04 :: T.Text
  , t05 :: T.Text
  , t06 :: T.Text
  , t07 :: T.Text
  , t08 :: T.Text
  , t09 :: T.Text
  , t10 :: T.Text
  , t11 :: T.Text
  , t12 :: T.Text
  , t13 :: T.Text
  , t14 :: T.Text
  , t15 :: T.Text
  , t16 :: T.Text
  , t17 :: T.Text
  , t18 :: T.Text
  , t19 :: T.Text
  , t20 :: T.Text
  , t21 :: T.Text
  , t22 :: T.Text
  , t23 :: T.Text
  , t24 :: T.Text
  , t25 :: T.Text
  , t26 :: T.Text
  , t27 :: T.Text
  , t28 :: T.Text
  , t29 :: T.Text
  , t30 :: T.Text
  , t31 :: T.Text
  , t32 :: T.Text
  , m00 :: Maybe Int
  , m01 :: Maybe Int
  , m02 :: Maybe Int
  , m03 :: Maybe Int
  , m04 :: Maybe Int
  , m05 :: Maybe Int
  , m06 :: Maybe Int
  , m07 :: Maybe Int
  , m08 :: Maybe Int
  , m09 :: Maybe Int
  , m10 :: Maybe Int
  , m11 :: Maybe Int
  , m12 :: Maybe Int
  , m13 :: Maybe Int
  , m14 :: Maybe Int
  , m15 :: Maybe Int
  , m16 :: Maybe Int
  , m17 :: Maybe Int
  , m18 :: Maybe Int
  , m19 :: Maybe Int
  , m20 :: Maybe Int
  , m21 :: Maybe Int
  , m22 :: Maybe Int
  , m23 :: Maybe Int
  , m24 :: Maybe Int
  , m25 :: Maybe Int
  , m26 :: Maybe Int
  , m27 :: Maybe Int
  , m28 :: Maybe Int
  , m29 :: Maybe Int
  , m30 :: Maybe Int
  , m31 :: Maybe Int
  , m32 :: Maybe Int
  }
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Wide

newtype Name = Name T.Text
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Name

newtype Box a = Box {item :: a}
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml (Box a)

newtype Velocity = Velocity Speed
  deriving stock (Generic)
  deriving (FromYaml, ToYaml) via GenericYaml Velocity

instance GenericYamlOptions Velocity where
  type SumEncoding Velocity = TaggedFlat
  yamlOptions = defaultYamlOptions {tagSingleConstructors = True}

newtype Distance = Distance {distance :: Maybe Int}
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Distance

newtype Speed = Speed {speed :: Int}
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Speed

data Config = Config {paths :: [T.Text], jobs :: Int, verbose :: Maybe Bool}
  deriving stock (Generic)
  deriving (FromYaml, ToYaml) via GenericYaml Config

-- The option is on, so that the check of the encoder covers the default too.
-- The encoder uses the default only with 'omitNullFields', to decide if it
-- can leave out a null field.
instance GenericYamlOptions Config where
  yamlOptions = defaultYamlOptions {omitNullFields = True}
  yamlDefault = Just Config {paths = ["."], jobs = 1, verbose = Nothing}

-- Without 'omitNullFields', the encoder does not use the default.
data Preset = Preset {paths :: [T.Text], jobs :: Int, verbose :: Maybe Bool}
  deriving stock (Generic)
  deriving (FromYaml, ToYaml) via GenericYaml Preset

instance GenericYamlOptions Preset where
  yamlDefault = Just Preset {paths = ["."], jobs = 1, verbose = Nothing}

----------------------------------------
-- Sums

data Turn = TurnLeft | TurnRight | TurnBack
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Turn

data Shape = Circle {radius :: Double} | Dot | Square {side :: Double, angle :: Double}
  deriving stock (Generic)
  deriving anyclass (GenericYamlOptions)
  deriving (FromYaml, ToYaml) via GenericYaml Shape

data Step = Ahead Distance | Accelerate Speed | Halt
  deriving stock (Generic)
  deriving (FromYaml, ToYaml) via GenericYaml Step

instance GenericYamlOptions Step where
  type SumEncoding Step = TaggedFlat
  yamlOptions = defaultYamlOptions {tagKey = "step"}

data Figure = Round {radius :: Double} | Named T.Text | Point
  deriving stock (Generic)
  deriving (FromYaml, ToYaml) via GenericYaml Figure

instance GenericYamlOptions Figure where
  type SumEncoding Figure = SingleField

----------------------------------------
-- Functions under test

encodeServer :: Server -> Node
encodeServer = toYaml

decodeServer :: Node -> Parser Server
decodeServer = parseYaml

encodeServerList :: [Server] -> Node
encodeServerList = toYamlList

decodeServerList :: Node -> Parser [Server]
decodeServerList = parseYamlList

encodeServerField :: Node -> Server -> (Node, Node)
encodeServerField = toYamlField

decodeServerField :: Node -> Node -> Parser Server
decodeServerField = parseYamlField

encodeWide :: Wide -> Node
encodeWide = toYaml

decodeWide :: Node -> Parser Wide
decodeWide = parseYaml

encodeWideList :: [Wide] -> Node
encodeWideList = toYamlList

decodeWideList :: Node -> Parser [Wide]
decodeWideList = parseYamlList

encodeWideField :: Node -> Wide -> (Node, Node)
encodeWideField = toYamlField

decodeWideField :: Node -> Node -> Parser Wide
decodeWideField = parseYamlField

encodeName :: Name -> Node
encodeName = toYaml

decodeName :: Node -> Parser Name
decodeName = parseYaml

encodeNameList :: [Name] -> Node
encodeNameList = toYamlList

decodeNameList :: Node -> Parser [Name]
decodeNameList = parseYamlList

encodeNameField :: Node -> Name -> (Node, Node)
encodeNameField = toYamlField

decodeNameField :: Node -> Node -> Parser Name
decodeNameField = parseYamlField

encodeBox :: Box Int -> Node
encodeBox = toYaml

decodeBox :: Node -> Parser (Box Int)
decodeBox = parseYaml

encodeBoxList :: [Box Int] -> Node
encodeBoxList = toYamlList

decodeBoxList :: Node -> Parser [Box Int]
decodeBoxList = parseYamlList

encodeBoxField :: Node -> Box Int -> (Node, Node)
encodeBoxField = toYamlField

decodeBoxField :: Node -> Node -> Parser (Box Int)
decodeBoxField = parseYamlField

encodeVelocity :: Velocity -> Node
encodeVelocity = toYaml

decodeVelocity :: Node -> Parser Velocity
decodeVelocity = parseYaml

encodeVelocityList :: [Velocity] -> Node
encodeVelocityList = toYamlList

decodeVelocityList :: Node -> Parser [Velocity]
decodeVelocityList = parseYamlList

encodeVelocityField :: Node -> Velocity -> (Node, Node)
encodeVelocityField = toYamlField

decodeVelocityField :: Node -> Node -> Parser Velocity
decodeVelocityField = parseYamlField

encodeDistance :: Distance -> Node
encodeDistance = toYaml

decodeDistance :: Node -> Parser Distance
decodeDistance = parseYaml

encodeDistanceList :: [Distance] -> Node
encodeDistanceList = toYamlList

decodeDistanceList :: Node -> Parser [Distance]
decodeDistanceList = parseYamlList

encodeDistanceField :: Node -> Distance -> (Node, Node)
encodeDistanceField = toYamlField

decodeDistanceField :: Node -> Node -> Parser Distance
decodeDistanceField = parseYamlField

encodeSpeed :: Speed -> Node
encodeSpeed = toYaml

decodeSpeed :: Node -> Parser Speed
decodeSpeed = parseYaml

encodeSpeedList :: [Speed] -> Node
encodeSpeedList = toYamlList

decodeSpeedList :: Node -> Parser [Speed]
decodeSpeedList = parseYamlList

encodeSpeedField :: Node -> Speed -> (Node, Node)
encodeSpeedField = toYamlField

decodeSpeedField :: Node -> Node -> Parser Speed
decodeSpeedField = parseYamlField

encodeConfig :: Config -> Node
encodeConfig = toYaml

decodeConfig :: Node -> Parser Config
decodeConfig = parseYaml

encodeConfigList :: [Config] -> Node
encodeConfigList = toYamlList

decodeConfigList :: Node -> Parser [Config]
decodeConfigList = parseYamlList

encodeConfigField :: Node -> Config -> (Node, Node)
encodeConfigField = toYamlField

decodeConfigField :: Node -> Node -> Parser Config
decodeConfigField = parseYamlField

encodePreset :: Preset -> Node
encodePreset = toYaml

decodePreset :: Node -> Parser Preset
decodePreset = parseYaml

encodePresetList :: [Preset] -> Node
encodePresetList = toYamlList

decodePresetList :: Node -> Parser [Preset]
decodePresetList = parseYamlList

encodePresetField :: Node -> Preset -> (Node, Node)
encodePresetField = toYamlField

decodePresetField :: Node -> Node -> Parser Preset
decodePresetField = parseYamlField

encodeTurn :: Turn -> Node
encodeTurn = toYaml

decodeTurn :: Node -> Parser Turn
decodeTurn = parseYaml

encodeTurnList :: [Turn] -> Node
encodeTurnList = toYamlList

decodeTurnList :: Node -> Parser [Turn]
decodeTurnList = parseYamlList

encodeTurnField :: Node -> Turn -> (Node, Node)
encodeTurnField = toYamlField

decodeTurnField :: Node -> Node -> Parser Turn
decodeTurnField = parseYamlField

encodeShape :: Shape -> Node
encodeShape = toYaml

decodeShape :: Node -> Parser Shape
decodeShape = parseYaml

encodeShapeList :: [Shape] -> Node
encodeShapeList = toYamlList

decodeShapeList :: Node -> Parser [Shape]
decodeShapeList = parseYamlList

encodeShapeField :: Node -> Shape -> (Node, Node)
encodeShapeField = toYamlField

decodeShapeField :: Node -> Node -> Parser Shape
decodeShapeField = parseYamlField

encodeStep :: Step -> Node
encodeStep = toYaml

decodeStep :: Node -> Parser Step
decodeStep = parseYaml

encodeStepList :: [Step] -> Node
encodeStepList = toYamlList

decodeStepList :: Node -> Parser [Step]
decodeStepList = parseYamlList

encodeStepField :: Node -> Step -> (Node, Node)
encodeStepField = toYamlField

decodeStepField :: Node -> Node -> Parser Step
decodeStepField = parseYamlField

encodeFigure :: Figure -> Node
encodeFigure = toYaml

decodeFigure :: Node -> Parser Figure
decodeFigure = parseYaml

encodeFigureList :: [Figure] -> Node
encodeFigureList = toYamlList

decodeFigureList :: Node -> Parser [Figure]
decodeFigureList = parseYamlList

encodeFigureField :: Node -> Figure -> (Node, Node)
encodeFigureField = toYamlField

decodeFigureField :: Node -> Node -> Parser Figure
decodeFigureField = parseYamlField