public void DoubleDeserialization() { List<Tuple<DoubleType, string>> testCases = new List<Tuple<DoubleType, string>>() { new Tuple<DoubleType, string>(new DoubleType() { Double = 0 }, "{}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 0 }, "{\"Double\":null}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 0 }, "{\"Double\":false}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 1 }, "{\"Double\":true}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 5.5 }, "{\"Double\":\"5.5\"}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 0 }, "{\"Double\":0}"), new Tuple<DoubleType, string>(new DoubleType() { Double = -1 }, "{\"Double\":-1}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 1 }, "{\"Double\":1}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 0 }, "{\"Double\":4.94065645841247E-325}"), new Tuple<DoubleType, string>(new DoubleType() { Double = 0 }, "{\"Double\":-4.94065645841247E-325}"), new Tuple<DoubleType, string>(new DoubleType() { Double = double.Epsilon }, "{\"Double\":4.94065645841247E-324}"), new Tuple<DoubleType, string>(new DoubleType() { Double = -double.Epsilon }, "{\"Double\":-4.94065645841247E-324}"), new Tuple<DoubleType, string>(new DoubleType() { Double = double.MaxValue }, "{\"Double\":1.7976931348623157E+308}"), new Tuple<DoubleType, string>(new DoubleType() { Double = double.MinValue }, "{\"Double\":-1.7976931348623157E+308}"), new Tuple<DoubleType, string>(new DoubleType() { Double = double.MaxValue }, "{\"Double\":1.79769313486231575E+308}"), // We're ok with lossing precision here; note the extra 5 digit at the end new Tuple<DoubleType, string>(new DoubleType() { Double = double.MinValue }, "{\"Double\":-1.79769313486231575E+308}"), // We're ok with lossing precision here; note the extra 5 digit at the end }; // Need to ensure that the type is registered as a table to force the id property check DefaultSerializer.SerializerSettings.ContractResolver.ResolveTableName(typeof(DoubleType)); foreach (var testCase in testCases) { var input = JToken.Parse(testCase.Item2); var expected = testCase.Item1; DoubleType actual = new DoubleType(); DefaultSerializer.Deserialize(input, actual); if (double.IsPositiveInfinity(expected.Double)) { Assert.IsTrue(double.IsPositiveInfinity(actual.Double)); } else if (double.IsNegativeInfinity(expected.Double)) { Assert.IsTrue(double.IsNegativeInfinity(actual.Double)); } else { Assert.AreEqual(actual.Double, expected.Double); } if (testCase.Item2 != "{}") { actual = new DoubleType(); actual.Double = 34.6; DefaultSerializer.Deserialize(input, actual); if (double.IsPositiveInfinity(expected.Double)) { Assert.IsTrue(double.IsPositiveInfinity(actual.Double)); } else if (double.IsNegativeInfinity(expected.Double)) { Assert.IsTrue(double.IsNegativeInfinity(actual.Double)); } else { Assert.AreEqual(actual.Double, expected.Double); } } JArray json = JToken.Parse("[" + testCase.Item2 + "]") as JArray; actual = DefaultSerializer.Deserialize<DoubleType>(json).FirstOrDefault(); if (double.IsPositiveInfinity(expected.Double)) { Assert.IsTrue(double.IsPositiveInfinity(actual.Double)); } else if (double.IsNegativeInfinity(expected.Double)) { Assert.IsTrue(double.IsNegativeInfinity(actual.Double)); } else { Assert.AreEqual(actual.Double, expected.Double); } actual = DefaultSerializer.Deserialize<DoubleType>(input); if (double.IsPositiveInfinity(expected.Double)) { Assert.IsTrue(double.IsPositiveInfinity(actual.Double)); } else if (double.IsNegativeInfinity(expected.Double)) { Assert.IsTrue(double.IsNegativeInfinity(actual.Double)); } else { Assert.AreEqual(actual.Double, expected.Double); } } }
public void DoubleDeserializationNegative() { List<string> testCases = new List<string>() { "{\"Double\":1.7976931348623157E+309}", "{\"Double\":-1.7976931348623157E+309}", }; foreach (var testCase in testCases) { var input = testCase; DoubleType actual = new DoubleType(); Exception actualError = null; try { // Need to ensure that the type is registered as a table to force the id property check DefaultSerializer.SerializerSettings.ContractResolver.ResolveTableName(typeof(DoubleType)); DefaultSerializer.Deserialize(input, actual); } catch (Exception e) { actualError = e; } Assert.Contains(actualError.Message, "is not a valid number. Path 'Double'"); } }
public void DoubleDeserializationNegative() { List<string> testCases = new List<string>() { "{\"Double\":1.7976931348623157E+309}", "{\"Double\":-1.7976931348623157E+309}", }; // Need to ensure that the type is registered as a table to force the id property check DefaultSerializer.SerializerSettings.ContractResolver.ResolveTableName(typeof(DoubleType)); foreach (var testCase in testCases) { var input = testCase; DoubleType actual = new DoubleType(); Exception actualError = null; try { DefaultSerializer.Deserialize(input, actual); } catch (Exception e) { actualError = e; } Assert.AreEqual(actualError.Message, "Value was either too large or too small for a Double."); } }