实验内容:
信用卡号是一串长度介于13和16之间的一串数字。卡号必须是以4、5、6、或37开头,并遵循下面模式:
1) 从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,那么就将这两位数加在一起得到一位数。
2) 将第一步所得到的所有一位数相加
3) 从卡号最后一位数字开始,奇数位数字相加
4) 将第二步和第三步的到的结果相加
5) 如果第四步得到的结果能被10整除,那么卡号是合法的,否则,卡号是不合法的。
package org.test;
import java.util.Scanner;
public class CreditCard {
/** Return true if the card number is valid */
public boolean isValid(long number) {
return (getSize(number) >= 13) && (getSize(number) <= 16) &&
(prefixMatched(number, 4) || prefixMatched(number, 5) ||
prefixMatched(number, 6) || prefixMatched(number, 37)) &&
(sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0;
}
/** Get the result from Step 2 */
public int sumOfDoubleEvenPlace(long number) {
int result = 0;
number = number / 10; // Starting from the second digit from left
while (number != 0) {
result += getDigit((int)((number % 10) * 2));
number = number / 100; // Move to the next even place
}
return result;
}
/** Return this number if it is a single digit, otherwise, return
* the sum of the two digits */
public int getDigit(int number) {
return number % 10 + (number / 10);
}
/** Return sum of odd place digits in number */
//3) 从卡号最后一位数字开始,奇数位数字相加
public int sumOfOddPlace(long number) {
int result = 0;
while (number != 0) {
result += (int)(number % 10);
number = number / 100; // Move two positions to the left
}
return result;
}
/** Return true if the digit d is a prefix for number */
public boolean prefixMatched(long number, int d) {
return getPrefix(number, getSize(d)) == d;
}
/** Return the number of digits in d */
public int getSize(long d) {
int numberOfDigits = 0;
while (d != 0) {
numberOfDigits++;
d = d / 10;
}
return numberOfDigits;
}
/** Return the first k number of digits from number. If the number
* of digits in number is less than k, return number. */
public long getPrefix(long number, int k) {
long result = number;
for (int i = 0; i < getSize(number) - k; i++)
result /= 10;
return result;
}
}
参数化 && 覆盖率100% 测试设计:
package org.test;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class CreditCardTest {
CreditCard creditCard;
private long input;
private int sumOfOddPlaceExpected;
private int digitExpected;
private int sumOfDoubleEvenPlaceExpected;
private boolean isValidExpected;
@Parameters
@SuppressWarnings("unchecked")
public static Collection prepareData1(){
Object[][] object = {
{4111111111111111L,8,8,22,true},
{38520000023237L,21,3,19,false},
{6011000000000004L,5,5,5,true},
{100000000L,1,1,0,false},
{10000000000000000L,1,1,0,false},
{371449635398431L,33,6,47,true},
{5111111111111198L,15,6,22,false}
};
return Arrays.asList(object);
}
public CreditCardTest(long input,int sumOfOddPlaceExpected,int digitExpected,
int sumOfDoubleEvenPlaceExpected,boolean isValidExpected){
this.input = input;
this.sumOfOddPlaceExpected = sumOfOddPlaceExpected;
this.digitExpected = digitExpected;
this.sumOfDoubleEvenPlaceExpected = sumOfDoubleEvenPlaceExpected;
this.isValidExpected = isValidExpected;
}
@Before
public void setUp() throws Exception {
creditCard = new CreditCard();
}
//检验信用卡号
@Test
public void testIsValid() {
boolean result = creditCard.isValid(input);
Assert.assertEquals(isValidExpected,result);
}
//从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,那么就将这两位数加在一起得到一位数。
@Test
public void testSumOfDoubleEvenPlace() {
int result = creditCard.sumOfDoubleEvenPlace(input);
Assert.assertEquals(result, sumOfDoubleEvenPlaceExpected);
}
//如果两位数,那么就将这两位数加在一起得到一位数,否则返回本身
@Test
public void testGetDigit() {
int result = creditCard.getDigit(sumOfOddPlaceExpected);
Assert.assertEquals(digitExpected, result);
}
//3)从卡号最后一位数字开始,奇数位数字相加
@Test
public void testSumOfOddPlace() {
int result = creditCard.sumOfOddPlace(input);
Assert.assertEquals(sumOfOddPlaceExpected,result);
}
}