package com.mapzen.pelias;
import com.mapzen.pelias.widget.AutoCompleteItem;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import android.database.Cursor;
import android.os.Parcel;
import java.util.Iterator;
import java.util.List;
import static com.mapzen.pelias.SavedSearch.MAX_ENTRIES;
import static com.mapzen.pelias.SimpleFeatureTest.getTestSimpleFeature;
import static org.fest.assertions.api.Assertions.assertThat;
@RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = 21)
public class SavedSearchTest {
SavedSearch savedSearch;
Parcel payload;
@Before public void setUp() throws Exception {
savedSearch = new SavedSearch();
savedSearch.clear();
payload = Parcel.obtain();
getTestSimpleFeature().writeToParcel(payload, 0);
payload.setDataPosition(0);
}
@Test public void store_shouldHaveNullPayload() throws Exception {
savedSearch.store("term");
assertThat(savedSearch.get(0).getPayload()).isNull();
}
@Test public void store_shouldHaveNullPayloadAfterSerialize() throws Exception {
savedSearch.store("term");
String serialized = savedSearch.serialize();
savedSearch.clear();
savedSearch.deserialize(serialized);
assertThat(savedSearch.get(0).getPayload()).isNull();
}
@Test public void payloadShouldBeHealthy() throws Exception {
savedSearch.store("term", payload);
String serialized = savedSearch.serialize();
savedSearch.clear();
savedSearch.deserialize(serialized);
SimpleFeature feature = SimpleFeature.readFromParcel(savedSearch.get(0).getPayload());
assertThat(feature.id()).isNotNull();
}
@Test public void store_updateRecordWithPayload() throws Exception {
savedSearch.store("term");
savedSearch.store("term", payload);
assertThat(savedSearch.get(0).getPayload()).isNotNull();
assertThat(countTerms(savedSearch.getIterator())).isEqualTo(1);
}
@Test public void store_shouldStoreThingsAtTop() throws Exception {
savedSearch.store("search1");
savedSearch.store("search2", payload);
savedSearch.store("expected");
assertThat(savedSearch.getSubIterator(2).next().getTerm()).isEqualTo("expected");
}
@Test public void store_shouldStoreMaximumNumberOfElements() throws Exception {
for (int i = 0; i < MAX_ENTRIES + 3; i++) {
savedSearch.store(String.valueOf(i));
}
assertThat(countTerms(savedSearch.getSubIterator(MAX_ENTRIES + 10))).isEqualTo(MAX_ENTRIES);
}
@Test public void store_shouldEvictOldEntriesWhenMaxReached() throws Exception {
savedSearch.store("search1");
for (int i = 0; i < MAX_ENTRIES; i++) {
savedSearch.store(String.valueOf(i));
}
Iterator<SavedSearch.Member> it = savedSearch.getSubIterator(MAX_ENTRIES);
while (it.hasNext()) {
assertThat(it.next().getTerm()).isNotEqualTo("search1");
}
}
@Test public void store_shouldNotStoreExistingTerms() throws Exception {
savedSearch.store("expected");
savedSearch.store("search1", payload);
savedSearch.store("search2");
savedSearch.store("expected");
assertThat(countTerms(savedSearch.getSubIterator(MAX_ENTRIES))).isEqualTo(3);
}
@Test public void store_shouldUpdateEntriesWithPayload() throws Exception {
Parcel newPayload = Parcel.obtain();
SimpleFeature expectedFeature = getTestSimpleFeature("New SimpleFeature");
expectedFeature.writeToParcel(newPayload, 0);
newPayload.setDataPosition(0);
savedSearch.store("expected", payload);
savedSearch.store("expected", newPayload);
SavedSearch.Member member = savedSearch.getIterator().next();
SimpleFeature simpleFeature = SimpleFeature.readFromParcel(member.getPayload());
assertThat(simpleFeature.name()).isEqualTo(expectedFeature.name());
assertThat(countTerms(savedSearch.getSubIterator(MAX_ENTRIES))).isEqualTo(1);
}
@Test public void store_shouldPutExistingTermsAtTheTop() throws Exception {
savedSearch.store("expected");
savedSearch.store("search1");
savedSearch.store("search2");
savedSearch.store("expected", payload);
assertThat(savedSearch.getSubIterator(1).next().getTerm()).isEqualTo("expected");
}
@Test public void get_shouldReturnDefaultNumberOfTerms() throws Exception {
savedSearch.store("search1");
savedSearch.store("search2", payload);
savedSearch.store("search3");
savedSearch.store("search4");
assertThat(countTerms(savedSearch.getIterator())).isEqualTo(SavedSearch.DEFAULT_SIZE);
}
@Test public void get_shouldReturnRequestedNumberOfTerms() throws Exception {
savedSearch.store("search1");
savedSearch.store("search2", payload);
savedSearch.store("search3");
assertThat(countTerms(savedSearch.getSubIterator(1))).isEqualTo(1);
}
@Test public void get_shouldReturnEmptyList() throws Exception {
assertThat(savedSearch.getIterator().hasNext()).isFalse();
}
@Test public void isEmpty_shouldBeTrue() {
assertThat(savedSearch.isEmpty()).isTrue();
}
@Test public void isEmpty_shouldBeFalse() {
savedSearch.store("search1");
savedSearch.store("search2", payload);
savedSearch.store("search3");
assertThat(savedSearch.isEmpty()).isFalse();
}
@Test public void clearShouldEmptyCollection() throws Exception {
savedSearch.store("search1");
savedSearch.store("search2", payload);
savedSearch.store("search3");
savedSearch.clear();
assertThat(savedSearch.getIterator().hasNext()).isFalse();
}
@Test public void shouldBeSerializable() throws Exception {
savedSearch.store("search1");
savedSearch.store("search2", payload);
savedSearch.store("expected");
String serialized = savedSearch.serialize();
savedSearch.clear();
assertThat(savedSearch.getIterator().hasNext()).isFalse();
savedSearch.deserialize(serialized);
Iterator<SavedSearch.Member> it = savedSearch.getIterator();
assertThat(it.next().getTerm()).isEqualTo("expected");
assertThat(it.next().getTerm()).isEqualTo("search2");
assertThat(it.next().getTerm()).isEqualTo("search1");
}
@Test public void deserialize_shouldHandleEmptyString() throws Exception {
String serialized = savedSearch.serialize();
savedSearch.clear();
assertThat(savedSearch.getIterator().hasNext()).isFalse();
savedSearch.deserialize(serialized);
Iterator<SavedSearch.Member> it = savedSearch.getIterator();
assertThat(it.hasNext()).isFalse();
}
@Test public void deserialize_shouldHandleNull() throws Exception {
savedSearch.deserialize(null);
Iterator<SavedSearch.Member> it = savedSearch.getIterator();
assertThat(it.hasNext()).isFalse();
}
@Test public void getCursor_shouldReturnCursorWithSavedSearchTerms() throws Exception {
savedSearch.store("saved query 1");
savedSearch.store("saved query 2", payload);
savedSearch.store("saved query 3");
Cursor cursor = savedSearch.getCursor();
assertThat(cursor.getCount()).isEqualTo(3);
cursor.moveToFirst();
assertThat(cursor.getString(1)).isEqualTo("saved query 3");
cursor.moveToNext();
assertThat(cursor.getString(1)).isEqualTo("saved query 2");
cursor.moveToNext();
assertThat(cursor.getString(1)).isEqualTo("saved query 1");
}
@Test public void deserialize_shouldClearStoreBeforeLoadingTerms() throws Exception {
savedSearch.store("saved query");
String serialized = savedSearch.serialize();
savedSearch.deserialize(serialized);
assertThat(savedSearch.size()).isEqualTo(1);
}
@Test public void getTerms_shouldReturnTextList() throws Exception {
savedSearch.store("term 1");
savedSearch.store("term 2");
savedSearch.store("term 3");
assertThat(savedSearch.getTerms()).hasSize(3);
assertThat(savedSearch.getTerms().get(0)).isEqualTo("term 3");
assertThat(savedSearch.getTerms().get(1)).isEqualTo("term 2");
assertThat(savedSearch.getTerms().get(2)).isEqualTo("term 1");
}
@Test public void getItems_shouldReturnAutoCompleteItemsWithSimpleFeature() throws Exception {
savedSearch.store(getTestSimpleFeature().label(), payload);
savedSearch.store("term 2");
savedSearch.store("term 3");
List<AutoCompleteItem> items = savedSearch.getItems();
assertThat(items).hasSize(3);
assertThat(items.get(0).getText()).isEqualTo("term 3");
assertThat(items.get(1).getText()).isEqualTo("term 2");
assertThat(items.get(2).getText()).isEqualTo(getTestSimpleFeature().label());
assertThat(items.get(0).getSimpleFeature()).isEqualTo(null);
assertThat(items.get(1).getSimpleFeature()).isEqualTo(null);
assertThat(items.get(2).getSimpleFeature()).isEqualTo(getTestSimpleFeature());
}
private int countTerms(Iterator<SavedSearch.Member> results) {
int count = 0;
while (results.hasNext()) {
results.next();
count++;
}
return count;
}
}