public virtual void ShouldParseTextToDateTime()
        {
            // culture is internal, need to test with a known culture.
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

            try
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                OverriddenTimeGlobalizationInfo strategy = new OverriddenTimeGlobalizationInfo();
                Assert.IsTrue(strategy.ActualCulture.Name == "en-US", "This test should run under en-US culture, setting did not work as expected.");

                TimeParserCollection parsers = new TimeParserCollection {
                    new CustomTimeParser()
                };

                Assert.AreEqual(DateTime.Today.Date.AddHours(8).AddMinutes(30), strategy.ParseTime("8:30 AM", new ShortTimeFormat(), parsers));
                Assert.AreEqual(DateTime.Today.Date.AddHours(20).AddMinutes(30), strategy.ParseTime("8:30 PM", new ShortTimeFormat(), parsers));

                Assert.AreEqual(DateTime.Today.Date.AddHours(8).AddMinutes(30).AddSeconds(12), strategy.ParseTime("8:30:12 AM", new LongTimeFormat(), parsers));
                Assert.AreEqual(DateTime.Today.Date.AddHours(20).AddMinutes(30).AddSeconds(12), strategy.ParseTime("8:30:12 PM", new LongTimeFormat(), parsers));

                Assert.AreEqual(DateTime.Today.Date.AddHours(8).AddMinutes(30).AddSeconds(12), strategy.ParseTime("08:30:12", new CustomTimeFormat("hh:mm:ss"), parsers));

                Assert.AreEqual(DateTime.MinValue.Date.AddHours(15).AddMinutes(40), strategy.ParseTime("3 uur 40", new CustomTimeFormat("hh:mm:ss"), parsers));
            }
            finally
            {
                Thread.CurrentThread.CurrentCulture = currentCulture;
            }
        }
        /// <summary>
        /// Parses a string into a DateTime using the specified ITimeFormat instance 
        /// and TimeParsers and returns a value that indicates whether the conversion 
        /// succeeded.
        /// </summary>
        /// <param name="mappedText">The text that was entered by the user.</param>
        /// <param name="timeFormat">The TimeFormat instance used to supply
        /// formats.</param>
        /// <param name="timeParsers">The time parsers.</param>
        /// <param name="result">A DateTime with a correctly set time part.</param>
        /// <returns>
        /// True, if the time was parsed correctly, false if the time was not 
        /// parsed.
        /// </returns>
        /// <remarks>The date part of the DateTime is irrelevant and will be
        /// overwritten by the current date.
        /// </remarks>
        public bool TryParseTime(string mappedText, ITimeFormat timeFormat, IEnumerable<TimeParser> timeParsers, out DateTime? result)
        {
            result = null;
            if (string.IsNullOrEmpty(mappedText))
            {
                return true;
            }
            string value = new string(mappedText.ToCharArray().Select(c => TimeSeparators.Contains(c) ? c : MapCharacterToDigit(c)).ToArray());
            if (timeFormat != null)
            {
                DateTime realResult;
                // try using formats.
                if (DateTime.TryParseExact(
                    value,
                    timeFormat.GetTimeParseFormats(ActualCulture).Select(s => GetTransformedFormat(s)).ToArray(),
                    ActualCulture,
                    DateTimeStyles.None,
                    out realResult))
                {
                    result = realResult;
                    return true;
                }
            }

            // try using custom collection of parsers.
            TimeParserCollection timeParserCollection = new TimeParserCollection(GetActualTimeParsers(timeParsers));
            DateTime? parsedResult;
            if (timeParserCollection.TryParse(mappedText, ActualCulture, out parsedResult))
            {
                result = parsedResult;
                return true;
            }

            return false;
        }
        public virtual void ShouldBindParsersToTimeUpDown()
        {
            TimePicker tip = new TimePicker();
            TimeUpDown tud = null;

            TimeParserCollection parsers = new TimeParserCollection();
            parsers.Add(new CustomTimeParser());

            TestAsync(
                tip,
                () => tud = ((Panel)VisualTreeHelper.GetChild(tip, 0)).FindName("TimeUpDown") as TimeUpDown,
                () => tip.TimeParsers = parsers,
                () => Assert.AreEqual(tip.TimeParsers, tud.TimeParsers));
        }
        public virtual void ShouldParseTextToDateTime()
        {
            // culture is internal, need to test with a known culture.
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;

            try
            {
                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
                OverriddenTimeGlobalizationInfo strategy = new OverriddenTimeGlobalizationInfo();
                Assert.IsTrue(strategy.ActualCulture.Name == "en-US", "This test should run under en-US culture, setting did not work as expected.");

                TimeParserCollection parsers = new TimeParserCollection { new CustomTimeParser() };

                Assert.AreEqual(DateTime.Today.Date.AddHours(8).AddMinutes(30), strategy.ParseTime("8:30 AM", new ShortTimeFormat(), parsers));
                Assert.AreEqual(DateTime.Today.Date.AddHours(20).AddMinutes(30), strategy.ParseTime("8:30 PM", new ShortTimeFormat(), parsers));

                Assert.AreEqual(DateTime.Today.Date.AddHours(8).AddMinutes(30).AddSeconds(12), strategy.ParseTime("8:30:12 AM", new LongTimeFormat(), parsers));
                Assert.AreEqual(DateTime.Today.Date.AddHours(20).AddMinutes(30).AddSeconds(12), strategy.ParseTime("8:30:12 PM", new LongTimeFormat(), parsers));

                Assert.AreEqual(DateTime.Today.Date.AddHours(8).AddMinutes(30).AddSeconds(12), strategy.ParseTime("08:30:12", new CustomTimeFormat("hh:mm:ss"), parsers));

                Assert.AreEqual(DateTime.MinValue.Date.AddHours(15).AddMinutes(40), strategy.ParseTime("3 uur 40", new CustomTimeFormat("hh:mm:ss"), parsers));
            }
            finally
            {
                Thread.CurrentThread.CurrentCulture = currentCulture;
            }
        }