packages feed

telescope-0.2.0: test/Test/Fits/ChecksumSpec.hs

module Test.Fits.ChecksumSpec where

import Data.ByteString qualified as BS
import Data.Word
import Skeletest
import Telescope.Fits
import Telescope.Fits.Checksum
import Telescope.Fits.Encoding
import Telescope.Fits.Types


spec :: Spec
spec = do
  describe "checksum" specChecksum
  describe "add1s" specOnesComplement


specChecksum :: Spec
specChecksum = do
  describe "checksum" $ do
    it "should calc zeros" $ do
      let inp = BS.pack (replicate 100 0)
      checksum inp `shouldBe` Checksum 0

    it "should calc max" $ do
      let inp = BS.pack (replicate 100 (maxBound :: Word8))
      checksum inp `shouldBe` Checksum (maxBound :: Word32)

    it "should be equal with trailing zeros" $ do
      checksum (BS.pack [1, 2, 3, 4, 5]) `shouldBe` checksum (BS.pack [1, 2, 3, 4, 5, 0, 0, 0, 0, 0])

    it "should not be equal with trailing spaces" $ do
      checksum "12345" `shouldNotBe` checksum "12345     "

  describe "datasum" $ do
    it "should calc same datasum as astro.py" $ do
      inp <- BS.readFile "./samples/ones10x10.fits"
      f :: Fits <- decode inp

      let datasumHeader = lookupKeyword "DATASUM" f.primaryHDU.header
          datasumCalc = checksum f.primaryHDU.dataArray.rawData
          datasumCalcHeader = Just $ checksumValue datasumCalc
      datasumCalcHeader `shouldBe` datasumHeader

  describe "encoding" $ do
    it "checksum of empty HDU should be (-0)" $ do
      let empty = PrimaryHDU (Header []) (DataArray BPInt8 (Axes []) "")
      let out = encodePrimaryHDU empty
      checksum out `shouldBe` Checksum maxBound

    it "checksum of sample HDU should be (-0)" $ do
      inp <- BS.readFile "./samples/ones10x10.fits"
      f <- decode inp
      let out = encodePrimaryHDU f.primaryHDU
      checksum out `shouldBe` Checksum maxBound


specOnesComplement :: Spec
specOnesComplement = do
  describe "add" $ do
    it "max + 0" $ do
      add1s maxBound 0 `shouldBe` maxBound

    it "max + 1" $ do
      add1s maxBound 1 `shouldBe` 1

    it "max + max" $ do
      add1s maxBound maxBound `shouldBe` maxBound