Skip to content

Update Luhn tests #275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 15 additions & 17 deletions exercises/luhn/Example.fs
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
module Luhn

let digit c = (int)c - (int)'0'
let digits number = number.ToString() |> Seq.map digit

let addend index digit =
let private digit c = (int)c - (int)'0'
let private digits number = number.ToString() |> Seq.map digit

let private addend index digit =
if (index % 2 = 0) then digit else
if (digit >= 5) then digit * 2 - 9
else digit * 2

let checkDigit (number:int64) = number % 10L

let addends (number:int64) =
number
|> digits
let private addends number =
number
|> List.ofSeq
|> List.rev
|> List.mapi addend
|> List.rev

let checksum (number:int64) = (number |> addends |> List.sum) % 10

let valid (number:int64) = checksum number = 0

let create (target:int64) =
let targetNumber = target * 10L
let private checksum number = (number |> digits |> addends |> List.sum) % 10

if valid targetNumber then targetNumber
else targetNumber + 10L - (int64)(checksum targetNumber)
let valid (number : string) =
let noSpaces = number.Replace(" ", "")
match Seq.length noSpaces with
| 0 | 1 -> false
| _ ->
match Seq.forall (fun c -> c >= '0' && c <= '9') noSpaces with
| false -> false
| true -> checksum noSpaces = 0
46 changes: 8 additions & 38 deletions exercises/luhn/LuhnTest.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,11 @@ module LuhnTest
open NUnit.Framework
open Luhn

[<Test>]
let ``Check digit is the rightmost digit`` () =
Assert.That(checkDigit 34567L, Is.EqualTo 7)

[<Test>]
[<Ignore("Remove to run test")>]
let ``Addends doubles every other number from the right`` () =
Assert.That(addends 12121L, Is.EqualTo [1; 4; 1; 4; 1])

[<Test>]
[<Ignore("Remove to run test")>]
let ``Addends subtracts 9 when doubled number is more than 9`` () =
Assert.That(addends 8631L, Is.EqualTo [7; 6; 6; 1])

[<TestCase(4913, ExpectedResult = 2)>]
[<TestCase(201773, ExpectedResult = 1)>]
let ``Checksum adds addends together`` (number) =
checksum number

[<TestCase(738, ExpectedResult = false)>]
[<TestCase(8739567, ExpectedResult = true)>]
let ``Number is valid when checksum mod 10 is zero`` (number) =
valid number

[<Test>]
[<Ignore("Remove to run test")>]
let ``Luhn can create simple numbers with valid check digit`` () =
Assert.That(create 123L, Is.EqualTo(1230))

[<Test>]
[<Ignore("Remove to run test")>]
let ``Luhn can create larger numbers with valid check digit`` () =
Assert.That(create 873956L, Is.EqualTo(8739567))

[<Test>]
[<Ignore("Remove to run test")>]
let ``Luhn can create huge numbers with valid check digit`` () =
Assert.That(create 837263756L, Is.EqualTo(8372637564L))
[<TestCase("1", ExpectedResult = false)>] // single digit strings can not be valid
[<TestCase("0", ExpectedResult = false, Ignore = "Remove to run test")>] // a single zero is invalid
[<TestCase("046 454 286", ExpectedResult = true, Ignore = "Remove to run test")>] // valid Canadian SIN
[<TestCase("046 454 287", ExpectedResult = false, Ignore = "Remove to run test")>] // invalid Canadian SIN
[<TestCase("8273 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")>] // invalid credit card
[<TestCase("827a 1232 7352 0569", ExpectedResult = false, Ignore = "Remove to run test")>] // strings that contain non-digits are not valid
let ``Validate checksum`` number =
valid number