From 395c9697b6121d3d51aabaf4af2d5aeb09e67757 Mon Sep 17 00:00:00 2001 From: Rob Keim Date: Tue, 10 Jan 2017 21:20:20 -0800 Subject: [PATCH] Update Luhn tests for #491 --- exercises/luhn/Example.fs | 32 +++++++++++++------------- exercises/luhn/LuhnTest.fs | 46 +++++++------------------------------- 2 files changed, 23 insertions(+), 55 deletions(-) diff --git a/exercises/luhn/Example.fs b/exercises/luhn/Example.fs index 0e78cf039..d6a3c8d5e 100644 --- a/exercises/luhn/Example.fs +++ b/exercises/luhn/Example.fs @@ -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) \ No newline at end of file +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 \ No newline at end of file diff --git a/exercises/luhn/LuhnTest.fs b/exercises/luhn/LuhnTest.fs index 8ac97f753..1f6d66609 100644 --- a/exercises/luhn/LuhnTest.fs +++ b/exercises/luhn/LuhnTest.fs @@ -3,41 +3,11 @@ module LuhnTest open NUnit.Framework open Luhn -[] -let ``Check digit is the rightmost digit`` () = - Assert.That(checkDigit 34567L, Is.EqualTo 7) - -[] -[] -let ``Addends doubles every other number from the right`` () = - Assert.That(addends 12121L, Is.EqualTo [1; 4; 1; 4; 1]) - -[] -[] -let ``Addends subtracts 9 when doubled number is more than 9`` () = - Assert.That(addends 8631L, Is.EqualTo [7; 6; 6; 1]) - -[] -[] -let ``Checksum adds addends together`` (number) = - checksum number - -[] -[] -let ``Number is valid when checksum mod 10 is zero`` (number) = - valid number - -[] -[] -let ``Luhn can create simple numbers with valid check digit`` () = - Assert.That(create 123L, Is.EqualTo(1230)) - -[] -[] -let ``Luhn can create larger numbers with valid check digit`` () = - Assert.That(create 873956L, Is.EqualTo(8739567)) - -[] -[] -let ``Luhn can create huge numbers with valid check digit`` () = - Assert.That(create 837263756L, Is.EqualTo(8372637564L)) \ No newline at end of file +[] // single digit strings can not be valid +[] // a single zero is invalid +[] // valid Canadian SIN +[] // invalid Canadian SIN +[] // invalid credit card +[] // strings that contain non-digits are not valid +let ``Validate checksum`` number = + valid number \ No newline at end of file