package jp.webpay.android.token.validator;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import jp.webpay.android.token.model.CardType;
import static jp.webpay.android.token.model.CardType.AMERICAN_EXPRESS;
import static jp.webpay.android.token.model.CardType.DINERS_CLUB;
import static jp.webpay.android.token.model.CardType.JCB;
import static jp.webpay.android.token.model.CardType.MASTERCARD;
import static jp.webpay.android.token.model.CardType.VISA;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class CardNumberValidatorTest {
@Test
public void testNullIsInvalid() throws Exception {
assertFalse(CardNumberValidator.isValid(null));
assertFalse(CardNumberValidator.isValid(null, new ArrayList<CardType>()));
assertFalse(CardNumberValidator.isValid("4242-4242-4242-4242", null));
}
@Test
public void testIsValidSanitizesNumber() throws Exception {
assertTrue(CardNumberValidator.isValid("4242424242424242"));
assertTrue(CardNumberValidator.isValid("4242-4242-4242-4242"));
assertFalse(CardNumberValidator.isValid("4242 4242 4242 4242"));
assertFalse(CardNumberValidator.isValid("4242\n424242424242"));
assertFalse(CardNumberValidator.isValid("4242424242424242"));
}
@Test
public void testIsValidChecksLuhn() throws Exception {
// Valid visa number, but fail Luhn check
assertFalse(CardNumberValidator.isValid("4242424242424243"));
}
@Test
public void testIsValidChecksCardType() throws Exception {
assertTrue("WebPay supports Visa", CardNumberValidator.isValid("4242424242424242"));
assertTrue("WebPay supports MasterCard", CardNumberValidator.isValid("5105105105105100"));
assertTrue("WebPay supports JCB", CardNumberValidator.isValid("3530111333300000"));
assertTrue("WebPay supports American Express", CardNumberValidator.isValid("378282246310005"));
assertTrue("WebPay supports Diners Club", CardNumberValidator.isValid("38520000023237"));
assertFalse("WebPay does not support Discover", CardNumberValidator.isValid("6011837077978913"));
}
@Test
public void testIsValidChecksCardTypeSpecified() throws Exception {
assertValidAsType("4242424242424242", VISA);
assertValidAsType("5105105105105100", MASTERCARD);
assertValidAsType("3530111333300000", JCB);
assertValidAsType("378282246310005", AMERICAN_EXPRESS);
assertValidAsType("38520000023237", DINERS_CLUB);
}
private void assertValidAsType(String number, CardType type) {
assertTrue(CardNumberValidator.isValid(number, Arrays.asList(type)));
List<CardType> allOther = new LinkedList<CardType>(Arrays.asList(CardType.values()));
allOther.remove(type);
assertFalse(CardNumberValidator.isValid(number, allOther));
}
}