packages feed

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

module PostgresqlTypes.Float8Spec (spec) where

import Data.Data (Proxy (Proxy))
import qualified PostgresqlTypes.Float8 as Float8
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 @Float8.Float8)

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

  describe "Constructors" do
    describe "fromDouble" do
      it "creates Float8 from positive Double" do
        let pgFloat = Float8.fromDouble 3.14159265358979
        Float8.toDouble pgFloat `shouldBe` 3.14159265358979

      it "creates Float8 from negative Double" do
        let pgFloat = Float8.fromDouble (-3.14159265358979)
        Float8.toDouble pgFloat `shouldBe` (-3.14159265358979)

      it "creates Float8 from zero" do
        let pgFloat = Float8.fromDouble 0
        Float8.toDouble pgFloat `shouldBe` 0

  describe "Accessors" do
    describe "toDouble" do
      it "extracts Double value" do
        let pgFloat = Float8.fromDouble 1.5
        Float8.toDouble pgFloat `shouldBe` 1.5

  describe "Property Tests" do
    it "roundtrips through toDouble and fromDouble" do
      property \(d :: Double) ->
        let pgFloat = Float8.fromDouble d
         in Float8.toDouble pgFloat === d

    it "roundtrips through fromDouble and toDouble" do
      property \(pgFloat :: Float8.Float8) ->
        let d = Float8.toDouble pgFloat
            pgFloat' = Float8.fromDouble d
         in pgFloat' === pgFloat