diff --git a/scripts/fitdump b/scripts/fitdump index 629f61b..7946be3 100755 --- a/scripts/fitdump +++ b/scripts/fitdump @@ -145,9 +145,9 @@ def generate_gpx(records, filename=None): trkpt["speed"] = field_data.value / 3.6 # Add trackpoint - if "lat" in trkpt and "lon" in trkpt: + if trkpt.get("lat") is not None and trkpt.get("lon") is not None: yield ' \n'.format(**trkpt) - if "ele" in trkpt: + if trkpt.get("ele") is not None: yield ' {ele}\n'.format(**trkpt) if "time" in trkpt: yield ' \n'.format(**trkpt) diff --git a/tests/test_fitdump.py b/tests/test_fitdump.py new file mode 100644 index 0000000..89439d0 --- /dev/null +++ b/tests/test_fitdump.py @@ -0,0 +1,40 @@ +import importlib.util +import pathlib +import unittest +import xml.etree.ElementTree as ElementTree +from importlib.machinery import SourceFileLoader + + +FITDUMP_PATH = pathlib.Path(__file__).parents[1] / "scripts" / "fitdump" +FITDUMP_SPEC = importlib.util.spec_from_loader("fitdump", SourceFileLoader("fitdump", str(FITDUMP_PATH))) +fitdump = importlib.util.module_from_spec(FITDUMP_SPEC) +FITDUMP_SPEC.loader.exec_module(fitdump) + + +class Field: + def __init__(self, name, value): + self.name = name + self.value = value + + +class Record(list): + name = "record" + + +class GenerateGpxTestCase(unittest.TestCase): + def test_invalid_coordinates_and_elevation_are_omitted(self): + records = [ + Record([Field("position_lat", None), Field("position_long", 1)]), + Record([Field("position_lat", 1), Field("position_long", 2), Field("enhanced_altitude", None)]), + ] + + root = ElementTree.fromstring("".join(fitdump.generate_gpx(records))) + namespace = {"gpx": "http://www.topografix.com/GPX/1/1"} + points = root.findall(".//gpx:trkpt", namespace) + + self.assertEqual(1, len(points)) + self.assertIsNone(points[0].find("gpx:ele", namespace)) + + +if __name__ == "__main__": + unittest.main()