{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wno-orphans #-}
-- | Tests for the polytropos-microlens satellite. The plugin solves the
-- FieldIndex and RowEq/RowShow constraints below as literals; the @each@
-- tests exercise the homogeneity-gated traversal.
module Main (main) where
import Test.Tasty
import Test.Tasty.HUnit
import Lens.Micro ((&), (.~), (^.), (^..), (%~), each)
import Polytropos
import Polytropos.Microlens
type MyRec = Record '["x" ':= Int, "y" ':= Int, "z" ':= Int]
myRec :: MyRec
myRec = REC { x = 1, y = 2, z = 3 }
main :: IO ()
main = defaultMain $ testGroup "Microlens Integration"
[ testGroup "each"
[ testCase "modifies all fields" $
(myRec & each %~ (+ (1 :: Int)))
@?= (insertField (Field @"x") (2 :: Int)
$ insertField (Field @"y") (3 :: Int)
$ insertField (Field @"z") (4 :: Int)
$ emptyRecord)
, testCase "views all fields" $ do
(myRec ^.. each) @?= [1 :: Int, 2, 3]
]
, testGroup "fieldLens"
[ testCase "views by field name" $ do
(myRec ^. fieldLens #x) @?= (1 :: Int)
(myRec ^. fieldLens #y) @?= (2 :: Int)
(myRec ^. fieldLens #z) @?= (3 :: Int)
, testCase "sets by field name" $ do
let r' = myRec & fieldLens #z .~ (9 :: Int)
(r' ^. fieldLens #z) @?= (9 :: Int)
(r' ^. fieldLens #x) @?= (1 :: Int)
, testCase "modifies by field name" $ do
let r' = myRec & fieldLens #y %~ (* (10 :: Int))
(r' ^. fieldLens #y) @?= (20 :: Int)
]
]