Exemple #1
0
        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");
            }
        }
Exemple #2
0
 private Nin(string alreadyValidatedValue, DateTime?dob, NinKind typ)
 {
     _value      = alreadyValidatedValue;
     DateOfBirth = dob;
     Kind        = typ;
 }
Exemple #3
0
        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);
            }
        }