module Main where

import qualified Track
import Test.HUnit
import qualified System.Exit as Exit
import Control.Exception
import Debug.Trace (trace, traceShow)

onepoint =
  "<gpx> <trk> <trkseg> \n\
  \<trkpt lat=\"51\" lon=\"-0.1\"> </trkpt> \n\
  \</trkseg> </trk> </gpx>"
onepointEle =
  "<gpx> <trk> <trkseg> \n\
  \<trkpt lat=\"51\" lon=\"-0.1\"> \n\
  \ <ele>25.2</ele>\n\
  \</trkpt> \n\
  \</trkseg> </trk> </gpx>"

test1 = TestCase $
        case Track.parse "<gpx></gpx>" of
          Left err -> assertFailure (displayException err)
          Right t -> assertEqual "empty track has no elements"
                     0 (Track.length t)

testMalformed = TestCase $
        case Track.parse "<gpx><dgdsfg>></gpx>" of
          Left err -> assertBool "syntax error" True
          Right t -> assertFailure "no error message parsing bad xml"

test2 = TestCase $
        case Track.parse onepoint
        of
          Left err -> assertFailure (displayException err)
          Right (p:ps) ->
            assertEqual "matches lat/lon"
             (Track.Pos 51.0 (-0.1))
             (Track.pos p)

test3 = TestCase $
        case Track.parse onepoint
        of
          Left err -> assertFailure (displayException err)
          Right (p:ps) ->
            assertEqual "matches elevation"
             Nothing (Track.elevation p)

test4 = TestCase $
        case Track.parse onepointEle
        of
          Left err -> assertFailure (displayException err)
          Right (p:ps) ->
            assertEqual "matches elevation"
             (Just 25.2) (Track.elevation p)

tests :: Test
tests = TestList [
  test1,
  testMalformed,
  test2,
  test3,
  test4
  ]

main :: IO ()
main = do
    result <- runTestTT tests
    if failures result > 0 then Exit.exitFailure else Exit.exitSuccess