packages feed

units-2.1: Tests/OffSystemAdd.hs

{-# LANGUAGE TypeFamilies, NoMonomorphismRestriction #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}

module Tests.OffSystemAdd where

import Data.Metrology.Poly
import Data.Metrology.SI
import qualified Data.Metrology.SI.Dims as D

import Test.Tasty
import Test.Tasty.HUnit
import Test.HUnit.Approx

data Foot = Foot
instance Unit Foot where
  type BaseUnit Foot = Meter
  conversionRatio _ = 0.3048

data Year = Year
instance Unit Year where
  type BaseUnit Year = Second
  conversionRatio _ = 60 * 60 * 24 * 365.242

vel1 :: Velocity
vel1 = 1e6 % (Foot :/ Year)

vel2 :: Velocity
vel2 = 0.01 % (Meter :/ Second)


vel1InMS :: Double
vel1InMS = vel1 # (Meter :/ Second)

vel2InMS :: Double
vel2InMS = vel2 # (Meter :/ Second)

vel12InMS :: Double
vel12InMS = (vel1 |+| vel2) # (Meter :/ Second)


len1 :: Length
len1 = 3 % Foot

len2 :: Length
len2 = 1 % Meter

len12InM :: Double
len12InM = (len1 |+| len2) # Meter

type instance DefaultUnitOfDim D.Length = Meter

-- The following expression does typecheck,
-- because the system is now able to work in defaultLCSU mode
-- that only requires relative relation between units.
len12InM' :: Double
len12InM' = (defaultLCSU $ (1 % Meter) |+| (3 % Foot)) # Meter

tests = testGroup "OffSystemAdd"
  [ testCase "vel1inMS" (vel1InMS @?~ 0.00965873546)
  , testCase "vel2inMS" (vel2InMS @?~ 0.01)
  , testCase "vel12inMS" (vel12InMS @?~ 0.01965873)
  , testCase "len12InM" (len12InM @?~ 1.9144) ]