packages feed

labsat-0.0.0: test/Test/Labsat/Parser.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Test.Labsat.Parser
  ( tests
  ) where

import Data.Attoparsec.ByteString
import Data.ByteString
import Labsat.Parser
import Labsat.Types
import Preamble
import Test.Tasty
import Test.Tasty.HUnit

parser :: (Eq a, Show a) => Parser a -> ByteString -> Either String a -> Assertion
parser p s r = parseOnly p s @?= r

--------------------------------------------------------------------------------
-- HELP Parsers
--------------------------------------------------------------------------------
helpOutput :: ByteString
helpOutput = "Current commands are : \r\r\n\r\r\nHELP\r\r\nTYPE\r\r\nFIND\r\r\nMON\r\r\nPLAY\r\r\nREC\r\r\nATTN\r\r\nCONF\r\r\nMEDIA\r\r\nMUTE\r\r\n\r\r\n\r\r\nLABSAT_V3 >"

helpResult :: HelpCommands
helpResult = HelpCommands ["HELP","TYPE","FIND","MON","PLAY","REC","ATTN","CONF","MEDIA","MUTE"]

testHelp :: TestTree
testHelp =
  testGroup "Test help parser"
    [ testCase "Help without colors" $ parser parseHelp helpOutput $ Right helpResult
    ]

--------------------------------------------------------------------------------
-- MEDIA Parsers
--------------------------------------------------------------------------------
mediaListOutput :: ByteString
mediaListOutput = "ABC \ESC[40G 00:00:00\r\r\nASDF\r\r\nFile_001 \ESC[40G 00:05:40\r\r\nFile_002 \ESC[40G 00:21:17\r\r\nLabSat 3 Wideband Demo SSD files\r\r\n\r\r\nLABSAT_V3 >"

mediaListResult :: MediaList
mediaListResult = MediaList [File "ABC" "00:00:00",Dir "ASDF",File "File_001" "00:05:40",File "File_002" "00:21:17",Dir "LabSat 3 Wideband Demo SSD files"]

testMedia :: TestTree
testMedia =
  testGroup "Test media parsers"
    [ testCase "Media list" $ parser parseMediaList mediaListOutput $ Right mediaListResult
    ]

--------------------------------------------------------------------------------
-- PLAY Parsers
--------------------------------------------------------------------------------
playFileOutput :: ByteString
playFileOutput = "File_001\r\r\n\r\r\nLABSAT_V3 >"

statusPlayingOutput :: ByteString
statusPlayingOutput = "PLAY:/mnt/sata/File_001:DUR:00:00:20\r\r\n\r\r\nLABSAT_V3 >"

statusPlayingResult :: PlayStatus
statusPlayingResult = Playing "File_001" "00:00:20"

statusIdleOutput :: ByteString
statusIdleOutput = "PLAY:IDLE\r\r\n\r\r\nLABSAT_V3 >"

testPlay :: TestTree
testPlay =
  testGroup "Test play parsers"
    [ testCase "Play file" $ parser (parsePlay "File_001") playFileOutput $ Right "File_001"
    , testCase "Status playing" $ parser parsePlayStatus statusPlayingOutput $ Right statusPlayingResult
    , testCase "Status idle" $ parser parsePlayStatus statusIdleOutput $ Right PlayIdle
    ]

--------------------------------------------------------------------------------
-- REC Parsers
--------------------------------------------------------------------------------
statusRecordingOutput :: ByteString
statusRecordingOutput = "REC:/mnt/sata/File_004:DUR:00:00:08\r\r\n\r\r\nLABSAT_V3 >"

statusRecordingResult :: RecordStatus
statusRecordingResult = Recording "File_004" "00:00:08"

statusRecordIdleOutput :: ByteString
statusRecordIdleOutput = "REC:IDLE\r\r\n\r\r\nLABSAT_V3 >"

testRecord :: TestTree
testRecord =
  testGroup "Test record parsers"
    [ testCase "Recordfile" $ parser parseRec playFileOutput $ Right "File_001"
    , testCase "Status playing" $ parser parseRecordStatus statusRecordingOutput $ Right statusRecordingResult
    , testCase "Status idle" $ parser parseRecordStatus statusRecordIdleOutput $ Right RecordIdle
    ]

--------------------------------------------------------------------------------
-- TYPE Parser
--------------------------------------------------------------------------------
typeOutput :: ByteString
typeOutput = "Labsat Wideband\r\nSerial 57082 \r\nFirmware 1.0.260\r\nFPGA 33\r\nIP 10.1.22.44\r\nBattery not connected\r\nTCXO-0x7b7f\r\n\r\r\n\r\r\nLABSAT_V3 >"

typeResult :: Info
typeResult = Info ["Labsat Wideband","Serial 57082 ","Firmware 1.0.260","FPGA 33","IP 10.1.22.44","Battery not connected","TCXO-0x7b7f"]

testType :: TestTree
testType =
  testGroup "Test type parser"
    [ testCase "Type command" $ parser parseInfo typeOutput $ Right typeResult
    ]

--------------------------------------------------------------------------------
-- MON Parsers
--------------------------------------------------------------------------------

