public void ValidNumberButUnsupportedKindShouldNotValidate() { var noKinds = new NinKind[0]; var allKinds = Enum.GetValues(typeof(NinKind)).Cast <NinKind>().ToArray(); foreach (var test in TestData.AllTestCases()) { var allExceptThis = allKinds.Except(new[] { test.NumberKind }).ToArray(); Assert.IsTrue(Nin.IsValid(test.Number), "Valid number IsValid"); Assert.AreEqual(NinValidation.Valid, Nin.Validate(test.Number), "Valid number gives Valid result"); Assert.AreEqual(NinValidation.Valid, Nin.Validate(test.Number, allowedKinds: allKinds), "Valid number should validate when all kinds are specified"); Assert.AreEqual(NinValidation.Valid, Nin.Validate(test.Number, test.NumberKind), "Valid number should validate when its kind is specified"); foreach (var kind in allExceptThis) { Assert.AreEqual(NinValidation.Valid, Nin.Validate(test.Number, test.NumberKind, kind), "Valid number should validate when its kind is specified"); Assert.AreEqual(NinValidation.UnsupportedKind, Nin.Validate(test.Number, kind), "Valid number should give unsupportedkind when its kind is not specified"); } Assert.AreEqual(NinValidation.UnsupportedKind, Nin.Validate(test.Number, allowedKinds: noKinds), "Valid number should give unsupportedkind when no kinds are specified"); Assert.AreEqual(NinValidation.UnsupportedKind, Nin.Validate(test.Number, allowedKinds: allExceptThis), "Valid number should give unsupportedkind when kind is missing"); } }
private Nin(string alreadyValidatedValue, DateTime?dob, NinKind typ) { _value = alreadyValidatedValue; DateOfBirth = dob; Kind = typ; }
private static NinValidation Validate(string nin, out NinKind t, out DateTime?dob) { t = NinKind.BirthNumber; dob = DateTime.MinValue; // Basic sanity tests -- null check, length and allowed characters if (nin == null || nin.Length < LENGTH) { return(NinValidation.TooShort); } else if (nin.Length > LENGTH) { return(NinValidation.TooLong); } if (!nin.All(Char.IsDigit)) { return(NinValidation.InvalidCharacter); } var digits = DigitStringToByteArray(nin); // Check the control digits if ( !IsChecksumValid(checksumSeries1, digits) || !IsChecksumValid(checksumSeries2, digits)) { return(NinValidation.InvalidControlDigit); } // Extract birth date var day = int.Parse(nin.Substring(0, 2)); var month = int.Parse(nin.Substring(2, 2)); var year = int.Parse(nin.Substring(4, 2)); // FH numbers start with 8/9 if (digits[0] > 7) { t = NinKind.FHNumber; dob = null; return(NinValidation.Valid); } else { // Century is encoded in the three personal digits following the date. var personalDigits = int.Parse(nin.Substring(6, 3)); var fullYear = FindYearWithCentury(personalDigits, year); if (!fullYear.HasValue) { return(NinValidation.InvalidCenturyCode); } year = fullYear.Value; // D-numbers and H-numbers are encoded in the day/month field if (day > 40) { t = NinKind.DNumber; day -= 40; } else if (month > 40) { t = NinKind.HNumber; month -= 40; } if ( year < 1854 || year > 2039 || month < 1 || month > 12 || day < 1 || day > DateTime.DaysInMonth(year, month)) { return(NinValidation.InvalidDateOfBirth); } dob = new DateTime(year, month, day, 0, 0, 0, 0, DateTimeKind.Utc); return(NinValidation.Valid); } }