rattletrap-2.3.0: tests/Main.hs
import qualified Control.Monad as Monad
import qualified Data.ByteString.Lazy as ByteString
import qualified Rattletrap
import qualified System.FilePath as FilePath
import qualified System.IO.Temp as Temp
import qualified Test.Hspec as Hspec
main :: IO ()
main = Hspec.hspec spec
spec :: Hspec.Spec
spec = Hspec.describe "Rattletrap" (mapM_ (uncurry itCanRoundTrip) replays)
itCanRoundTrip :: String -> String -> Hspec.Spec
itCanRoundTrip uuid description =
Hspec.it (specName uuid description) (specBody uuid)
specName :: String -> String -> String
specName uuid description = unwords [take 4 uuid, description]
specBody :: String -> IO ()
specBody uuid = do
let inputFile = pathToReplay uuid
input <- ByteString.readFile inputFile
Temp.withSystemTempDirectory
"replay-"
(\directory -> do
let jsonFile = FilePath.combine directory "replay.json"
Rattletrap.mainWithArgs ["decode", inputFile, jsonFile]
let outputFile = FilePath.combine directory "output.replay"
Rattletrap.mainWithArgs ["encode", jsonFile, outputFile]
output <- ByteString.readFile outputFile
Monad.unless
(output == input)
(Hspec.expectationFailure "output does not match input"))
pathToReplay :: String -> FilePath
pathToReplay uuid =
FilePath.joinPath ["replays", FilePath.addExtension uuid ".replay"]
replays :: [(String, String)]
replays =
[ ("00080014003600090000036E0F65CCEB", "a flip time")
, ("07E925B1423653D44CB8B4B2524792C1", "a game mode before Neo Tokyo")
, ("0AD21FEE4A512906BEB6C98136AAF49A", "some Latin-1 text")
, ("1205D96C4D819800927791820096CD49", "rumble mode")
, ("160CA83E41083BFD8E6315B4BFCA0561", "a dedicated server IP")
, ("16D580EF479483E015207C901776F9FB", "new property types")
, ("18D6738D415B70B5BE4C299588D3C141", "an online loadout attribute")
, ("1A126AC24CAA0DB0E98835BD960B8AF8", "overtime")
, ("1AE415514DFC65DCBF8B8391AD35488D", "a game time")
, ("1BC2D01444ACE577D01E988EADD4DFD0", "no padding after the frames")
, ("1D1DE97D4941C86E43FE0093563DB621", "a camera pitch")
, ("1EF90FCC4F719F606A5327B3CDD782A4", "a private hoops match")
, ("1F3798E540B0C37A946561ABBB3037F9", "splitscreen players")
, ("211466D04B983F5A33CC2FA1D5928672", "a match save")
, ("22660E3649FC7971E5653692473D4318", "dropshot")
, ("22BACD794ABE7B92E50E9CBDBD9C59CE", "a vote to forfeit")
, ("27B6A7B64553F0F685874584F96BAB1B", "some UTF-16 text")
, ("29F582C34A65EB34D358A784CBE3C189", "frames")
, ("372DBFCA4BDB340E4357B6BD43032802", "a camera yaw attribute")
, ("387F059C47C09E253C875CA990EFD9F2", "a frozen attribute")
, ("3EA147DD485B8DD24810689A7A989E44", "a custom team name")
, ("4126861E477F4A03DE2A4080374D7908", "a game mode after Neo Tokyo")
, ("42F0D8DA4FC89AE7B80FCAB7F637A8EA", "reservations after Neo Tokyo")
, ("504ED825482186E771FAA9B642CE5CE4", "some messages")
, ("520E1BFF468CF6C3C48D1EA85D9C7909", "no pickup attribute")
, ("52AA67F94090C19D33C5009E54D31FE4", "a match-ending attribute")
, ("540DA764423C8FB24EB9D486D982F16F", "a demolish attribute")
, ("551CA4D44FF2B86015DE44A6B5790D4C", "private match settings")
, ("6320E51C49066A7C210A2993C2201D5F", "a forfeit attribute")
, ("6688EEE34BFEB3EC3A9E3283098CC712", "a malformed byte property")
, ("6D1B06D844A5BB91B81FD4B5B28F08BA", "a flip right")
, ("6F7CFCD24638F8A6567AB3A8B9958A90", "a map with numbers")
, ("7109EB9846D303E54B7ACBA792036213", "a boost modifier")
, ("7BF6073F4614CE0A438994B9A260DA6A", "an online loadouts attribute")
, ("89CBA30E46FA5385BDD35DA4285D4D2E", "remote user data")
, ("9704208245D7DD851F2FB2BC7DFD9AC3", "a batarang")
, ("98E58A904D713F2DE202358E8573265D", "a player using behind view")
, ("A128B3AB45D5A18E3EF9CF93C9576BCE", "a round count down")
, ("A52F804845573D8DA65E97BF59026A43", "some more mutators")
, ("A6711CE74272B2E663DCC9A200A218E3", "a waiting player")
, ("A7F001A1417A19BFA8C90990D8F7C2FF", "a ready attribute")
, ("B9F9B87D4A9D0A3D25D4EC91C0401DE2", "a party leader")
, ("C14F7E0E4D9B5E6BE9AD5D8ED56B174C", "some mutators")
, ("C8372B1345B1803DEF039F815DBD802D", "a spectator")
, ("CC4CA70D4F7A67EBAD0ED9B9923106F7", "after Starbase ARC")
, ("D0449F5F4AA775B86FFA7DA2B5A3204E", "hoops mutators")
, ("D428F81646A98C25902CE988AE5C14C8", "a private hockey match")
, ("D7FB197A451D69075A0C99A2F49A4053", "an explosion attribute")
, ("DCB3A6B94A9DBE46FDE5EAA9B012F6C8", "a pawn type attribute")
, ("EAE311E84BA35B590A6FDBA6DD4F2FEB", "an actor/object ID collision")
, ("EAE8DADA4BB2DC5422792C9B4A67392D", "custom team colors")
, ("F299F176491554B11E34AB91CA76B2CE", "a location attribute")
, ("F7B9E14545C7467B89A00895980FCD73", "a hockey game event")
, ("F811C1D24888015E23B598AD8628C742", "no frames")
, ("FDC79DA84DD463D4BCCE6B892829AC88", "an MVP")
]