public void Convert_ForAllCultures_ReturnsTheExpectedValue()
        {
            // Arrange
            var originalCulture = Thread.CurrentThread.CurrentCulture;
            var testSubject     = new ShortIsoDateTimeOffsetConverter();
            var jsonWriterMock  = new Mock <JsonWriter>();
            // add ticks to the date to be sure that zeros are not automatically stripped out
            var dateTimeOffset = new DateTimeOffset(2017, 12, 23, 8, 25, 35, 456, TimeSpan.FromHours(1)).AddTicks(123);
            var results        = new List <Tuple <string, CultureInfo> >();

            jsonWriterMock.Setup(x => x.WriteValue(It.IsAny <string>()))
            .Callback <string>(s => results.Add(new Tuple <string, CultureInfo>(s, Thread.CurrentThread.CurrentCulture)));
            var cultureCount = 0;

            // Act
            try
            {
                var allCultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
                cultureCount = allCultures.Length;

                foreach (var culture in allCultures)
                {
                    Thread.CurrentThread.CurrentCulture = culture;
                    testSubject.WriteJson(jsonWriterMock.Object, dateTimeOffset, null);
                }
            }
            finally
            {
                Thread.CurrentThread.CurrentCulture = originalCulture;
            }

            // This variable is used to display properly the culture and the value when there is an error
            var nonMatchingDates = results.Where(x => x.Item1 != "2017-12-23T08:25:35.456+01:00")
                                   .Select(x => $"{x.Item2.EnglishName} => {x.Item1}")
                                   .ToList();

            // Assert
            results.Should().HaveCount(cultureCount);
            nonMatchingDates.Should().BeEmpty();
        }
        public void Convert_AlwaysReturnsAFixedSizeString()
        {
            // Arrange
            var testSubject    = new ShortIsoDateTimeOffsetConverter();
            var jsonWriterMock = new Mock <JsonWriter>();
            var resultLengths  = new List <int>();

            jsonWriterMock.Setup(x => x.WriteValue(It.IsAny <string>()))
            .Callback <string>(s => resultLengths.Add(s.Length));

            // Act
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(), null);
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(DateTime.Now), null);
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(DateTime.UtcNow, TimeSpan.Zero), null);
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(1, TimeSpan.Zero), null);
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(1, 1, 1, 1, 1, 1, TimeSpan.Zero), null);
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(1, 1, 1, 1, 1, 1, 1, TimeSpan.Zero), null);
            testSubject.WriteJson(jsonWriterMock.Object, new DateTimeOffset(1, 1, 1, 1, 1, 1, 1, new JapaneseCalendar(), TimeSpan.FromHours(1)), null);

            // Assert
            resultLengths.Should().HaveCount(7);
            resultLengths.Should().AllBeEquivalentTo(29);
        }