package cgeo.geocaching.connector.gc;
import static org.assertj.core.api.Java6Assertions.assertThat;
import cgeo.geocaching.SearchResult;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.ConnectorFactoryTest;
import cgeo.geocaching.connector.trackable.TravelBugConnector;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.location.Geopoint;
import cgeo.geocaching.location.Viewport;
import cgeo.geocaching.models.Geocache;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.settings.TestSettings;
import cgeo.geocaching.test.AbstractResourceInstrumentationTestCase;
import java.util.Set;
import org.assertj.core.api.AbstractBooleanAssert;
public class GCConnectorTest extends AbstractResourceInstrumentationTestCase {
public static void testGetViewport() {
// backup user settings
final boolean excludeMine = Settings.isExcludeMyCaches();
final CacheType cacheType = Settings.getCacheType();
try {
// set up settings required for test
TestSettings.setExcludeMine(false);
Settings.setCacheType(CacheType.ALL);
GCLogin.getInstance().login();
final MapTokens tokens = GCLogin.getInstance().getMapTokens();
{
final Viewport viewport = new Viewport(new Geopoint("N 52° 25.369 E 9° 35.499"), new Geopoint("N 52° 25.600 E 9° 36.200"));
final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport, tokens);
assertThat(searchResult).isNotNull();
assertThat(searchResult.isEmpty()).isFalse();
assertThat(searchResult.getGeocodes()).contains("GC4ER5H");
}
{
final Viewport viewport = new Viewport(new Geopoint("N 52° 24.000 E 9° 34.500"), new Geopoint("N 52° 26.000 E 9° 38.500"));
final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport, tokens);
assertThat(searchResult).isNotNull();
assertThat(searchResult.getGeocodes()).contains("GC4ER5H");
}
} finally {
// restore user settings
TestSettings.setExcludeMine(excludeMine);
Settings.setCacheType(cacheType);
}
}
public static void testCanHandle() {
assertCanHandle("GC2MEGA").isTrue();
assertCanHandle("OXZZZZZ").isFalse();
assertCanHandle("gc77").isTrue();
}
public static void testGeocodeForbiddenChars() {
assertCanHandle("GC123").isTrue();
assertCanHandle("GC123M").isTrue();
assertCanHandle("GC123L").overridingErrorMessage("L is not allowed in GC codes").isFalse();
}
private static AbstractBooleanAssert<?> assertCanHandle(final String geocode) {
return assertThat(GCConnector.getInstance().canHandle(geocode));
}
/**
* functionality moved to {@link TravelBugConnector}
*/
public static void testCanNotHandleTrackablesAnymore() {
assertCanHandle("TB3F651").isFalse();
}
public static void testBaseCodings() {
assertThat(GCConstants.gccodeToGCId("GC2MEGA")).isEqualTo(2045702);
}
public static void testBaseCodingsNull() {
assertThat(GCConstants.gccodeToGCId(null)).isEqualTo(0);
}
/** Tile computation with different zoom levels */
public static void testTile() {
// http://coord.info/GC2CT8K = N 52° 30.462 E 013° 27.906
assertTileAt(8804, 5374, new Tile(new Geopoint(52.5077, 13.4651), 14));
// (8633, 5381); N 52° 24,516 E 009° 42,592
assertTileAt(8633, 5381, new Tile(new Geopoint("N 52° 24,516 E 009° 42,592"), 14));
// Hannover, GC22VTB UKM Memorial Tour
assertTileAt(2159, 1346, new Tile(new Geopoint("N 52° 22.177 E 009° 45.385"), 12));
// Seattle, GCK25B Groundspeak Headquarters
assertTileAt(5248, 11440, new Tile(new Geopoint("N 47° 38.000 W 122° 20.000"), 15));
// Sydney, GCXT2R Victoria Cross
assertTileAt(7536, 4915, new Tile(new Geopoint("S 33° 50.326 E 151° 12.426"), 13));
}
private static void assertTileAt(final int x, final int y, final Tile tile) {
assertThat(tile.getX()).isEqualTo(x);
assertThat(tile.getY()).isEqualTo(y);
}
public static void testGetGeocodeFromUrl() {
assertThat(GCConnector.getInstance().getGeocodeFromUrl("some string")).isNull();
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://coord.info/GC12ABC")).isEqualTo("GC12ABC");
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://www.coord.info/GC12ABC")).isEqualTo("GC12ABC");
assertThat(GCConnector.getInstance().getGeocodeFromUrl("https://www.geocaching.com/geocache/GC12ABC_die-muhlen-im-schondratal-muhle-munchau")).isEqualTo("GC12ABC");
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://geocaching.com/geocache/GC12ABC_die-muhlen-im-schondratal-muhle-munchau")).isEqualTo("GC12ABC");
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://coord.info/TB1234")).isNull();
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://www.coord.info/TB1234")).isNull();
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://www.coord.info/WM1234")).isNull();
// uppercase is managed in ConnectorFactory
assertThat(GCConnector.getInstance().getGeocodeFromUrl("http://coord.info/gc77")).isEqualTo("gc77");
}
public static void testHandledGeocodes() {
final Set<String> geocodes = ConnectorFactoryTest.getGeocodeSample();
assertThat(GCConnector.getInstance().handledGeocodes(geocodes)).containsOnly("GC1234", "GC5678");
}
public static void testIsChallengeCache() {
assertIsChallengeCache("Some Challenge Cache", CacheType.MYSTERY).isTrue();
assertIsChallengeCache("Some None Challenge Traditional", CacheType.TRADITIONAL).isFalse();
assertIsChallengeCache("Some ordinary Mystery", CacheType.MYSTERY).isFalse();
}
private static AbstractBooleanAssert<?> assertIsChallengeCache(final String name, final CacheType type) {
final Geocache geocache = new Geocache();
geocache.setName(name);
geocache.setType(type);
return assertThat(GCConnector.getInstance().isChallengeCache(geocache));
}
}