package de.saring.exerciseviewer.parser.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.time.LocalDateTime;
import java.util.Locale;
import java.util.TimeZone;
import org.junit.Before;
import org.junit.Test;
import de.saring.exerciseviewer.core.EVException;
import de.saring.exerciseviewer.data.EVExercise;
import de.saring.exerciseviewer.data.Lap;
import de.saring.exerciseviewer.parser.AbstractExerciseParser;
import de.saring.exerciseviewer.parser.impl.garminfit.GarminFitParser;
/**
* This class contains all unit tests for the GarminFitParser class.
*
* @author Stefan Saring
*/
public class GarminFitParserTest {
/**
* Instance to be tested.
*/
private AbstractExerciseParser parser;
/**
* This method initializes the environment for testing.
*/
@Before
public void setUp() throws Exception {
// change locale/timezone to Germany (files recorded there), otherwise the datetime comparision fails
Locale.setDefault(Locale.GERMANY);
TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
parser = new GarminFitParser();
}
/**
* This method must fail on parsing an exercise file which doesn't exists.
*/
@Test(expected = EVException.class)
public void testParseExerciseMissingFile() throws EVException {
parser.parseExercise("missing-file.fit");
}
/**
* This method tests the parser with an FIT file which contains only settings data,
* no exercise data. An exception needs to be thrown.
*/
@Test(expected = EVException.class)
public void testParseExerciseSettingsFile() throws EVException {
final String FILENAME = "misc/testdata/garmin-fit/Settings.fit";
assertTrue(new File(FILENAME).exists());
parser.parseExercise(FILENAME);
}
/**
* This method tests the parser with an exercise file with cycling data
* (contains speed, heartrate, altitude and cadence data).
*/
@Test
public void testParseExercise() throws EVException {
// parse exercise file
EVExercise exercise = parser.parseExercise("misc/testdata/garmin-fit/2010-07-04-06-07-36.fit");
// check exercise data
assertEquals(EVExercise.ExerciseFileType.GARMIN_FIT, exercise.getFileType());
assertEquals("Garmin EDGE500", exercise.getDeviceName());
assertTrue(exercise.getRecordingMode().isSpeed());
assertTrue(exercise.getRecordingMode().isLocation());
assertTrue(exercise.getRecordingMode().isAltitude());
assertTrue(exercise.getRecordingMode().isCadence());
assertTrue(exercise.getRecordingMode().isTemperature());
assertEquals(LocalDateTime.of(2010, 7, 4, 6, 7, 36), exercise.getDateTime());
assertEquals(146499, exercise.getDuration());
assertEquals(121, exercise.getHeartRateAVG());
assertEquals(180, exercise.getHeartRateMax());
assertEquals(1567, exercise.getEnergy());
assertEquals(101710, exercise.getSpeed().getDistance());
assertEquals(24.9948, exercise.getSpeed().getSpeedAVG(), 0.001d);
assertEquals(68.4648, exercise.getSpeed().getSpeedMax(), 0.001d);
assertEquals(1115, exercise.getAltitude().getAscent());
assertEquals(127, exercise.getAltitude().getAltitudeMin());
assertEquals(290, exercise.getAltitude().getAltitudeAVG());
assertEquals(419, exercise.getAltitude().getAltitudeMax());
assertEquals(84, exercise.getCadence().getCadenceAVG());
assertEquals(119, exercise.getCadence().getCadenceMax());
assertEquals(19, exercise.getTemperature().getTemperatureMin());
assertEquals(24, exercise.getTemperature().getTemperatureAVG());
assertEquals(32, exercise.getTemperature().getTemperatureMax());
// check lap data
assertEquals(5, exercise.getLapList().length);
assertEquals(((0 * 3600) + (29 * 60) + 15) * 10, exercise.getLapList()[0].getTimeSplit());
assertEquals(126, exercise.getLapList()[0].getHeartRateAVG());
assertEquals(146, exercise.getLapList()[0].getHeartRateMax());
assertEquals(122, exercise.getLapList()[0].getHeartRateSplit());
assertEquals(11084, exercise.getLapList()[0].getSpeed().getDistance());
assertEquals(22.7334, exercise.getLapList()[0].getSpeed().getSpeedAVG(), 0.001d);
assertEquals(22.1364, exercise.getLapList()[0].getSpeed().getSpeedEnd(), 0.001d);
assertEquals(151, exercise.getLapList()[0].getAltitude().getAscent());
assertEquals(302, exercise.getLapList()[0].getAltitude().getAltitude());
assertEquals(20, exercise.getLapList()[0].getTemperature().getTemperature());
assertEquals(51.05553d, exercise.getLapList()[0].getPositionSplit().getLatitude(), 0.001d);
assertEquals(13.93589d, exercise.getLapList()[0].getPositionSplit().getLongitude(), 0.001d);
assertEquals(((2 * 3600) + (11 * 60) + 46) * 10, exercise.getLapList()[2].getTimeSplit());
assertEquals(124, exercise.getLapList()[2].getHeartRateAVG());
assertEquals(145, exercise.getLapList()[2].getHeartRateMax());
assertEquals(98, exercise.getLapList()[2].getHeartRateSplit());
assertEquals(48391, exercise.getLapList()[2].getSpeed().getDistance());
assertEquals(21.7080, exercise.getLapList()[2].getSpeed().getSpeedAVG(), 0.001d);
assertEquals(1.0440, exercise.getLapList()[2].getSpeed().getSpeedEnd(), 0.001d);
assertEquals(342, exercise.getLapList()[2].getAltitude().getAscent());
assertEquals(417, exercise.getLapList()[2].getAltitude().getAltitude());
assertEquals(24, exercise.getLapList()[2].getTemperature().getTemperature());
assertEquals(51.00746d, exercise.getLapList()[2].getPositionSplit().getLatitude(), 0.001d);
assertEquals(14.20151d, exercise.getLapList()[2].getPositionSplit().getLongitude(), 0.001d);
assertEquals(((4 * 3600) + (28 * 60) + 16) * 10, exercise.getLapList()[4].getTimeSplit());
assertEquals(120, exercise.getLapList()[4].getHeartRateAVG());
assertEquals(144, exercise.getLapList()[4].getHeartRateMax());
assertEquals(94, exercise.getLapList()[4].getHeartRateSplit());
assertEquals(101711, exercise.getLapList()[4].getSpeed().getDistance());
assertEquals(26.0136, exercise.getLapList()[4].getSpeed().getSpeedAVG(), 0.001d);
assertEquals(0d, exercise.getLapList()[4].getSpeed().getSpeedEnd(), 0.001d);
assertEquals(206, exercise.getLapList()[4].getAltitude().getAscent());
assertEquals(237, exercise.getLapList()[4].getAltitude().getAltitude());
assertEquals(30, exercise.getLapList()[4].getTemperature().getTemperature());
assertEquals(51.05450d, exercise.getLapList()[4].getPositionSplit().getLatitude(), 0.001d);
assertEquals(13.83227d, exercise.getLapList()[4].getPositionSplit().getLongitude(), 0.001d);
// check sample data
assertEquals(8235, exercise.getSampleList().length);
assertEquals(1000, exercise.getSampleList()[0].getTimestamp());
assertEquals(97, exercise.getSampleList()[0].getHeartRate());
assertEquals(0, exercise.getSampleList()[0].getDistance());
assertEquals(13.8744d, exercise.getSampleList()[0].getSpeed(), 0.001d);
assertEquals(232, exercise.getSampleList()[0].getAltitude());
assertEquals(67, exercise.getSampleList()[0].getCadence());
assertEquals(51.05350d, exercise.getSampleList()[0].getPosition().getLatitude(), 0.001d);
assertEquals(13.83309d, exercise.getSampleList()[0].getPosition().getLongitude(), 0.001d);
assertEquals(20, exercise.getSampleList()[0].getTemperature());
assertEquals(10 * 1000, exercise.getSampleList()[5].getTimestamp());
assertEquals(110, exercise.getSampleList()[5].getHeartRate());
assertEquals(34, exercise.getSampleList()[5].getDistance());
assertEquals(12.2364, exercise.getSampleList()[5].getSpeed(), 0.001d);
assertEquals(233, exercise.getSampleList()[5].getAltitude());
assertEquals(69, exercise.getSampleList()[5].getCadence());
assertEquals(51.05323d, exercise.getSampleList()[5].getPosition().getLatitude(), 0.001d);
assertEquals(13.83324d, exercise.getSampleList()[5].getPosition().getLongitude(), 0.001d);
assertEquals(20, exercise.getSampleList()[5].getTemperature());
assertEquals(((4 * 3600) + (28 * 60) + 15) * 1000, exercise.getSampleList()[8234].getTimestamp());
assertEquals(94, exercise.getSampleList()[8234].getHeartRate());
assertEquals(101710, exercise.getSampleList()[8234].getDistance());
assertEquals(0d, exercise.getSampleList()[8234].getSpeed(), 0.001d);
assertEquals(237, exercise.getSampleList()[8234].getAltitude());
assertEquals(0, exercise.getSampleList()[8234].getCadence());
assertEquals(51.05450d, exercise.getSampleList()[8234].getPosition().getLatitude(), 0.001d);
assertEquals(13.83227d, exercise.getSampleList()[8234].getPosition().getLongitude(), 0.001d);
assertEquals(30, exercise.getSampleList()[8234].getTemperature());
}
/**
* This method tests the parser with an exercise file with running data recorded by
* a Garmin Forerunner 910XT. Mostly the differences of this device are tested here.
*/
@Test
public void testParseExerciseForerunner910XT() throws EVException {
// parse exercise file
EVExercise exercise = parser.parseExercise("misc/testdata/garmin-fit/Garmin_Forerunner_910XT-Running.fit");
// check exercise data
assertEquals(EVExercise.ExerciseFileType.GARMIN_FIT, exercise.getFileType());
assertEquals("Garmin FR910XT", exercise.getDeviceName());
assertTrue(exercise.getRecordingMode().isSpeed());
assertTrue(exercise.getRecordingMode().isLocation());
assertTrue(exercise.getRecordingMode().isAltitude());
assertFalse(exercise.getRecordingMode().isCadence());
assertFalse(exercise.getRecordingMode().isTemperature());
assertEquals(LocalDateTime.of(2012, 9, 29, 17, 2, 19), exercise.getDateTime());
assertEquals(30067, exercise.getDuration());
assertEquals(155, exercise.getHeartRateAVG());
assertEquals(168, exercise.getHeartRateMax());
assertEquals(681, exercise.getEnergy());
assertEquals(9843, exercise.getSpeed().getDistance());
assertEquals(11.7841, exercise.getSpeed().getSpeedAVG(), 0.001d);
assertEquals(15.2424, exercise.getSpeed().getSpeedMax(), 0.001d);
assertEquals(69, exercise.getAltitude().getAscent());
assertEquals(97, exercise.getAltitude().getAltitudeMin());
assertEquals(108, exercise.getAltitude().getAltitudeAVG());
assertEquals(116, exercise.getAltitude().getAltitudeMax());
assertNull(exercise.getCadence());
assertNull(exercise.getTemperature());
// check some lap data
assertEquals(10, exercise.getLapList().length);
assertEquals(((0 * 3600) + (25 * 60) + 53) * 10, exercise.getLapList()[4].getTimeSplit());
assertEquals(155, exercise.getLapList()[4].getHeartRateAVG());
assertEquals(159, exercise.getLapList()[4].getHeartRateMax());
assertEquals(159, exercise.getLapList()[4].getHeartRateSplit());
assertEquals(5000, exercise.getLapList()[4].getSpeed().getDistance());
assertEquals(11.5905, exercise.getLapList()[4].getSpeed().getSpeedAVG(), 0.001d);
assertEquals(11.5848, exercise.getLapList()[4].getSpeed().getSpeedEnd(), 0.001d);
assertEquals(5, exercise.getLapList()[4].getAltitude().getAscent());
assertEquals(104, exercise.getLapList()[4].getAltitude().getAltitude());
assertNull(exercise.getLapList()[4].getTemperature());
assertEquals(49.42301d, exercise.getLapList()[4].getPositionSplit().getLatitude(), 0.001d);
assertEquals(8.620427d, exercise.getLapList()[4].getPositionSplit().getLongitude(), 0.001d);
// check some sample data
assertEquals(743, exercise.getSampleList().length);
assertEquals(0, exercise.getSampleList()[0].getTimestamp());
assertEquals(79, exercise.getSampleList()[0].getHeartRate());
assertEquals(1, exercise.getSampleList()[0].getDistance());
assertEquals(2.5452d, exercise.getSampleList()[0].getSpeed(), 0.001d);
assertEquals(109, exercise.getSampleList()[0].getAltitude());
assertEquals(0, exercise.getSampleList()[0].getCadence());
assertEquals(49.41165d, exercise.getSampleList()[0].getPosition().getLatitude(), 0.001d);
assertEquals(8.65186d, exercise.getSampleList()[0].getPosition().getLongitude(), 0.001d);
assertEquals(0, exercise.getSampleList()[0].getTemperature());
assertEquals(2048000, exercise.getSampleList()[500].getTimestamp());
assertEquals(157, exercise.getSampleList()[500].getHeartRate());
assertEquals(6670, exercise.getSampleList()[500].getDistance());
assertEquals(12.2508d, exercise.getSampleList()[500].getSpeed(), 0.001d);
assertEquals(102, exercise.getSampleList()[500].getAltitude());
assertEquals(0, exercise.getSampleList()[500].getCadence());
assertEquals(49.42749d, exercise.getSampleList()[500].getPosition().getLatitude(), 0.001d);
assertEquals(8.63364d, exercise.getSampleList()[500].getPosition().getLongitude(), 0.001d);
assertEquals(0, exercise.getSampleList()[500].getTemperature());
}
/**
* This method tests the parser with an exercise file with running data
* recorded by a Garmin Fenix 2. Mostly the differences of this device are
* tested here.
*/
@Test
public void testParseExerciseFenix2() throws EVException {
EVExercise exercise = parser.parseExercise("misc/testdata/garmin-fit/Garmin_Fenix2_running_with_hrm.fit");
// check exercise data
assertEquals(EVExercise.ExerciseFileType.GARMIN_FIT, exercise.getFileType());
assertEquals("Garmin FENIX2", exercise.getDeviceName());
assertTrue(exercise.getRecordingMode().isSpeed());
assertTrue(exercise.getRecordingMode().isLocation());
assertTrue(exercise.getRecordingMode().isAltitude());
assertFalse(exercise.getRecordingMode().isCadence());
assertTrue(exercise.getRecordingMode().isTemperature());
assertEquals(LocalDateTime.of(2015, 7, 21, 19, 8, 50), exercise.getDateTime());
assertEquals(23960, exercise.getDuration());
assertEquals(169, exercise.getHeartRateAVG());
assertEquals(192, exercise.getHeartRateMax());
assertEquals(553, exercise.getEnergy());
assertEquals(6235, exercise.getSpeed().getDistance());
assertEquals(9.36, exercise.getSpeed().getSpeedAVG(), 0.01d);
assertEquals(15.58, exercise.getSpeed().getSpeedMax(), 0.01d);
assertEquals(4, exercise.getAltitude().getAscent());
assertEquals(304, exercise.getAltitude().getAltitudeMin());
assertEquals(305, exercise.getAltitude().getAltitudeAVG());
assertEquals(307, exercise.getAltitude().getAltitudeMax());
assertNull(exercise.getCadence());
assertEquals(30, exercise.getTemperature().getTemperatureMin());
assertEquals(31, exercise.getTemperature().getTemperatureAVG());
assertEquals(34, exercise.getTemperature().getTemperatureMax());
// check some lap data
assertEquals(7, exercise.getLapList().length);
Lap lap5 = exercise.getLapList()[4];
assertEquals(19520, lap5.getTimeSplit());
// average values of heart rate are still missing
// assertEquals(169, lap5.getHeartRateAVG());
// assertEquals(173, lap5.getHeartRateMax());
assertEquals(170, lap5.getHeartRateSplit());
assertEquals(5000, lap5.getSpeed().getDistance());
assertEquals(9.22, lap5.getSpeed().getSpeedAVG(), 0.01d);
assertEquals(8.35, lap5.getSpeed().getSpeedEnd(), 0.01d);
assertEquals(0, lap5.getAltitude().getAscent());
assertEquals(305, lap5.getAltitude().getAltitude());
assertEquals(31, lap5.getTemperature().getTemperature());
assertEquals(49.426330681890d, lap5.getPositionSplit().getLatitude(), 0.000001d);
assertEquals(11.115129310637, lap5.getPositionSplit().getLongitude(), 0.000001d);
// check some sample data
assertEquals(2392, exercise.getSampleList().length);
assertEquals(0, exercise.getSampleList()[0].getTimestamp());
assertEquals(140, exercise.getSampleList()[0].getHeartRate());
assertEquals(0, exercise.getSampleList()[0].getDistance());
assertEquals(3.56d, exercise.getSampleList()[0].getSpeed(), 0.01d);
assertEquals(304, exercise.getSampleList()[0].getAltitude());
assertEquals(73, exercise.getSampleList()[0].getCadence());
assertEquals(49.430309236049, exercise.getSampleList()[0].getPosition().getLatitude(), 0.000001d);
assertEquals(11.1262008827179, exercise.getSampleList()[0].getPosition().getLongitude(), 0.000001d);
assertEquals(32, exercise.getSampleList()[0].getTemperature());
assertEquals(500000, exercise.getSampleList()[500].getTimestamp());
assertEquals(166, exercise.getSampleList()[500].getHeartRate());
assertEquals(1395, exercise.getSampleList()[500].getDistance());
assertEquals(9.0, exercise.getSampleList()[500].getSpeed(), 0.01d);
assertEquals(305, exercise.getSampleList()[500].getAltitude());
assertEquals(80, exercise.getSampleList()[500].getCadence());
assertEquals(49.433980593457d, exercise.getSampleList()[500].getPosition().getLatitude(), 0.000001d);
assertEquals(11.1192220263183, exercise.getSampleList()[500].getPosition().getLongitude(), 0.000001d);
assertEquals(32, exercise.getSampleList()[500].getTemperature());
}
}