/***************************************************************************
* Copyright 2006-2016 by Christian Ihle *
* contact@kouchat.net *
* *
* This file is part of KouChat. *
* *
* KouChat is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version. *
* *
* KouChat is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with KouChat. *
* If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
package net.usikkert.kouchat.android.component;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import net.usikkert.kouchat.android.R;
import net.usikkert.kouchat.util.TestUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowDialogPreference;
import org.robolectric.shadows.ShadowTypedArray;
import com.larswerkman.holocolorpicker.ColorPicker;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
/**
* Test of {@link HoloColorPickerPreference}.
*
* @author Christian Ihle
*/
@RunWith(RobolectricTestRunner.class)
public class HoloColorPickerPreferenceTest {
private HoloColorPickerPreference preference;
private View colorPickerDialog;
private ColorPicker colorPicker;
private ShadowDialogPreference shadowDialogPreference;
private LinearLayout colorPreview;
private ImageView colorPreviewImage;
private GradientDrawable colorPickerDrawable;
@Before
public void setUp() {
preference = new HoloColorPickerPreference(Robolectric.application, mock(AttributeSet.class));
shadowDialogPreference = Robolectric.shadowOf(preference);
final LayoutInflater inflater = LayoutInflater.from(Robolectric.application);
colorPickerDialog = inflater.inflate(R.layout.color_picker_dialog, null);
colorPicker = (ColorPicker) colorPickerDialog.findViewById(R.id.colorPicker);
// Simulating the view expected in onBindView(), as the real one is private and can't be inflated
colorPreviewImage = new ImageView(Robolectric.application);
colorPreviewImage.setId(R.id.colorPreviewImage);
colorPickerDrawable = mock(GradientDrawable.class);
colorPreviewImage.setImageDrawable(colorPickerDrawable);
TestUtils.setFieldValue(preference, "colorPreviewImage", colorPreviewImage);
colorPreview = new LinearLayout(Robolectric.application);
colorPreview.addView(colorPreviewImage);
}
@Test
public void constructorShouldSetColorPickerDialogLayout() {
assertEquals(R.layout.color_picker_dialog, preference.getDialogLayoutResource());
}
@Test
public void constructorShouldSetColorPreviewLayout() {
assertEquals(R.layout.color_preview, preference.getWidgetLayoutResource());
}
@Test
public void constructorShouldSetButtonText() {
assertEquals("OK", preference.getPositiveButtonText());
assertEquals("Cancel", preference.getNegativeButtonText());
}
/**
* A TypedArray is used to keep default values from XML.
*
* <p>It's a bit weird. It has a type at <code>requested index * 6</code>,
* and the actual value at <code>requested index * 6 + 1</code>.</p>
*
* <p>Example:</p>
* <ul>
* <li>Index 0: type at 0, value at 1</li>
* <li>Index 1: type at 6, value at 7</li>
* <li>Index 2: type at 12, value at 13</li>
* </ul>
*/
@Test
public void onGetDefaultValueShouldReturnDefaultValueFromXmlWhenSet() {
final int[] data = new int[20];
data[6] = TypedValue.TYPE_FIRST_INT; // Need to add the correct type to be able to get the integer.
data[7] = 50; // The value we want
final TypedArray typedArray = ShadowTypedArray.create(null, null, data, null, 0, null);
final Integer value = (Integer) preference.onGetDefaultValue(typedArray, 1);
assertEquals(Integer.valueOf(50), value);
}
@Test
public void onGetDefaultValueShouldReturnBlackWhenNoDefaultValueSetInXml() {
final TypedArray typedArray = ShadowTypedArray.create(null, null, new int[20], null, 0, null);
final Integer value = (Integer) preference.onGetDefaultValue(typedArray, 1);
assertEquals(Integer.valueOf(Color.BLACK), value);
}
@Test
public void onSetInitialValueShouldSetPersistedColorToValueOfParameterIfRestoreIsFalse() {
assertEquals(0, preference.getPersistedColor());
preference.onSetInitialValue(false, 1001);
assertEquals(1001, preference.getPersistedColor());
}
@Test
public void onSetInitialValueShouldSetPersistedColorToPersistedIntIfRestoreIsTrue() {
shadowDialogPreference.setPersistent(true);
shadowDialogPreference.persistInt(501);
assertEquals(0, preference.getPersistedColor());
preference.onSetInitialValue(true, 1001);
assertEquals(501, preference.getPersistedColor());
}
@Test
public void onSetInitialValueShouldSetPersistedColorToBlackIfPersistedIntIsMissingAndRestoreIsTrue() {
assertEquals(0, preference.getPersistedColor());
preference.onSetInitialValue(true, 1001);
assertEquals(Color.BLACK, preference.getPersistedColor());
}
@Test
public void onBindDialogViewShouldSetPreferenceAsTheColorChangedListener() {
assertNull(colorPicker.getOnColorChangedListener());
preference.onBindDialogView(colorPickerDialog);
assertSame(preference, colorPicker.getOnColorChangedListener());
}
@Test
public void onBindDialogViewShouldSetValueBarAndSaturationBar() {
assertFalse(colorPicker.hasValueBar());
assertFalse(colorPicker.hasSaturationBar());
assertFalse(colorPicker.hasOpacityBar());
assertFalse(colorPicker.hasSVBar());
preference.onBindDialogView(colorPickerDialog);
assertTrue(colorPicker.hasValueBar());
assertTrue(colorPicker.hasSaturationBar());
assertFalse(colorPicker.hasOpacityBar());
assertFalse(colorPicker.hasSVBar());
}
@Test
public void onBindDialogViewShouldSetColor() {
// String.format("#%06X", (0xFFFFFF & colorPicker.getColor())) = #80FF00 - green
assertEquals(-8323328, colorPicker.getColor());
TestUtils.setFieldValue(preference, "persistedColor", Color.BLUE);
preference.onBindDialogView(colorPickerDialog);
// getColor() returns the value set by a touch event, so this wont work
// assertEquals(Color.BLUE, colorPicker.getColor());
// setColor() does set the value of mColor.
assertEquals(Integer.valueOf(Color.BLUE), TestUtils.getFieldValue(colorPicker, Integer.class, "mColor"));
}
@Test
public void onBindDialogViewShouldSetOldCenterColor() {
// String.format("#%06X", (0xFFFFFF & colorPicker.getColor())) = #80FF00 - green
assertEquals(-8323328, colorPicker.getOldCenterColor());
TestUtils.setFieldValue(preference, "persistedColor", Color.BLUE);
preference.onBindDialogView(colorPickerDialog);
assertEquals(Color.BLUE, colorPicker.getOldCenterColor());
}
@Test
public void onDialogClosedWithFalseShouldDoNothing() {
shadowDialogPreference.setPersistent(true);
assertEquals(0, preference.getPersistedColor());
TestUtils.setFieldValue(preference, "currentColor", 500);
preference.onDialogClosed(false);
assertEquals(0, preference.getPersistedColor());
assertEquals(0, shadowDialogPreference.getPersistedInt(-1));
verifyZeroInteractions(colorPickerDrawable);
}
@Test
public void onDialogClosedWithTrueShouldPersistCurrentColor() {
shadowDialogPreference.setPersistent(true);
assertEquals(0, preference.getPersistedColor());
TestUtils.setFieldValue(preference, "currentColor", 500);
preference.onDialogClosed(true);
assertEquals(500, preference.getPersistedColor());
assertEquals(500, shadowDialogPreference.getPersistedInt(-1));
}
@Test
public void onDialogClosedWithTrueShouldUpdatePreviewWithCurrentColor() {
shadowDialogPreference.setPersistent(true);
TestUtils.setFieldValue(preference, "currentColor", 500);
preference.onDialogClosed(true);
verify(colorPickerDrawable).setColor(500);
}
@Test
public void onColorChangedShouldSetCurrentColorToValueOfParameter() {
assertEquals(Integer.valueOf(0), TestUtils.getFieldValue(preference, Integer.class, "currentColor"));
preference.onColorChanged(50);
assertEquals(Integer.valueOf(50), TestUtils.getFieldValue(preference, Integer.class, "currentColor"));
}
@Test
public void onBindViewShouldSetColorPreviewImage() {
TestUtils.setFieldValue(preference, "colorPreviewImage", null);
preference.onBindView(colorPreview);
assertSame(colorPreviewImage, TestUtils.getFieldValue(preference, ImageView.class, "colorPreviewImage"));
}
@Test
public void onBindViewShouldUpdatePreviewWithPersistedColor() {
TestUtils.setFieldValue(preference, "persistedColor", 500);
preference.onBindView(colorPreview);
verify(colorPickerDrawable).setColor(500);
}
}