public void Can_serialize_UnixEpochMs_DateTimes(int whichDate)
        {
            var dateTime = DateTimeSerializerTests.DateTimeTests[whichDate].ToUniversalTime();
            var dto = new TestObject { Date = dateTime };
            var unixTime = dateTime.ToUnixTimeMs();

            var expectedJson = "{\"Date\":" + unixTime + "}";
            var json = dto.ToJson();

            Assert.That(json, Is.EqualTo(expectedJson));

            var fromJson = json.FromJson<TestObject>();
            var nearestSec = TimeSpan.FromSeconds(1);
            Assert.That(fromJson.Date.RoundToMs(), Is.EqualTo(dateTime.RoundToMs()));
        }
        public void DateTime_Is_Serialized_As_Utc_and_Deserialized_as_local()
        {
            var testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 1, 0, 0, 1, DateTimeKind.Utc)
            };

            Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);

            //Can change default behavior with config
            using (JsConfig.With(alwaysUseUtc: true))
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }

            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            };

            Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);

            //Can change default behavior with config
            using (JsConfig.With(alwaysUseUtc: true))
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }
        }
        public void DateTimeKind_Does_Not_Change_With_SkipDateTimeConversion_true()
        {
            JsConfig.DateHandler = DateHandler.ISO8601;
            JsConfig.SkipDateTimeConversion = true;
            string serilizedResult;
            TestObject deserilizedResult;

            var testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 1, 0, 0, 1, DateTimeKind.Utc)
            };
            serilizedResult = TypeSerializer.SerializeToString<TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString<TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Utc, deserilizedResult.Date.Kind);
             
            using (JsConfig.With(skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }

            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            };
            serilizedResult = TypeSerializer.SerializeToString<TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString<TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Utc, deserilizedResult.Date.Kind);

            using (JsConfig.With(skipDateTimeConversion: false))  
            {
                Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }
            using (JsConfig.With(alwaysUseUtc: true, skipDateTimeConversion:false)) //It will work now
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }

            //make sure it still keeps local local
            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 2, 0, 2, 0, DateTimeKind.Local)
            };
            serilizedResult = TypeSerializer.SerializeToString<TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString<TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Local, deserilizedResult.Date.Kind);
             
            using (JsConfig.With(alwaysUseUtc: true))
            {
                Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }
            using (JsConfig.With(alwaysUseUtc: true, skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }


            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 2, 0, 2, 0, DateTimeKind.Unspecified)
            };
            serilizedResult = TypeSerializer.SerializeToString<TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString<TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Unspecified, deserilizedResult.Date.Kind);

            using (JsConfig.With(alwaysUseUtc: true))
            {
                Assert.AreEqual(DateTimeKind.Unspecified, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }
            using (JsConfig.With(alwaysUseUtc: true, skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString<TestObject>(TypeSerializer.SerializeToString<TestObject>(testObject)).Date.Kind);
            }

            using (JsConfig.With(skipDateTimeConversion: false))
            {
                serilizedResult = TypeSerializer.SerializeToString<TestObject>(testObject);
                deserilizedResult = TypeSerializer.DeserializeFromString<TestObject>(serilizedResult);
                Assert.AreEqual(DateTimeKind.Local, deserilizedResult.Date.Kind);
            }
        }
        public void DateTimeKind_Does_Not_Change_With_SkipDateTimeConversion_true()
        {
            JsConfig.DateHandler            = DateHandler.ISO8601;
            JsConfig.SkipDateTimeConversion = true;
            string     serilizedResult;
            TestObject deserilizedResult;

            var testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 1, 0, 0, 1, DateTimeKind.Utc)
            };

            serilizedResult   = TypeSerializer.SerializeToString <TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString <TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Utc, deserilizedResult.Date.Kind);

            using (JsConfig.With(skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }

            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 1, 0, 0, 0, DateTimeKind.Utc)
            };
            serilizedResult   = TypeSerializer.SerializeToString <TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString <TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Utc, deserilizedResult.Date.Kind);

            using (JsConfig.With(skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }
            using (JsConfig.With(alwaysUseUtc: true, skipDateTimeConversion: false)) //It will work now
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }

            //make sure it still keeps local local
            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 2, 0, 2, 0, DateTimeKind.Local)
            };
            serilizedResult   = TypeSerializer.SerializeToString <TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString <TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Local, deserilizedResult.Date.Kind);

            using (JsConfig.With(alwaysUseUtc: true))
            {
                Assert.AreEqual(DateTimeKind.Local, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }
            using (JsConfig.With(alwaysUseUtc: true, skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }


            testObject = new TestObject
            {
                Date = new DateTime(2013, 1, 2, 0, 2, 0, DateTimeKind.Unspecified)
            };
            serilizedResult   = TypeSerializer.SerializeToString <TestObject>(testObject);
            deserilizedResult = TypeSerializer.DeserializeFromString <TestObject>(serilizedResult);
            Assert.AreEqual(deserilizedResult.Date, testObject.Date);
            Assert.AreEqual(DateTimeKind.Unspecified, deserilizedResult.Date.Kind);

            using (JsConfig.With(alwaysUseUtc: true))
            {
                Assert.AreEqual(DateTimeKind.Unspecified, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }
            using (JsConfig.With(alwaysUseUtc: true, skipDateTimeConversion: false))
            {
                Assert.AreEqual(DateTimeKind.Utc, TypeSerializer.DeserializeFromString <TestObject>(TypeSerializer.SerializeToString <TestObject>(testObject)).Date.Kind);
            }

            using (JsConfig.With(skipDateTimeConversion: false))
            {
                serilizedResult   = TypeSerializer.SerializeToString <TestObject>(testObject);
                deserilizedResult = TypeSerializer.DeserializeFromString <TestObject>(serilizedResult);
                Assert.AreEqual(DateTimeKind.Local, deserilizedResult.Date.Kind);
            }
        }
        public void Does_serialize_to_UnixTime_when_scoped()
        {
            var dto = new TestObject { Date = new DateTime(2001,01,01, 0, 0, 0, DateTimeKind.Utc) };
            
            using (var config = JsConfig.BeginScope())
            {
                config.DateHandler = DateHandler.UnixTime;

                var json = dto.ToJson();
                Assert.That(json, Is.EquivalentTo("{\"Date\":978307200}"));

                var fromJson = JsonSerializer.DeserializeFromString<TestObject>(json);
                Assert.That(fromJson.Date, Is.EqualTo(dto.Date));
            }
        }