package com.creditcard4j; import android.text.Editable; import android.text.SpannableStringBuilder; import android.text.TextWatcher; import android.widget.EditText; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE) public class CreditCardEditTextWatcherTest { @Before public void setUp() { CreditCard4J.resetConfig(); } @Test public void enter_a_digit_returns_the_text() { // GIVEN CreditCardEditTextWatcher cc = new CreditCardEditTextWatcher(); String original = ""; String input = "1"; // WHEN String result = simulateTextInput(cc, original, input); // THEN assertEquals(input, result); } @Test public void enter_4_digits_returns_the_text_with_a_space() { // GIVEN CreditCardEditTextWatcher cc = new CreditCardEditTextWatcher(); // WHEN String result = ""; for (int i = 1; i <= 4; i++) { result = simulateTextInput(cc, result, String.valueOf(i)); } // THEN assertEquals("1234 ", result); } @Test public void enter_16_digits_returns_the_text_with_a_spaces_each_4_digits() { // GIVEN CreditCardEditTextWatcher cc = new CreditCardEditTextWatcher(); // WHEN String result = ""; for (int i = 1; i <= 16; i++) { result = simulateTextInput(cc, result, String.valueOf(i % 10)); } // THEN assertEquals("1234 5678 9012 3456 ", result); } @Test public void enter_16_digits_with_a_specified_spacing_character_returns_the_text_with_the_spacing_character_each_4_digits() { // GIVEN CreditCard4J.ALLOWED_CARD_NUMBERS_SPACING_CHARACTERS = new String[]{"&"}; CreditCardEditTextWatcher cc = new CreditCardEditTextWatcher('&'); // WHEN String result = ""; for (int i = 1; i <= 16; i++) { result = simulateTextInput(cc, result, String.valueOf(i % 10)); } // THEN assertEquals("1234&5678&9012&3456&", result); } @Test public void enter_the_maxLength_digits_for_the_card_brand_focuses_on_the_next_input() { // GIVEN EditText editText = new EditText(Robolectric.application); CreditCardEditTextWatcher cc = new CreditCardEditTextWatcher(editText); String number = "4242424242424242"; // VISA int maxLenght = CreditCard4J.getBrand(number).getMaxLength(); // WHEN simulateTextInput(cc, number.substring(0, maxLenght - 1), String.valueOf(number.charAt(maxLenght - 1))); // THEN assertTrue(editText.hasFocus()); } private static String simulateTextInput(TextWatcher tw, String original, String input) { // TODO review all the int parameters tw.beforeTextChanged(original, 0, original.length(), input.length()); String newText = original + input; tw.onTextChanged(newText, 1, newText.length() - 1, 1); Editable editable = new SpannableStringBuilder(newText); tw.afterTextChanged(editable); return editable.toString(); } }