package com.mixpanel.android.mpmetrics; import android.test.AndroidTestCase; import java.util.Map; public class TweaksTest extends AndroidTestCase { @Override public void setUp() { mTweaks = new Tweaks(); mTweakDeclaredCount = 0; mTweaks.addOnTweakDeclaredListener(new Tweaks.OnTweakDeclaredListener() { @Override public void onTweakDeclared() { mTweakDeclaredCount++; } }); } public void testDontCallUntilDeclared() { assertEquals(0, mTweakDeclaredCount); } public void testStringTweak() { final Tweak<String> tweak = mTweaks.stringTweak("subject", "default"); assertEquals("default", tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", "changed"); assertEquals("changed", tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testFloatTweak() { float defaultValue = 1.0f; float changedValue = 2.0f; final Tweak<Float> tweak = mTweaks.floatTweak("subject", defaultValue); assertEquals(defaultValue, (float) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (float) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testDoubleTweak() { double defaultValue = 1.0d; double changedValue = 2.0d; final Tweak<Double> tweak = mTweaks.doubleTweak("subject", defaultValue); assertEquals(defaultValue, (double) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (double) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testByteTweak() { byte defaultValue = 1; byte changedValue = 2; final Tweak<Byte> tweak = mTweaks.byteTweak("subject", defaultValue); assertEquals(defaultValue, (byte) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (byte) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testShortTweak() { short defaultValue = 1; short changedValue = 2; final Tweak<Short> tweak = mTweaks.shortTweak("subject", defaultValue); assertEquals(defaultValue, (short) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (short) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testIntTweak() { int defaultValue = 1; int changedValue = 2; final Tweak<Integer> tweak = mTweaks.intTweak("subject", defaultValue); assertEquals(defaultValue, (int) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (int) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testLongTweak() { long defaultValue = 1; long changedValue = 2; final Tweak<Long> tweak = mTweaks.longTweak("subject", defaultValue); assertEquals(defaultValue, (long) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (long) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testBooleanTweak() { boolean defaultValue = true; boolean changedValue = false; final Tweak<Boolean> tweak = mTweaks.booleanTweak("subject", defaultValue); assertEquals(defaultValue, (boolean) tweak.get()); assertEquals(1, mTweakDeclaredCount); mTweaks.set("subject", changedValue); assertEquals(changedValue, (boolean) tweak.get()); assertEquals(1, mTweakDeclaredCount); } public void testStringBadType() { final Tweak<String> tweak = mTweaks.stringTweak("subject", "default"); mTweaks.set("subject", 32); assertEquals("default", tweak.get()); } public void testFloatBadType() { float defaultValue = 1.0f; String badValue = "BAD"; final Tweak<Float> tweak = mTweaks.floatTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(defaultValue, tweak.get()); } public void testDoubleBadType() { double defaultValue = 1.0d; String badValue = "BAD"; final Tweak<Double> tweak = mTweaks.doubleTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(defaultValue, tweak.get()); } public void testByteBadType() { byte defaultValue = 1; String badValue = "BAD"; final Tweak<Byte> tweak = mTweaks.byteTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(1, (byte) tweak.get()); } public void testShortBadType() { short defaultValue = 1; String badValue = "BAD"; final Tweak<Short> tweak = mTweaks.shortTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(defaultValue, (short) tweak.get()); } public void testIntBadType() { int defaultValue = 1; String badValue = "BAD"; final Tweak<Integer> tweak = mTweaks.intTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(defaultValue, (int) tweak.get()); } public void testLongBadType() { long defaultValue = 1; String badValue = "BAD"; final Tweak<Long> tweak = mTweaks.longTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(defaultValue, (long) tweak.get()); } public void testBooleanBadType() { boolean defaultValue = true; String badValue = "BAD"; final Tweak<Boolean> tweak = mTweaks.booleanTweak("subject", defaultValue); mTweaks.set("subject", badValue); assertEquals(defaultValue, (boolean) tweak.get()); } public void testStringNullDefault() { final Tweak<String> tweak = mTweaks.stringTweak("subject", null); assertNull(tweak.get()); } public void testSetStringNull() { final String defaultValue = "default"; final Tweak<String> tweak = mTweaks.stringTweak("subject", defaultValue); mTweaks.set("subject", null); assertNull(tweak.get()); } public void testSetBooleanNull() { final boolean defaultValue = true; final Tweak<Boolean> tweak = mTweaks.booleanTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, (boolean) tweak.get()); } public void testSetDoubleNull() { final double defaultValue = 1.0d; final Tweak<Double> tweak = mTweaks.doubleTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, tweak.get()); } public void testSetFloatNull() { final float defaultValue = 1.0f; final Tweak<Float> tweak = mTweaks.floatTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, tweak.get()); } public void testSetByteNull() { final byte defaultValue = 1; final Tweak<Byte> tweak = mTweaks.byteTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, (byte) tweak.get()); } public void testSetShortNull() { final short defaultValue = 1; final Tweak<Short> tweak = mTweaks.shortTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, (short) tweak.get()); } public void testSetIntNull() { final int defaultValue = 1; final Tweak<Integer> tweak = mTweaks.intTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, (int) tweak.get()); } public void testSetLongNull() { final long defaultValue = 1; final Tweak<Long> tweak = mTweaks.longTweak("subject", defaultValue); mTweaks.set("subject", null); assertEquals(defaultValue, (long) tweak.get()); } public void testIntegralOverflow() { final byte defaultValue = 1; final Tweak<Byte> tweak = mTweaks.byteTweak("subject", defaultValue); mTweaks.set("subject", Long.MAX_VALUE); assertTrue(0 != tweak.get()); } public void testNumberCoercion() { final Tweak<Byte> byteTweak = mTweaks.byteTweak("subject", (byte) 1); mTweaks.set("subject", 1.0d); assertEquals(1, (byte) byteTweak.get()); final Tweak<Float> floatTweak = mTweaks.floatTweak("subject", 1.0f); mTweaks.set("subject", 1); assertEquals(1.0f, floatTweak.get()); } public void testDuplicateTweakDeclared() { // First tweak wins for default values. Since strings can't be coerced into numbers // the numbers should be the global defaults (NOT the defaults set in the calls) final Tweak<String> stringTweak1 = mTweaks.stringTweak("subject1", "Yup"); final Tweak<Byte> byteTweak1 = mTweaks.byteTweak("subject1", (byte) 1); final Tweak<Float> floatTweak1 = mTweaks.floatTweak("subject1", 3.0f); final Tweak<Boolean> booleanTweak1 = mTweaks.booleanTweak("subject1", true); assertEquals("Yup", stringTweak1.get()); assertEquals(0, (byte) byteTweak1.get()); assertEquals(0.0f, floatTweak1.get()); assertEquals(false, (boolean) booleanTweak1.get()); // Can't coerce 22 into a string, so use global string default final Tweak<Integer> intTweak2 = mTweaks.intTweak("subject2", 22); final Tweak<String> stringTweak2 = mTweaks.stringTweak("subject2", "Oh Yeah!"); final Tweak<Boolean> booleanTweak = mTweaks.booleanTweak("subject2", true); assertEquals(22, (int) intTweak2.get()); assertNull(stringTweak2.get()); // We expect a default of 22 and a value of "Now a string" mTweaks.set("subject2", "Now a string"); assertEquals("Now a string", stringTweak2.get()); assertEquals(22, (int) intTweak2.get()); assertEquals(false, (boolean) booleanTweak.get()); mTweaks.set("subject2", true); assertEquals(22, (int) intTweak2.get()); assertEquals(null, stringTweak2.get()); assertEquals(true, (boolean) booleanTweak.get()); } public void testAllTweakValues() { final Tweak<String> stringTweak1 = mTweaks.stringTweak("a", "Yup"); final Tweak<Byte> byteTweak1 = mTweaks.byteTweak("b", (byte) 7); final Tweak<Float> floatTweak1 = mTweaks.floatTweak("c", 3.0f); final Tweak<Boolean> booleanTweak1 = mTweaks.booleanTweak("d", true); final Map<String, Tweaks.TweakValue> allValues1 = mTweaks.getAllValues(); mTweaks.set("a", "Nope"); mTweaks.set("b", 14); mTweaks.set("c", 22.0f); mTweaks.set("d", false); final Map<String, Tweaks.TweakValue> allValues2 = mTweaks.getAllValues(); final Tweaks.TweakValue a1 = allValues1.get("a"); final Tweaks.TweakValue b1 = allValues1.get("b"); final Tweaks.TweakValue c1 = allValues1.get("c"); final Tweaks.TweakValue d1 = allValues1.get("d"); final Tweaks.TweakValue a2 = allValues2.get("a"); final Tweaks.TweakValue b2 = allValues2.get("b"); final Tweaks.TweakValue c2 = allValues2.get("c"); final Tweaks.TweakValue d2 = allValues2.get("d"); assertEquals(Tweaks.STRING_TYPE, a1.type); assertEquals(Tweaks.LONG_TYPE, b1.type); assertEquals(Tweaks.DOUBLE_TYPE, c1.type); assertEquals(Tweaks.BOOLEAN_TYPE, d1.type); // Returns should never change, but new calls to allValues should yield new results assertEquals("Yup", a1.getStringValue()); assertEquals("Nope", a2.getStringValue()); assertEquals((byte) 7, b1.getNumberValue()); assertEquals(14, b2.getNumberValue()); assertEquals(3.0f, c1.getNumberValue()); assertEquals(22.0f, c2.getNumberValue()); assertEquals(true, (boolean) d1.getBooleanValue()); assertEquals(false, (boolean) d2.getBooleanValue()); } Tweaks mTweaks; int mTweakDeclaredCount; }