packages feed

proto3-suite-0.5.0: tests/Test/Proto/Generate/Name.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TypeApplications #-}

-- |
--
module Test.Proto.Generate.Name (tests) where

import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Hedgehog (testProperty)

import Hedgehog (MonadTest, Property, annotate, forAll, property, (===))
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range

import Test.Proto.Generate.Name.Gen (GenName)
import Test.Proto.Generate.Name.Gen qualified as Name.Gen

import Proto3.Suite.DotProto.Generate

-- -----------------------------------------------------------------------------

tests :: TestTree
tests =
  testGroup
    "Test.Proto.Generate.Name"
    [ testProperty "filenames" resolve'protofile
    ]

-- | Testing combinator for name resolution functions.
testResolution ::
  (MonadTest m, Applicative f, Eq (f String), Show (f String)) =>
  (String -> f String) -> GenName -> m ()
testResolution resolve nm = do
  let occ = Name.Gen.nameOcc nm
  let res = Name.Gen.nameRes nm
  let got = resolve occ

  annotate ("protobuf name: " ++ occ)
  annotate ("expected name: " ++ res)
  annotate ("resolved name: " ++ show got)

  pure res === got

-- -----------------------------------------------------------------------------
--
-- Name Resolution Tests
--

resolve'protofile :: Property
resolve'protofile = property do
  nm <- forAll $ Gen.sized (Name.Gen.protofile . Range.linear 1 . fromIntegral)
  testResolution (renameProtoFile @(Either CompileError)) nm