package org.wordpress.biowiki;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.sqlite.SQLiteDatabase;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import com.google.gson.internal.StringMap;
import kr.kdev.dg1s.biowiki.BioWiki;
import kr.kdev.dg1s.biowiki.BioWikiDB;
import kr.kdev.dg1s.biowiki.util.DateTimeUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
public class TestUtils {
private static String DATABASE_NAME = "wordpress";
public static SQLiteDatabase loadDBFromDump(Context targetContext, Context testContext, String filename) {
BioWiki.wpDB = new BioWikiDB(targetContext);
Field dbField;
try {
dbField = BioWikiDB.class.getDeclaredField("db");
dbField.setAccessible(true);
SQLiteDatabase db = (SQLiteDatabase) dbField.get(BioWiki.wpDB);
assertNotNull(db);
// delete and recreate DB
targetContext.deleteDatabase(DATABASE_NAME);
targetContext.openOrCreateDatabase(DATABASE_NAME, 0, null);
// Load file
InputStream is = testContext.getAssets().open(filename);
InputStreamReader inputStreamReader = new InputStreamReader(is);
BufferedReader f = new BufferedReader(inputStreamReader);
for (String line = f.readLine(); line != null; line = f.readLine()) {
if (TextUtils.isEmpty(line)) continue;
try {
db.execSQL(line);
} catch (android.database.sqlite.SQLiteException e ) {
// ignore import errors
}
}
f.close();
return db;
} catch (NoSuchFieldException e) {
assertTrue(e.toString(), false);
} catch (IllegalAccessException e) {
assertTrue(e.toString(), false);
} catch (IOException e) {
assertTrue(e.toString(), false);
}
return null;
}
public static void clearDefaultSharedPreferences(Context targetContext) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(targetContext);
Editor editor = settings.edit();
editor.clear();
editor.commit();
}
public static void dropDB(Context targetContext) {
targetContext.deleteDatabase(DATABASE_NAME);
}
public static void clearApplicationState(Context context) {
BioWiki.currentBlog = null;
if (BioWiki.getContext() != null) {
BioWiki.signOut(context);
}
TestUtils.clearDefaultSharedPreferences(context);
TestUtils.dropDB(context);
}
public static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
public static HashMap<String, Object> stringMapToHashMap(StringMap<?> stringMap) {
HashMap<String, Object> res = new HashMap<String, Object>();
for (String key : stringMap.keySet()) {
Object value = stringMap.get(key);
if (StringMap.class.isInstance(value)) {
HashMap<String, Object> newValue = stringMapToHashMap((StringMap<?>) value);
res.put(key, newValue);
} else {
res.put(key, value);
}
}
return res;
}
public static Date gsonStringToJavaDate(final String strDate) {
try {
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a", Locale.ENGLISH);
return df.parse(strDate);
} catch (ParseException e) {
return null;
}
}
public static Date parseStringToDate(String value) {
// try do parseit as a Date
Date newValue = DateTimeUtils.iso8601ToJavaDate(value);
if (newValue != null) {
return newValue;
}
newValue = gsonStringToJavaDate(value);
if (newValue != null) {
return newValue;
}
return null;
}
public static Object castIt(Object value) {
if (value instanceof HashMap) {
return injectDateInHashMap((HashMap<String, Object>) value);
} else if (value instanceof String) {
Date newValue = parseStringToDate((String) value);
if (newValue != null) {
return newValue;
} else {
return value;
}
} else if (value instanceof Double) {
return (int) Math.round((Double) value);
} else if (value instanceof Object[]) {
return injectDateInArray((Object[]) value);
} else if (value instanceof StringMap) {
return injectDateInHashMap(stringMapToHashMap((StringMap) value));
}
return value;
}
public static Object[] injectDateInArray(Object[] array) {
HashSet<Object> res = new HashSet<Object>();
for (Object value : array) {
res.add(castIt(value));
}
return res.toArray();
}
public static HashMap<String, Object> injectDateInHashMap(HashMap<String, Object> hashMap) {
HashMap<String, Object> res = new HashMap<String, Object>();
for (String key : hashMap.keySet()) {
Object value = hashMap.get(key);
res.put(key, castIt(value));
}
return res;
}
}