souplesse/tests/UnitTest.hs

110 lines
3.6 KiB
Haskell
Raw Normal View History

2024-10-30 13:30:33 +00:00
{-# LANGUAGE QuasiQuotes #-}
2024-10-27 20:19:58 +00:00
module Main where
2024-10-27 23:13:39 +00:00
2024-10-29 21:22:49 +00:00
import qualified Track
2024-10-30 13:30:33 +00:00
import Text.RawString.QQ(r)
2024-10-27 20:19:58 +00:00
import Test.HUnit
import qualified System.Exit as Exit
2024-10-28 23:35:36 +00:00
import Control.Exception
import Debug.Trace (trace, traceShow)
2024-10-30 17:44:40 +00:00
import qualified Data.Time
2024-10-30 20:27:57 +00:00
import Data.Either
2024-10-27 20:19:58 +00:00
2024-10-30 13:30:33 +00:00
preamble = [r|
<?xml version="1.0" encoding="UTF-8"?>
<gpx
version="1.1"
creator="OpenTracks"
xmlns="http://www.topografix.com/GPX/1/1"
xmlns:topografix="http://www.topografix.com/GPX/Private/TopoGrafix/0/1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:opentracks="http://opentracksapp.com/xmlschemas/v1"
xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v2"
xmlns:gpxtrkx="http://www.garmin.com/xmlschemas/TrackStatsExtension/v1"
xmlns:cluetrust="http://www.cluetrust.com/Schemas/"
xmlns:pwr="http://www.garmin.com/xmlschemas/PowerExtension/v1"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.topografix.com/GPX/Private/TopoGrafix/0/1 http://www.topografix.com/GPX/Private/TopoGrafix/0/1/topografix.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v2 https://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd http://www.garmin.com/xmlschemas/PowerExtension/v1 https://www8.garmin.com/xmlschemas/PowerExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackStatsExtension/v1 http://www.cluetrust.com/Schemas http://www.cluetrust.com/Schemas/gpxdata10.xsd http://opentracksapp.com/xmlschemas/v1 http://opentracksapp.com/xmlschemas/OpenTracks_v1.xsd">
|]
wrap x = preamble ++ x ++ "</gpx>"
2024-10-30 17:17:48 +00:00
onepoint = wrap [r|
<trk> <trkseg>
<trkpt lat="51" lon="-0.1"> </trkpt>
</trkseg> </trk>
|]
onepointWithAttrs = wrap [r|
<trk>
<trkseg>
<trkpt lat="51" lon="-0.1">
<ele>25.2</ele>
2024-10-30 17:44:40 +00:00
<time>2024-10-23T08:34:59.779+01:00</time>
2024-10-30 17:17:48 +00:00
<extensions><gpxtpx:TrackPointExtension>
<gpxtpx:speed>2.4</gpxtpx:speed>
<gpxtpx:cad>128</gpxtpx:cad>
<pwr:PowerInWatts>55</pwr:PowerInWatts>
<opentracks:accuracy_horizontal>3.216</opentracks:accuracy_horizontal><opentracks:distance>10.675</opentracks:distance>
<cluetrust:distance>32.025</cluetrust:distance>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>
</trkseg>
</trk>
|]
2024-10-27 23:13:39 +00:00
2024-10-29 19:20:08 +00:00
test1 = TestCase $
2024-10-30 20:27:57 +00:00
either
(assertFailure . displayException)
(\ t -> assertEqual "empty track has no elements"
0 (Track.length t))
(Track.parse (wrap ""))
2024-10-28 23:35:36 +00:00
testMalformed = TestCase $
2024-10-30 20:27:57 +00:00
let trk = Track.parse (wrap "<dgdsfg>>")
in assertBool "catches syntax error" (isLeft trk)
2024-10-28 23:35:36 +00:00
test2 = TestCase $
2024-10-30 20:27:57 +00:00
either
(assertFailure . displayException)
(\ (p:_) ->
assertEqual "matches lat/lon"
(Track.Pos 51.0 (-0.1))
(Track.pos p))
2024-10-30 20:27:57 +00:00
(Track.parse onepoint)
2024-10-27 20:19:58 +00:00
2024-10-29 21:22:49 +00:00
test3 = TestCase $
either
(assertFailure . displayException)
(\ (p:_) ->
assertEqual "handles missing attributes"
(Nothing, Nothing) (Track.elevation p, Track.cadence p))
(Track.parse onepoint)
2024-10-29 21:22:49 +00:00
test4 = TestCase $
either
(assertFailure . displayException)
(\ (p:_) ->
assertEqual "handles attributes"
2024-10-30 17:44:40 +00:00
(Just 25.2, Just 128, Just 55, Data.Time.UTCTime (toEnum 60606) 27299.779)
(Track.elevation p, Track.cadence p, Track.power p, Track.time p))
(Track.parse onepointWithAttrs)
2024-10-29 21:22:49 +00:00
2024-10-27 20:19:58 +00:00
tests :: Test
2024-10-28 23:35:36 +00:00
tests = TestList [
test1,
testMalformed,
test2,
test3,
test4
2024-10-28 23:35:36 +00:00
]
2024-10-27 20:19:58 +00:00
main :: IO ()
main = do
result <- runTestTT tests
2024-10-30 20:45:37 +00:00
if (failures result > 0) || (errors result > 0)
then Exit.exitFailure
else Exit.exitSuccess