From 15d53adf8e9954f8b9933f102ceee4d4d78937ff Mon Sep 17 00:00:00 2001 From: Frederik Carlier Date: Tue, 22 May 2018 15:23:54 +0200 Subject: [PATCH] Test parsing and serialization of real numbers with > 5 decimals --- plist-cil.test/IssueTest.cs | 10 ++++++++++ plist-cil.test/NSNumberTests.cs | 7 +++++++ plist-cil.test/plist-cil.test.csproj | 3 +++ plist-cil.test/test-files/RoundtripReal.plist | 5 +++++ plist-cil/NSNumber.cs | 6 ++++-- 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 plist-cil.test/test-files/RoundtripReal.plist diff --git a/plist-cil.test/IssueTest.cs b/plist-cil.test/IssueTest.cs index 84209a7..13f5cdf 100644 --- a/plist-cil.test/IssueTest.cs +++ b/plist-cil.test/IssueTest.cs @@ -147,6 +147,16 @@ namespace plistcil.test Assert.Equal(expected, actual, false, true); } + + [Fact] + public static void RoundtripRealTest() + { + var expected = File.ReadAllText(@"test-files\RoundtripReal.plist"); + var value = XmlPropertyListParser.Parse(new FileInfo(@"test-files\RoundtripReal.plist")); + var actual = value.ToXmlPropertyList(); + + Assert.Equal(expected, actual, false, true); + } } } diff --git a/plist-cil.test/NSNumberTests.cs b/plist-cil.test/NSNumberTests.cs index 3a6e97c..d5672ba 100644 --- a/plist-cil.test/NSNumberTests.cs +++ b/plist-cil.test/NSNumberTests.cs @@ -20,6 +20,13 @@ namespace plistcil.test Assert.Equal(10032936613, number.ToObject()); } + [Fact] + public static void NSNumberWithDecimalTest() + { + var number = new NSNumber("1360155352.748765", NSNumber.REAL); + Assert.Equal("1360155352.748765", number.ToString()); + } + // The tests below make sure the numbers are being parsed correctly, and do not depend on the culture info // being set. Especially, decimal point may vary between cultures and we don't want to take a dependency on that // The value being used comes seen in a real property list: diff --git a/plist-cil.test/plist-cil.test.csproj b/plist-cil.test/plist-cil.test.csproj index af444f8..6d498f9 100644 --- a/plist-cil.test/plist-cil.test.csproj +++ b/plist-cil.test/plist-cil.test.csproj @@ -100,6 +100,9 @@ PreserveNewest + + PreserveNewest + diff --git a/plist-cil.test/test-files/RoundtripReal.plist b/plist-cil.test/test-files/RoundtripReal.plist new file mode 100644 index 0000000..3ea7eb1 --- /dev/null +++ b/plist-cil.test/test-files/RoundtripReal.plist @@ -0,0 +1,5 @@ + + + +1360155352.748765 + diff --git a/plist-cil/NSNumber.cs b/plist-cil/NSNumber.cs index 876601b..49d9628 100644 --- a/plist-cil/NSNumber.cs +++ b/plist-cil/NSNumber.cs @@ -331,7 +331,7 @@ namespace Claunia.PropertyList } case REAL: { - return ToDouble().ToString(CultureInfo.InvariantCulture); + return ToDouble().ToString("G17", CultureInfo.InvariantCulture); } case BOOLEAN: { @@ -369,7 +369,9 @@ namespace Claunia.PropertyList } else { - xml.Append(ToDouble().ToString(CultureInfo.InvariantCulture)); + // ToString() can truncate the decimals, so use "G17". See + // https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#the-round-trip-r-format-specifier + xml.Append(ToDouble().ToString("G17", CultureInfo.InvariantCulture)); } xml.Append("");