package com.quran.labs.androidquran.model.translation;
import android.content.Context;
import com.quran.labs.androidquran.dao.Bookmark;
import com.quran.labs.androidquran.dao.BookmarkWithAyahText;
import com.quran.labs.androidquran.database.DatabaseHandler;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.google.common.truth.Truth.assertThat;
public class ArabicDatabaseUtilsTest {
@Mock Context context;
@Mock DatabaseHandler arabicHandler;
@Before
public void setup() {
MockitoAnnotations.initMocks(ArabicDatabaseUtilsTest.this);
}
@Test
public void testHydrateAyahText() {
ArabicDatabaseUtils arabicDatabaseUtils = new ArabicDatabaseUtils(context) {
@Override
DatabaseHandler getArabicDatabaseHandler() {
return arabicHandler;
}
@Override
Map<Integer, String> getAyahTextForAyat(List<Integer> ayat) {
Map<Integer, String> result = new HashMap<>();
for (Integer ayahId : ayat) {
result.put(ayahId, "verse " + ayahId);
}
return result;
}
};
List<Bookmark> bookmarks = new ArrayList<>(3);
bookmarks.add(new Bookmark(1, 1, 1, 1));
bookmarks.add(new Bookmark(2, null, null, 3));
bookmarks.add(new Bookmark(3, 114, 6, 604));
List<Bookmark> result = arabicDatabaseUtils.hydrateAyahText(bookmarks);
assertThat(result).hasSize(3);
assertThat(result.get(0)).isInstanceOf(BookmarkWithAyahText.class);
assertThat(result.get(1)).isNotInstanceOf(BookmarkWithAyahText.class);
assertThat(result.get(2)).isInstanceOf(BookmarkWithAyahText.class);
assertThat(result.get(0).getAyahText()).isNotEmpty();
assertThat(result.get(1).getAyahText()).isNull();
assertThat(result.get(0).getAyahText()).isNotEmpty();
assertThat(result).isNotSameAs(bookmarks);
}
@Test
public void testHydrateAyahTextEmpty() {
ArabicDatabaseUtils arabicDatabaseUtils = new ArabicDatabaseUtils(context) {
@Override
DatabaseHandler getArabicDatabaseHandler() {
return arabicHandler;
}
@Override
Map<Integer, String> getAyahTextForAyat(List<Integer> ayat) {
Map<Integer, String> result = new HashMap<>();
for (Integer ayahId : ayat) {
result.put(ayahId, "verse " + ayahId);
}
return result;
}
};
List<Bookmark> bookmarks = new ArrayList<>(1);
bookmarks.add(new Bookmark(1, null, null, 3));
List<Bookmark> result = arabicDatabaseUtils.hydrateAyahText(bookmarks);
assertThat(result).hasSize(1);
assertThat(result.get(0)).isNotInstanceOf(BookmarkWithAyahText.class);
assertThat(result.get(0).getAyahText()).isNull();
assertThat(result).isSameAs(bookmarks);
}
@Test
public void testGetFirstFewWordsFromAyah() {
int total = ArabicDatabaseUtils.NUMBER_OF_WORDS;
for (int i = 1; i < total; i++) {
String text = makeText(i);
assertThat(ArabicDatabaseUtils.getFirstFewWordsFromAyah(4, 1, text)).isSameAs(text);
}
String veryLongString = makeText(100);
assertThat(ArabicDatabaseUtils.getFirstFewWordsFromAyah(4, 1, veryLongString))
.isEqualTo(makeText(4));
}
private String makeText(int words) {
String result = "";
for (int i=0; i < words; i++) {
if (i > 0) {
result += " ";
}
result += "word" + i;
}
return result;
}
@Test
public void testGetAyahWithoutBasmallah() {
String basmallah = ArabicDatabaseUtils.AR_BASMALLAH;
String original = basmallah + " first ayah";
assertThat(ArabicDatabaseUtils.getAyahWithoutBasmallah(1, 1, original)).isSameAs(original);
assertThat(ArabicDatabaseUtils.getAyahWithoutBasmallah(9, 1, original)).isSameAs(original);
assertThat(ArabicDatabaseUtils.getAyahWithoutBasmallah(4, 4, original)).isSameAs(original);
assertThat(ArabicDatabaseUtils
.getAyahWithoutBasmallah(4, 1, original)).isEqualTo("first ayah");
assertThat(ArabicDatabaseUtils.getAyahWithoutBasmallah(4, 1, "first ayah"))
.isEqualTo("first ayah");
}
}