monSatOutput :: ByteString
monSatOutput = "GPS 9\r\r\n05,42,07,52,08,43,09,52,16,35,23,47,27,43,28,42,30,49\r\r\n\r\r\nGLO 10\r\r\n01,50,02,52,03,36,08,37,10,36,11,50,12,50,13,32,20,31,21,40\r\r\n\r\r\nBDS 0\r\r\n\r\r\nGAL 4\r\r\n01,44,04,42,19,44,20,36\r\r\n\r\r\nLABSAT_V3 >"

monSatResult :: [ConstellationCNO]
monSatResult = [ConstellationCNO GPS "9" [SatelliteCNO "05" "42",SatelliteCNO "07" "52",SatelliteCNO "08" "43",SatelliteCNO "09" "52",SatelliteCNO "16" "35",SatelliteCNO "23" "47",SatelliteCNO "27" "43",SatelliteCNO "28" "42",SatelliteCNO "30" "49"],ConstellationCNO GLO "10" [SatelliteCNO "01" "50",SatelliteCNO "02" "52",SatelliteCNO "03" "36",SatelliteCNO "08" "37",SatelliteCNO "10" "36",SatelliteCNO "11" "50",SatelliteCNO "12" "50",SatelliteCNO "13" "32",SatelliteCNO "20" "31",SatelliteCNO "21" "40"],ConstellationCNO BDS "0" [],ConstellationCNO GAL "4" [SatelliteCNO "01" "44",SatelliteCNO "04" "42",SatelliteCNO "19" "44",SatelliteCNO "20" "36"]]

monLocOutput :: ByteString
monLocOutput = "123456.00,-5.800000,M,1234.12345,N,54321.54321,W\r\r\n\r\r\nLABSAT_V3 >"

monLocResult :: Location
monLocResult = Location {_time = 123456.0, _height = (-5.8,"M"), _lattitude = (1234.12345,"N"), _longitude = (54321.54321,"W")}

testMon :: TestTree
testMon =
  testGroup "Test MON parsers"
    [ testCase "Test MON:SAT" $ parser parseMonSat monSatOutput $ Right monSatResult
    , testCase "Test MON:LOC" $ parser parseMonLoc monLocOutput $ Right monLocResult
    ]

--------------------------------------------------------------------------------
-- ATTN Parsers
--------------------------------------------------------------------------------

attnOutput1 :: ByteString
attnOutput1 = "OK:ATTN:CH1:0 \r\r\nOK:ATTN:CH2:0 \r\r\nOK:ATTN:CH3:0 \r\r\nOK\r\r\n\r\r\nLABSAT_V3 >"

attnOutput2 :: ByteString
attnOutput2 = "OK:ATTN:CH1:10 \r\r\nOK:ATTN:CH3:10 \r\r\nOK\r\r\n\r\r\nLABSAT_V3 >"

attnResult1 :: AttnConf
attnResult1 = AttnConf {_acAttnAll = Nothing, _acAttnCh1 = Just 0, _acAttnCh2 = Just 0, _acAttnCh3 = Just 0}

attnResult2 :: AttnConf
attnResult2 = AttnConf {_acAttnAll = Nothing, _acAttnCh1 = Just 10, _acAttnCh2 = Nothing, _acAttnCh3 = Just 10}

testAttn :: TestTree
testAttn =
  testGroup "Test ATTN parsers"
    [ testCase "Test ATTN:0" $ parser parseAttn attnOutput1 $ Right attnResult1
    , testCase "Test ATTN:CH1:10:CH3:10" $ parser parseAttn attnOutput2 $ Right attnResult2
    ]

--------------------------------------------------------------------------------
-- CONF Parsers
--------------------------------------------------------------------------------

canBaudOutput :: ByteString
canBaudOutput = "baud value is 500000.000000 \r\r\nOK\r\r\n\r\r\nLABSAT_V3 >"

canBaudResult :: Double
canBaudResult = 500000.0

consFreqOutput :: ByteString
consFreqOutput = "TELNET_CONF \r\r\n QUA-1, BW-10, Available ch(1) 1575420000, 1207140014, 1268520019 \r\r\nOK\r\r\n\r\r\nLABSAT_V3 >"

consFreqResult :: ConstellationFreqConf
consFreqResult = ConstellationFreqConf {
                  _cfcQuantization = QUA1,
                  _cfcBandwidth = BW_10,
                  _cfcFrequencies = [1.57542e9,1.207140014e9,1.268520019e9]}

testConf :: TestTree
testConf =
  testGroup "Test CONF parsers"
  [ testCase "Test CONF:SETUP:CAN:CH1:BAUD:500000" $ parser parseCANBaud canBaudOutput $ Right canBaudResult
  , testCase "Test CONF:CONS:QUA:1:BW:10:FREQ:1575420000" $ parser parseConsFreq consFreqOutput $ Right consFreqResult
  ]

tests :: TestTree
tests =
  testGroup "LabSat parser tests"
    [ testHelp
    , testMedia
    , testPlay
    , testRecord
    , testType
    , testMon
    , testAttn
    , testConf
    ]