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
]