packages feed

postgresql-types-0.1: src/unit-tests/PostgresqlTypes/Float4Spec.hs

module PostgresqlTypes.Float4Spec (spec) where

import Data.Data (Proxy (Proxy))
import qualified PostgresqlTypes.Float4 as Float4
import Test.Hspec
import Test.QuickCheck
import qualified UnitTests.Scripts as Scripts
import Prelude

spec :: Spec
spec = do
  describe "Show/Read laws" do
    Scripts.testShowRead (Proxy @Float4.Float4)

  describe "IsScalar laws" do
    Scripts.testIsScalar (Proxy @Float4.Float4)

  describe "Constructors" do
    describe "fromFloat" do
      it "creates Float4 from positive Float" do
        let pgFloat = Float4.fromFloat 3.14
        Float4.toFloat pgFloat `shouldBe` 3.14

      it "creates Float4 from negative Float" do
        let pgFloat = Float4.fromFloat (-3.14)
        Float4.toFloat pgFloat `shouldBe` (-3.14)

      it "creates Float4 from zero" do
        let pgFloat = Float4.fromFloat 0
        Float4.toFloat pgFloat `shouldBe` 0

  describe "Accessors" do
    describe "toFloat" do
      it "extracts Float value" do
        let pgFloat = Float4.fromFloat 1.5
        Float4.toFloat pgFloat `shouldBe` 1.5

  describe "Property Tests" do
    it "roundtrips through toFloat and fromFloat" do
      property \(f :: Float) ->
        let pgFloat = Float4.fromFloat f
         in Float4.toFloat pgFloat === f

    it "roundtrips through fromFloat and toFloat" do
      property \(pgFloat :: Float4.Float4) ->
        let f = Float4.toFloat pgFloat
            pgFloat' = Float4.fromFloat f
         in pgFloat' === pgFloat