package cgeo.geocaching.export; import static org.assertj.core.api.Java6Assertions.assertThat; import cgeo.CGeoTestCase; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.location.Geopoint; import cgeo.geocaching.log.LogEntry; import cgeo.geocaching.log.LogType; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.storage.DataStore; import cgeo.geocaching.utils.FileUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; public class ExportTest extends CGeoTestCase { public static void testGSAKExport() { final Geocache cache = new Geocache(); cache.setGeocode("GCX1234"); final LogEntry log = new LogEntry.Builder() .setDate(1353244820000L) .setLogType(LogType.FOUND_IT) .setLog("Hidden in a tree") .build(); final FieldNotes fieldNotes = new FieldNotes(); fieldNotes.add(cache, log); assertEquals("Non matching export " + fieldNotes.getContent(), "GCX1234,2012-11-18T13:20:20Z,Found it,\"Hidden in a tree\"\n", fieldNotes.getContent()); } public static void testGpxExportSmilies() throws InterruptedException, ExecutionException, IOException { final Geocache cache = new Geocache(); cache.setGeocode("GCX1234"); cache.setCoords(new Geopoint("N 49 44.000 E 8 37.000")); final LogEntry log = new LogEntry.Builder() .setDate(1353244820000L) .setLogType(LogType.FOUND_IT) .setLog("Smile: \ud83d\ude0a") .build(); DataStore.saveCache(cache, LoadFlags.SAVE_ALL); DataStore.saveLogs(cache.getGeocode(), Collections.singletonList(log)); assertCanExport(cache); } public static void testGpxExportUnknownConnector() throws InterruptedException, ExecutionException, IOException { final Geocache cache = new Geocache(); cache.setGeocode("ABC123"); cache.setCoords(new Geopoint("N 49 44.000 E 8 37.000")); DataStore.saveCache(cache, LoadFlags.SAVE_ALL); assertThat(ConnectorFactory.getConnector(cache).getName()).isEqualTo("Unknown caches"); assertCanExport(cache); } private static void assertCanExport(final Geocache cache) throws InterruptedException, ExecutionException, IOException { // enforce storing in database, as GPX will not take information from cache cache.setDetailed(true); DataStore.saveCache(cache, LoadFlags.SAVE_ALL); final List<Geocache> exportList = Collections.singletonList(cache); final GpxExportTester gpxExport = new GpxExportTester(); File result = null; try { result = gpxExport.testExportSync(exportList); } finally { DataStore.removeCache(cache.getGeocode(), LoadFlags.REMOVE_ALL); } assertThat(result).isNotNull(); // make sure we actually exported waypoints final String gpx = org.apache.commons.io.FileUtils.readFileToString(result, (String) null); assertThat(gpx).contains("<wpt"); assertThat(gpx).contains(cache.getGeocode()); if (cache.getUrl() != null) { assertThat(gpx).contains("<url>"); } else { assertThat(gpx).doesNotContain("<url>"); } FileUtils.deleteIgnoringFailure(result); } private static class GpxExportTester extends GpxExport { public File testExportSync(final List<Geocache> caches) throws InterruptedException, ExecutionException { final ArrayList<String> geocodes = new ArrayList<>(caches.size()); for (final Geocache cache : caches) { geocodes.add(cache.getGeocode()); } final ExportTask task = new ExportTask(null); task.execute(geocodes.toArray(new String[geocodes.size()])); return task.get(); } } }