mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-24 14:38:45 +00:00
Bug 4316: Added initial test cases regarding Bravo extended fix import
This commit is contained in:
+65
@@ -0,0 +1,65 @@
|
||||
package com.sap.sailing.server.trackfiles.test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
|
||||
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
|
||||
import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
|
||||
import com.sap.sailing.domain.common.tracking.impl.BravoFixImpl;
|
||||
import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier;
|
||||
import com.sap.sailing.domain.trackimport.DoubleVectorFixImporter;
|
||||
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
|
||||
import com.sap.sailing.server.trackfiles.impl.BaseBravoDataImporterImpl;
|
||||
import com.sap.sailing.server.trackfiles.impl.doublefix.DownsamplerTo1HzProcessor;
|
||||
import com.sap.sailing.server.trackfiles.impl.doublefix.LearningBatchProcessor;
|
||||
|
||||
public abstract class AbstractBravoDataImportTest {
|
||||
|
||||
private DownsamplerTo1HzProcessor downsampler;
|
||||
|
||||
private BaseBravoDataImporterImpl bravoDataImporter;
|
||||
private int callbackCallCount = 0;
|
||||
private double sumRideHeightInMeters = 0.0;
|
||||
|
||||
protected abstract int getTrackColumnCount();
|
||||
|
||||
protected abstract Map<String, Integer> getColumnData();
|
||||
|
||||
protected interface ImportDataDefinition {
|
||||
InputStream getInputStream();
|
||||
int getExpectedFixesCount();
|
||||
int getExpectedFixesConsolidated();
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.callbackCallCount = 0;
|
||||
this.sumRideHeightInMeters = 0.0;
|
||||
bravoDataImporter = new BaseBravoDataImporterImpl(getColumnData()) {
|
||||
protected com.sap.sailing.server.trackfiles.impl.doublefix.DoubleFixProcessor createDownsamplingProcessor(
|
||||
DoubleVectorFixImporter.Callback callback,
|
||||
TrackFileImportDeviceIdentifier trackIdentifier) {
|
||||
final LearningBatchProcessor batchProcessor = new LearningBatchProcessor(5000, 5000, callback, trackIdentifier);
|
||||
downsampler = new DownsamplerTo1HzProcessor(BravoSensorDataMetadata.getTrackColumnCount(), batchProcessor);
|
||||
return downsampler;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
protected void testImport(ImportDataDefinition importData) throws FormatNotSupportedException, IOException {
|
||||
bravoDataImporter.importFixes(importData.getInputStream(), (fixes, device) -> {
|
||||
for (DoubleVectorFix fix : fixes) {
|
||||
callbackCallCount++;
|
||||
sumRideHeightInMeters += new BravoFixImpl(fix).getRideHeight().getMeters();
|
||||
}
|
||||
}, "filename", "source", /* downsample */ true);
|
||||
Assert.assertEquals(importData.getExpectedFixesCount(), downsampler.getCountSourceTtl());
|
||||
Assert.assertEquals(importData.getExpectedFixesConsolidated(), downsampler.getCountImportedTtl());
|
||||
Assert.assertEquals(importData.getExpectedFixesConsolidated(), callbackCallCount);
|
||||
}
|
||||
|
||||
}
|
||||
+24
-47
@@ -4,42 +4,23 @@ import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
|
||||
import com.sap.sailing.domain.common.tracking.DoubleVectorFix;
|
||||
import com.sap.sailing.domain.common.tracking.impl.BravoFixImpl;
|
||||
import com.sap.sailing.domain.trackfiles.TrackFileImportDeviceIdentifier;
|
||||
import com.sap.sailing.domain.trackimport.DoubleVectorFixImporter;
|
||||
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
|
||||
import com.sap.sailing.server.trackfiles.impl.BravoDataImporterImpl;
|
||||
import com.sap.sailing.server.trackfiles.impl.doublefix.DownsamplerTo1HzProcessor;
|
||||
import com.sap.sailing.server.trackfiles.impl.doublefix.LearningBatchProcessor;
|
||||
|
||||
public class BravoDataImportTest {
|
||||
public class BravoDataImportTest extends AbstractBravoDataImportTest {
|
||||
|
||||
private LearningBatchProcessor batchProcessor;
|
||||
private DownsamplerTo1HzProcessor downsampler;
|
||||
|
||||
private final DoubleVectorFixImporter bravoDataImporter = new BravoDataImporterImpl() {
|
||||
protected com.sap.sailing.server.trackfiles.impl.doublefix.DoubleFixProcessor createDownsamplingProcessor(
|
||||
DoubleVectorFixImporter.Callback callback,
|
||||
TrackFileImportDeviceIdentifier trackIdentifier) {
|
||||
batchProcessor = new LearningBatchProcessor(5000, 5000, callback, trackIdentifier);
|
||||
downsampler = new DownsamplerTo1HzProcessor(BravoSensorDataMetadata.getTrackColumnCount(), batchProcessor);
|
||||
return downsampler;
|
||||
};
|
||||
};
|
||||
private int callbackCallCount = 0;
|
||||
private double sumRideHeightInMeters = 0.0;
|
||||
@Override
|
||||
protected Map<String, Integer> getColumnData() {
|
||||
return BravoSensorDataMetadata.getColumnNamesToIndexInDoubleFix();
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
this.callbackCallCount = 0;
|
||||
this.sumRideHeightInMeters = 0.0;
|
||||
@Override
|
||||
protected int getTrackColumnCount() {
|
||||
return BravoSensorDataMetadata.getTrackColumnCount();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -67,48 +48,36 @@ public class BravoDataImportTest {
|
||||
testImport(ImportData.DUMMY_RANDOM_HAEDER_ONE_LINE);
|
||||
}
|
||||
|
||||
private void testImport(ImportData importData) throws FormatNotSupportedException, IOException {
|
||||
bravoDataImporter.importFixes(importData.getInputStream(), (fixes, device) -> {
|
||||
for (DoubleVectorFix fix : fixes) {
|
||||
callbackCallCount++;
|
||||
sumRideHeightInMeters += new BravoFixImpl(fix).getRideHeight().getMeters();
|
||||
}
|
||||
}, "filename", "source", /* downsample */ true);
|
||||
Assert.assertEquals(importData.expectedFixesCount, downsampler.getCountSourceTtl());
|
||||
Assert.assertEquals(importData.expectedFixesConsolidated, downsampler.getCountImportedTtl());
|
||||
Assert.assertEquals(importData.expectedFixesConsolidated, callbackCallCount);
|
||||
}
|
||||
|
||||
private enum ImportData {
|
||||
private enum ImportData implements ImportDataDefinition {
|
||||
// find out the number of fixes using the following bash line:
|
||||
// tail -n +5 Undefined\ Race\ -\ BRAVO.txt | awk '{if ($5<$6) print v=$5; else v=$6; sum+=v; count++; } END {print "Sum: ", sum, "Count: ", count, "Average:", sum/count;}'
|
||||
FILE_UNDEFINED_RACE_BRAVO(870, 89) {
|
||||
@Override
|
||||
protected InputStream getInputStream() {
|
||||
public InputStream getInputStream() {
|
||||
return getClass().getResourceAsStream("/Undefined Race - BRAVO.txt");
|
||||
}
|
||||
},
|
||||
FILE_NEW_BRAVO_FORMAT(6, 1) {
|
||||
@Override
|
||||
protected InputStream getInputStream() {
|
||||
public InputStream getInputStream() {
|
||||
return getClass().getResourceAsStream("/FMU_out_new.txt");
|
||||
}
|
||||
},
|
||||
DUMMY_DEFAULT_HEADER_NO_DATA(0, 0) {
|
||||
@Override
|
||||
protected InputStream getInputStream() {
|
||||
public InputStream getInputStream() {
|
||||
return new ByteArrayInputStream(HEADER_ORDER_DEFAULT.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
},
|
||||
DUMMY_DEAFULT_HEADER_ONE_LINE(1, 1) {
|
||||
@Override
|
||||
protected InputStream getInputStream() {
|
||||
public InputStream getInputStream() {
|
||||
return new ByteArrayInputStream((HEADER_ORDER_DEFAULT + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
},
|
||||
DUMMY_RANDOM_HAEDER_ONE_LINE(1, 1) {
|
||||
@Override
|
||||
protected InputStream getInputStream() {
|
||||
public InputStream getInputStream() {
|
||||
return new ByteArrayInputStream((HEADER_ORDER_RANDOM + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
};
|
||||
@@ -121,7 +90,15 @@ public class BravoDataImportTest {
|
||||
this.expectedFixesConsolidated = expectedFixesConsolidated;
|
||||
}
|
||||
|
||||
protected abstract InputStream getInputStream();
|
||||
@Override
|
||||
public int getExpectedFixesCount() {
|
||||
return expectedFixesCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExpectedFixesConsolidated() {
|
||||
return expectedFixesConsolidated;
|
||||
}
|
||||
}
|
||||
|
||||
private static final String HEADER_ORDER_DEFAULT = "jjlDATE\tjjlTIME\tEpoch\tRideHeight\tRideHeightPortHull\t"
|
||||
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
package com.sap.sailing.server.trackfiles.test;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.sap.sailing.domain.common.sensordata.BravoExtendedSensorDataMetadata;
|
||||
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
|
||||
|
||||
public class BravoExtendedDataImportTest extends AbstractBravoDataImportTest {
|
||||
|
||||
@Override
|
||||
protected Map<String, Integer> getColumnData() {
|
||||
return BravoExtendedSensorDataMetadata.getColumnNamesToIndexInDoubleFix();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getTrackColumnCount() {
|
||||
return BravoExtendedSensorDataMetadata.getTrackColumnCount();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultHeaderNoDataImport() throws FormatNotSupportedException, IOException {
|
||||
testImport(ImportData.DUMMY_DEFAULT_HEADER_NO_DATA);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefaultHeaderOneLineImport() throws FormatNotSupportedException, IOException {
|
||||
testImport(ImportData.DUMMY_DEAFULT_HEADER_ONE_LINE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRandomHeaderOneLineImport() throws FormatNotSupportedException, IOException {
|
||||
testImport(ImportData.DUMMY_RANDOM_HAEDER_ONE_LINE);
|
||||
}
|
||||
|
||||
private enum ImportData implements ImportDataDefinition {
|
||||
DUMMY_DEFAULT_HEADER_NO_DATA(0, 0) {
|
||||
@Override
|
||||
public InputStream getInputStream() {
|
||||
return new ByteArrayInputStream(HEADER_ORDER_DEFAULT.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
},
|
||||
DUMMY_DEAFULT_HEADER_ONE_LINE(1, 1) {
|
||||
@Override
|
||||
public InputStream getInputStream() {
|
||||
return new ByteArrayInputStream((HEADER_ORDER_DEFAULT + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
},
|
||||
DUMMY_RANDOM_HAEDER_ONE_LINE(1, 1) {
|
||||
@Override
|
||||
public InputStream getInputStream() {
|
||||
return new ByteArrayInputStream((HEADER_ORDER_RANDOM + DUMMY_CONTENT).getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
};
|
||||
|
||||
private final int expectedFixesCount;
|
||||
private final int expectedFixesConsolidated;
|
||||
|
||||
private ImportData(int expectedFixesCount, int expectedFixesConsolidated) {
|
||||
this.expectedFixesCount = expectedFixesCount;
|
||||
this.expectedFixesConsolidated = expectedFixesConsolidated;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExpectedFixesCount() {
|
||||
return expectedFixesCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getExpectedFixesConsolidated() {
|
||||
return expectedFixesConsolidated;
|
||||
}
|
||||
}
|
||||
|
||||
private static final String HEADER_ORDER_DEFAULT = "jjlDATE\tjjlTIME\tEpoch\tMagneticVariation\tCurrentSpeed\t"
|
||||
+ "CurrentDirection\tWindGradient\tLat\tLon\tCOG\tSOG\tHdg\tHeel\tTrim\tFlightPathAngle\tRollRate\t"
|
||||
+ "PitchRate\tYawRate\tAccelX\tAccelY\tAccelZ\tHeaveSpeed\tHeave\tRideHeightPort\tRideHeightStbd\t"
|
||||
+ "RideHeight\tBS\tLwy\tCse\tSOW\tAWA\tAWS\tTWA\tTWS\tTWD\tUpwashAngle\tUpwashSpeed\tAdjWindAngle\t"
|
||||
+ "AdjWindSpeed\tVMG\tMastRotation\tDaggerBoardRakeAnglePort\tRudderRakeAnglePort\tDaggerBoardRakeAngleStbd\t"
|
||||
+ "RudderRakeAngleStbd\tTargetTWA\tTargetVMG\tTargetBS\tPolarBS\tBsPercentage\tVmgPercentage\t\n";
|
||||
|
||||
private static final String HEADER_ORDER_RANDOM = "jjlDATE\tjjlTIME\tEpoch\tMagneticVariation\tCurrentSpeed\t"
|
||||
+ "CurrentDirection\tWindGradient\tLat\tLon\tCOG\tSOG\tHdg\tHeel\tTrim\tFlightPathAngle\tRollRate\t"
|
||||
+ "AdjWindSpeed\tVMG\tMastRotation\tDaggerBoardRakeAnglePort\tRudderRakeAnglePort\tDaggerBoardRakeAngleStbd\t"
|
||||
+ "RideHeight\tBS\tLwy\tCse\tSOW\tAWA\tAWS\tTWA\tTWS\tTWD\tUpwashAngle\tUpwashSpeed\tAdjWindAngle\t"
|
||||
+ "PitchRate\tYawRate\tAccelX\tAccelY\tAccelZ\tHeaveSpeed\tHeave\tRideHeightPort\tRideHeightStbd\t"
|
||||
+ "RudderRakeAngleStbd\tTargetTWA\tTargetVMG\tTargetBS\tPolarBS\tBsPercentage\tVmgPercentage\t\n";
|
||||
|
||||
private static final String DUMMY_CONTENT = "20170721.000000\t144509.020891\t1500648308988.000000\t0.000000\t"
|
||||
+ "0.000000\t0.000000\t0.100000\t4121.750774\t211.855241\t267.200000\t12.108000\t274.401591\t8.293443\t"
|
||||
+ "1.381434\t-0.607992\t4.466850\t2.295866\t4.974762\t0.021349\t0.049948\t-0.003009\t-0.059050\t0.564561\t"
|
||||
+ "-0.142641\t0.661195\t0.640803\t11.024831\t4.831789\t274.531789\t11.415373\t-28.235512\t12.815985\t"
|
||||
+ "-88.908514\t6.063496\t183.968325\t0.000000\t0.000000\t0.000000\t0.000000\t-0.080389\t-46.507845\t"
|
||||
+ "-0.301864\t0.915471\t0.737711\t5.518818\t60.000000\t4.049104\t8.098208\t11.025103\t134.646042\t0.684715\t\n";
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user