package co.smartreceipts.android.settings;
import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.TypedValue;
import com.tom_roush.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.Locale;
import co.smartreceipts.android.settings.catalog.UserPreference;
import co.smartreceipts.android.utils.TestUtils;
import io.reactivex.schedulers.Schedulers;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
public class UserPreferenceManagerTest {
// Class under test
UserPreferenceManager userPreferenceManager;
SharedPreferences preferences;
Locale defaultLocale;
@Before
public void setUp() {
defaultLocale = Locale.getDefault();
preferences = PreferenceManager.getDefaultSharedPreferences(RuntimeEnvironment.application);
userPreferenceManager = new UserPreferenceManager(RuntimeEnvironment.application, preferences, Schedulers.trampoline());
}
@After
public void tearDown() {
Locale.setDefault(defaultLocale);
preferences.edit().clear().apply();
}
@Test
public void initialize() {
userPreferenceManager.initialize();
// Just confirm that we properly apply the default values for these special cases
assertTrue(preferences.contains(RuntimeEnvironment.application.getString(UserPreference.General.DateSeparator.getName())));
assertTrue(preferences.contains(RuntimeEnvironment.application.getString(UserPreference.General.DefaultCurrency.getName())));
assertTrue(preferences.contains(RuntimeEnvironment.application.getString(UserPreference.Receipts.MinimumReceiptPrice.getName())));
assertEquals(-Float.MAX_VALUE, preferences.getFloat(RuntimeEnvironment.application.getString(UserPreference.Receipts.MinimumReceiptPrice.getName()), 0), TestUtils.EPSILON);
}
@Test
public void initializeForBadLocale() {
Locale.setDefault(new Locale(""));
userPreferenceManager.initialize();
// Just confirm that we properly apply the default values for these special cases
assertTrue(preferences.contains(RuntimeEnvironment.application.getString(UserPreference.General.DefaultCurrency.getName())));
assertEquals("USD", preferences.getString(RuntimeEnvironment.application.getString(UserPreference.General.DefaultCurrency.getName()), null));
}
@Test
public void getInteger() {
final UserPreference<Integer> intPreference = UserPreference.General.DefaultReportDuration;
final int intVal = RuntimeEnvironment.application.getResources().getInteger(intPreference.getDefaultValue());
assertEquals(intVal, (long) userPreferenceManager.get(intPreference));
userPreferenceManager.getObservable(intPreference)
.test()
.assertValue(intVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void getBoolean() {
final UserPreference<Boolean> booleanPreference = UserPreference.Receipts.UsePaymentMethods;
final boolean boolVal = RuntimeEnvironment.application.getResources().getBoolean(booleanPreference.getDefaultValue());
assertEquals(boolVal, userPreferenceManager.get(booleanPreference));
userPreferenceManager.getObservable(booleanPreference)
.test()
.assertValue(boolVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void getString() {
final UserPreference<String> stringPreference = UserPreference.PlusSubscription.PdfFooterString;
final String stringVal = RuntimeEnvironment.application.getString(stringPreference.getDefaultValue());
assertEquals(stringVal, userPreferenceManager.get(stringPreference));
userPreferenceManager.getObservable(stringPreference)
.test()
.assertValue(stringVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void getFloat() {
final UserPreference<Float> floatPreference = UserPreference.Receipts.DefaultTaxPercentage;
final TypedValue typedValue = new TypedValue();
RuntimeEnvironment.application.getResources().getValue(floatPreference.getDefaultValue(), typedValue, true);
final float floatVal = typedValue.getFloat();
assertEquals(floatVal, userPreferenceManager.get(floatPreference), TestUtils.EPSILON);
userPreferenceManager.getObservable(floatPreference)
.test()
.assertValue(floatVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void setInteger() {
final UserPreference<Integer> intPreference = UserPreference.General.DefaultReportDuration;
final int intVal = 999;
userPreferenceManager.set(intPreference, 999);
assertEquals(intVal, (long) userPreferenceManager.get(intPreference));
userPreferenceManager.setObservable(intPreference, intVal)
.test()
.assertValue(intVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void setBoolean() {
final UserPreference<Boolean> booleanPreference = UserPreference.Receipts.UsePaymentMethods;
final boolean boolVal = true;
userPreferenceManager.set(booleanPreference, boolVal);
assertEquals(boolVal, userPreferenceManager.get(booleanPreference));
userPreferenceManager.setObservable(booleanPreference, boolVal)
.test()
.assertValue(boolVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void setString() {
final UserPreference<String> stringPreference = UserPreference.PlusSubscription.PdfFooterString;
final String stringVal = "test";
userPreferenceManager.set(stringPreference, stringVal);
assertEquals(stringVal, userPreferenceManager.get(stringPreference));
userPreferenceManager.setObservable(stringPreference, stringVal)
.test()
.assertValue(stringVal)
.assertComplete()
.assertNoErrors();
}
@Test
public void setFloat() {
final UserPreference<Float> floatPreference = UserPreference.Receipts.DefaultTaxPercentage;
final float floatVal = 55.5f;
userPreferenceManager.set(floatPreference, floatVal);
assertEquals(floatVal, userPreferenceManager.get(floatPreference), TestUtils.EPSILON);
userPreferenceManager.setObservable(floatPreference, floatVal)
.test()
.assertValue(floatVal)
.assertComplete()
.assertNoErrors();
}
}