Skip to content

Commit dac6c86

Browse files
robkeimErikSchierboom
authored andcommitted
Update Luhn tests for #161 (#162)
1 parent 8a1a305 commit dac6c86

File tree

2 files changed

+24
-86
lines changed

2 files changed

+24
-86
lines changed

exercises/luhn/Example.cs

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
using System;
22
using System.Linq;
33

4-
public class Luhn
4+
public static class Luhn
55
{
6-
private readonly long number;
6+
public static bool IsValid(string number)
7+
{
8+
number = number.Replace(" ", "");
79

8-
public long CheckDigit { get { return number % 10; } }
9-
public int[] Addends { get; private set; }
10-
public int Checksum { get { return Addends.Sum(); } }
11-
public bool Valid { get { return Checksum % 10 == 0; } }
10+
if (number.Length < 2 || number.Any(c => c < '0' || c > '9'))
11+
{
12+
return false;
13+
}
1214

13-
public Luhn(long number)
14-
{
15-
this.number = number;
16-
Addends = GenerateAddends();
15+
var checksum = GenerateChecksum(number);
16+
17+
return checksum % 10 == 0;
1718
}
1819

19-
private int[] GenerateAddends()
20+
private static int GenerateChecksum(string number)
2021
{
2122
var reversedIntArray = SplitToReversedIntArray(number);
2223
for (int i = 1; i < reversedIntArray.Length; i++)
@@ -25,34 +26,17 @@ private int[] GenerateAddends()
2526
reversedIntArray[i] = ConvertDigitForAddend(reversedIntArray[i]);
2627
}
2728
Array.Reverse(reversedIntArray);
28-
return reversedIntArray;
29+
return reversedIntArray.Sum();
2930
}
3031

31-
private static int[] SplitToReversedIntArray(long value)
32+
private static int[] SplitToReversedIntArray(string value)
3233
{
33-
return value.ToString().Select(c => int.Parse(c.ToString())).Reverse().ToArray();
34+
return value.Select(c => int.Parse(c.ToString())).Reverse().ToArray();
3435
}
3536

3637
private static int ConvertDigitForAddend(int value)
3738
{
3839
var doubled = value * 2;
3940
return doubled < 10 ? doubled : doubled - 9;
4041
}
41-
42-
public static long Create(long number)
43-
{
44-
var zeroCheckDigitNumber = number * 10;
45-
var luhn = new Luhn(zeroCheckDigitNumber);
46-
47-
if (luhn.Valid)
48-
return zeroCheckDigitNumber;
49-
50-
return zeroCheckDigitNumber + CreateCheckDigit(luhn.Checksum);
51-
}
52-
53-
private static int CreateCheckDigit(int value)
54-
{
55-
var nearestTen = (int)(Math.Ceiling(value / 10.0m) * 10);
56-
return nearestTen - value;
57-
}
5842
}

exercises/luhn/LuhnTest.cs

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,60 +3,14 @@
33
[TestFixture]
44
public class LuhnTest
55
{
6-
[Test]
7-
public void Check_digit_is_the_rightmost_digit()
8-
{
9-
Assert.That(new Luhn(34567).CheckDigit, Is.EqualTo(7));
10-
}
11-
12-
[Ignore("Remove to run test")]
13-
[Test]
14-
public void Addends_doubles_every_other_number_from_the_right()
15-
{
16-
Assert.That(new Luhn(12121).Addends, Is.EqualTo(new[] { 1, 4, 1, 4, 1 }));
17-
}
18-
19-
[Ignore("Remove to run test")]
20-
[Test]
21-
public void Addends_subtracts_9_when_doubled_number_is_more_than_9()
22-
{
23-
Assert.That(new Luhn(8631).Addends, Is.EqualTo(new[] { 7, 6, 6, 1 }));
24-
}
25-
26-
[Ignore("Remove to run test")]
27-
[TestCase(4913, ExpectedResult = 22)]
28-
[TestCase(201773, ExpectedResult = 21)]
29-
public int Checksum_adds_addends_together(int number)
30-
{
31-
return new Luhn(number).Checksum;
32-
}
33-
34-
[Ignore("Remove to run test")]
35-
[TestCase(738, ExpectedResult = false)]
36-
[TestCase(8739567, ExpectedResult = true)]
37-
public bool Number_is_valid_when_checksum_mod_10_is_zero(int number)
38-
{
39-
return new Luhn(number).Valid;
40-
}
41-
42-
[Ignore("Remove to run test")]
43-
[Test]
44-
public void Luhn_can_create_simple_numbers_with_valid_check_digit()
45-
{
46-
Assert.That(Luhn.Create(123), Is.EqualTo(1230));
47-
}
48-
49-
[Ignore("Remove to run test")]
50-
[Test]
51-
public void Luhn_can_create_larger_numbers_with_valid_check_digit()
52-
{
53-
Assert.That(Luhn.Create(873956), Is.EqualTo(8739567));
54-
}
55-
56-
[Ignore("Remove to run test")]
57-
[Test]
58-
public void Luhn_can_create_huge_numbers_with_valid_check_digit()
59-
{
60-
Assert.That(Luhn.Create(837263756), Is.EqualTo(8372637564));
6+
[TestCase("1", ExpectedResult = false)] // single digit strings can not be valid
7+
[TestCase("0", ExpectedResult = false, Ignore = "Remove to run test")] // a single zero is invalid
8+
[TestCase("046 454 286", ExpectedResult = true, Ignore = "Remove to run test")] // valid Canadian SIN
9+
[TestCase("046 454 287", ExpectedResult = false, Ignore = "Remove to run test")] // invalid Canadian SIN
10+
[TestCase("8273 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")] // invalid credit card
11+
[TestCase("827a 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")] // strings that contain non-digits are not valid
12+
public bool ValidateChecksum(string number)
13+
{
14+
return Luhn.IsValid(number);
6115
}
6216
}

0 commit comments

Comments
 (0)