package de.blau.android.osm;
import java.util.HashMap;
import java.util.SortedMap;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import de.blau.android.App;
import de.blau.android.Logic;
import de.blau.android.Main;
import de.blau.android.exception.OsmIllegalOperationException;
import de.blau.android.prefs.Preferences;
import de.blau.android.resources.TileLayerServer;
@RunWith(AndroidJUnit4.class)
@LargeTest
public class BasicStuffTest {
Context context = null;
Main main = null;
@Rule
public ActivityTestRule<Main> mActivityRule = new ActivityTestRule<>(Main.class);
@Before
public void setup() {
context = InstrumentationRegistry.getInstrumentation().getTargetContext();
main = mActivityRule.getActivity();
Preferences prefs = new Preferences(context);
prefs.setBackGroundLayer(TileLayerServer.LAYER_NONE); // try to avoid downloading tiles
main.getMap().setPrefs(main, prefs);
App.getDelegator().reset(false);
App.getDelegator().setOriginalBox(BoundingBox.getMaxMercatorExtent());
}
@After
public void teardown() {
}
@Test
public void setTags() {
//
Logic logic = App.getLogic();
logic.setSelectedWay(null);
logic.setSelectedNode(null);
logic.setSelectedRelation(null);
// nodes
try {
logic.performAdd(null, 100.0f, 100.0f);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Node n = logic.getSelectedNode();
Assert.assertNotNull(n);
System.out.println(n);
Assert.assertEquals(1, App.getDelegator().getApiNodeCount());
OsmElementFactory factory = App.getDelegator().getFactory();
Node n2 = factory.createNodeWithNewId(0, 0);
setTagsElement(logic, n, n2);
// ways
try {
logic.performAdd(null,150.0f, 150.0f);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Way w = logic.getSelectedWay();
Assert.assertNotNull(w);
System.out.println(w);
Assert.assertEquals(1, App.getDelegator().getApiWayCount());
Way w2 = factory.createWayWithNewId(); // node-less way!
setTagsElement(logic, w, w2);
// FIXME do the same for relations
}
private void setTagsElement(Logic logic, OsmElement eInStorage, OsmElement eNotInStorage) {
String key1 = "key1";
String value1 = "value1";
String key2 = "key2";
String value2 = "value2";
Assert.assertFalse(eInStorage.hasTags());
HashMap<String,String>tags = new HashMap<String,String>();
tags.put(key1, value1);
// new form
try {
logic.setTags(main, eInStorage, tags);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Assert.assertTrue(eInStorage.hasTags());
Assert.assertTrue(eInStorage.hasTagKey(key1));
Assert.assertTrue(eInStorage.hasTag(key1,value1));
Assert.assertEquals(value1, eInStorage.getTagWithKey(key1));
SortedMap<String, String> m = eInStorage.getTags();
try {
m.put(key2, value2);
Assert.fail("Map returned from getTags should be immutable");
} catch (UnsupportedOperationException ex) {
// just carry on
}
tags.clear();
tags.putAll(m);
tags.put(key2, value2);
try {
logic.setTags(main, eInStorage, tags);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Assert.assertTrue(eInStorage.hasTags());
Assert.assertTrue(eInStorage.hasTagKey(key1));
Assert.assertTrue(eInStorage.hasTag(key1,value1));
Assert.assertEquals(value1, eInStorage.getTagWithKey(key1));
Assert.assertTrue(eInStorage.hasTagKey(key2));
Assert.assertTrue(eInStorage.hasTag(key2,value2));
Assert.assertEquals(value2, eInStorage.getTagWithKey(key2));
try {
logic.setTags(main, eInStorage, null);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Assert.assertFalse(eInStorage.hasTags());
// old form
try {
logic.setTags(main, eInStorage.getName(),eInStorage.getOsmId(), tags);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Assert.assertTrue(eInStorage.hasTags());
Assert.assertTrue(eInStorage.hasTagKey(key1));
Assert.assertTrue(eInStorage.hasTag(key1,value1));
Assert.assertEquals(value1, eInStorage.getTagWithKey(key1));
try {
logic.setTags(main, eInStorage.getName(),eInStorage.getOsmId(), null);
} catch (OsmIllegalOperationException e) {
Assert.fail(e.getMessage());
}
Assert.assertFalse(eInStorage.hasTags());
//
try {
logic.setTags(main, eNotInStorage, tags);
Assert.fail("Element not in storage should fail");
} catch (OsmIllegalOperationException e) {
// carry on
}
try {
logic.setTags(main, eNotInStorage.getName(),eNotInStorage.getOsmId(), tags);
Assert.fail("Element not in storage should fail");
} catch (OsmIllegalOperationException e) {
// carry on
}
}
}