1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
module Numeric.Units.DimensionalSpec where
import Numeric.Units.Dimensional.Prelude
import Test.Hspec
import qualified Prelude as P
spec :: Spec
spec = do
describe "Exponentiation operators" $ do
it "correctly exponentiate quantities with integer exponents" $ do
((9::Double) *~ one) `shouldBe` (3 *~ one) ^ pos2
((1::Double) *~ one) `shouldBe` (12.1231 *~ one) ^ zero
((0.25::Double) *~ one) `shouldBe` (2 *~ one) ^ neg2
it "correctly exponentiate dimensionless quantities with floating point exponents" $ do
(3 P.** 2::Double) *~ one `shouldBe` (3 *~ one) ** (2 *~ one)
(3 P.** (-2.231)::Double) *~ one `shouldBe` (3 *~ one) ** ((-2.231) *~ one)
describe "Show instance" $ do
it "properly prints basic quantities" $ do
-- note: these comparison literals use non-breaking spaces
show ((1.0::Double) *~ one) `shouldBe` "1.0"
show ((2.0::Double) *~ meter) `shouldBe` "2.0 m"
show ((2.0::Double) *~ (meter / second)) `shouldBe` "2.0 m s^-1"
show ((2.0::Double) *~ (meter ^ pos2 / second ^ pos2)) `shouldBe` "2.0 m^2 s^-2"
describe "Ord instance" $ do
it "properly sorts quantities" $ do
compare ((1 :: Integer) *~ one) (3 *~ one) `shouldBe` LT
compare ((1 :: Double) *~ (kilo meter)) (1 *~ meter) `shouldBe` GT
compare ((0 :: Double) *~ second) (_0) `shouldBe` EQ
describe "Enumeration function nFromTo" $ do
it "handles zero intermediate values" $ do
nFromTo' _1 _6 0 `shouldBe` [_1, _6]
it "handles negative number of intermediate values" $ do
nFromTo' _1 _6 (-1) `shouldBe` [_1, _6]
it "handles straightforward cases" $ do
nFromTo' _1 _3 1 `shouldBe` [_1, _2, _3]
nFromTo' _1 _6 4 `shouldBe` [_1, _2, _3, _4, _5, _6]
nFromTo' _0 _6 2 `shouldBe` [_0, _2, _4, _6]
it "handles decreasing intervals" $ do
nFromTo' _5 _2 2 `shouldBe` [_5, _4, _3, _2]
nFromTo' _6 _0 2 `shouldBe` [_6, _4, _2, _0]
it "handles empty intervals" $ do
nFromTo' _1 _1 0 `shouldBe` [_1, _1]
nFromTo' _0 _0 2 `shouldBe` [_0, _0, _0, _0]
nFromTo' :: Dimensionless Double -> Dimensionless Double -> Int -> [Dimensionless Double]
nFromTo' = nFromTo
|