packages feed

libasterix-0.14.0: test/TestCoding.hs

{-# LANGUAGE DataKinds #-}

-- | Unsorted Coding tests

module TestCoding (tests) where

import           Data.Word

import           Test.Tasty
import           Test.Tasty.HUnit

import           Asterix.Coding
import           Common
import           Generated        as Gen

type Cat0_1_0 = Gen.Cat_000_1_0
type Cat1_1_0 = Gen.Cat_001_1_0

tests :: TestTree
tests = testGroup "Coding"
    [ testCase "create" testCreate
    ]

mkSac :: Word8 -> NonSpare (Cat0_1_0 ~> "010" ~> "SAC")
mkSac = fromIntegral

mkSic :: Word8 -> NonSpare (Cat0_1_0 ~> "010" ~> "SIC")
mkSic = fromIntegral

toItem :: NonSpare t -> Item ('GItem  t)
toItem = Item . UItem . unNonSpare

mkSacSic :: Word8 -> Word8 -> NonSpare (Cat0_1_0 ~> "010")
mkSacSic a b = group
    ( item @"SAC" (toItem $ mkSac a)
   *: item @"SIC" (toItem $ mkSic b)
   *: nil)

testCreate :: Assertion
testCreate = do
    checkBits "i000" (0xa5 :: NonSpare (Cat0_1_0 ~> "000")) (Bin "10100101")
    checkBits "i010" (0x0102 :: NonSpare (Cat0_1_0 ~> "010")) (Hex "0102")
    checkBits "mkSacSic" (mkSacSic 0x03 0x04) (Hex "0304")
    do
        let nsp :: NonSpare (Cat0_1_0 ~> "010")
            nsp = group
                ( item @"SAC" 0x01
               *: item @"SIC" 0x02
               *: nil)
        checkBits "i010b" nsp (Hex "0102")
    do
        let nsp :: NonSpare (Cat0_1_0 ~> "010")
            nsp = group
                ( item 0x01
               *: 0x02
               *: nil)
        checkBits "i010c" nsp (Hex "0102")

    do
        let nsp1 :: NonSpare (Cat0_1_0 ~> "040")
            nsp1 = group
                ( item @"I1" 0x7f
               *: spare
               *: item @"I2" 0x3f
               *: abuseSpare 0x12
               *: nil)
            nsp2 :: NonSpare (Cat0_1_0 ~> "040")
            nsp2 = group
                ( item @"I1" 0x7f
               *: spare
               *: item @"I2" 0x3f
               *: 0x12
               *: nil)
            result = Bin "11111110 01111110 00010010"
        checkBits "i040a" nsp1 result
        checkBits "i040b" nsp2 result

    do
        let db :: Datablock (DatablockOf Cat0_1_0)
            db = datablock nil
        checkBits "empty db" db (Hex "000003")

    do
        let
            sacsic :: NonSpare (Cat0_1_0 ~> "010")
            sacsic = group
                        ( item @"SAC" 0x02
                       *: item @"SIC" 0x03
                       *: nil )
            db :: Datablock (DatablockOf Cat0_1_0)
            db = datablock
                ( record
                    ( item @"000" 0x01
                   *: item @"010" sacsic
                   *: nil )
               *: nil )
        checkBits "simple db" db (Hex "000007c0020301")

    do
        let
            r :: Record (RecordOf Cat0_1_0)
            r = record (item @"000" 0x01 *: nil)
            db :: Datablock (DatablockOf Cat0_1_0)
            db = datablock (r *: r *: nil)
        checkBits "2 records" db (Hex "00000740014001")

    do
        let
            r1 :: Record (RecordOfUap Cat1_1_0 "plot")
            r1 = record (item @"010" 0x0102 *: nil)

            r2 :: Record (RecordOfUap Cat1_1_0 "track")
            r2 = record (item @"010" 0x0102 *: nil)

            db :: Datablock (DatablockOf Cat1_1_0)
            db = datablock (r1 *: r2 *: nil)
        checkBits "multi uap" db (Hex "010009800102800102")