Skip to content

Commit

Permalink
Offset serializer (#11)
Browse files Browse the repository at this point in the history
* Add support for Offset.
* Fix assertions in tests for deserialized values.
* Update README.md

Co-authored-by: Greg Lincoln <greg@greglincoln.com>
  • Loading branch information
Tolyandre and tetious committed Jun 2, 2020
1 parent e967c4b commit f746e88
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 28 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,8 @@ BsonSerializer.RegisterSerializer(new InstantSerializer());
```

#Implemented NodaTime Types
# Implemented NodaTime Types (as of v2.1.0)

(as of v1.3.0)
* Instant
* LocalDate
* LocalTime
Expand All @@ -35,6 +34,7 @@ BsonSerializer.RegisterSerializer(new InstantSerializer());
* Period
* Duration
* ZonedDateTime
* Offset

# Dependencies

Expand Down
11 changes: 11 additions & 0 deletions src/MongoDb.Bson.NodaTime/OffsetSerializer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using NodaTime;
using NodaTime.Text;

namespace MongoDb.Bson.NodaTime
{
public class OffsetSerializer : PatternSerializer<Offset>
{
public OffsetSerializer() : base(OffsetPattern.GeneralInvariant)
{ }
}
}
4 changes: 2 additions & 2 deletions test/MongoDb.Bson.NodaTime.Tests/DurationSerializerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public void CanConvertValue()
var obj = new Test { Duration = Duration.FromSeconds(34) };
obj.ToTestJson().Should().Contain("'Duration' : '0:00:00:34'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.Duration.Should().Be(obj.Duration);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.Duration.Should().Be(obj.Duration);
}


Expand Down
8 changes: 4 additions & 4 deletions test/MongoDb.Bson.NodaTime.Tests/LocalDateSerializerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public void CanRoundTripValueWithIsoCalendar()
var obj = new Test { LocalDate = new LocalDate(2015, 1, 1) };
obj.ToTestJson().Should().Contain("'LocalDate' : '2015-01-01'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.LocalDate.Should().Be(obj.LocalDate);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.LocalDate.Should().Be(obj.LocalDate);
}

[Fact]
Expand All @@ -30,8 +30,8 @@ public void ConvertsToIsoCalendarWhenSerializing()
var obj = new Test { LocalDate = new LocalDate(2015, 1, 1).WithCalendar(CalendarSystem.PersianSimple) };
obj.ToTestJson().Should().Contain("'LocalDate' : '2015-01-01'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.LocalDate.Should().Be(obj.LocalDate.WithCalendar(CalendarSystem.Iso));
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.LocalDate.Should().Be(obj.LocalDate.WithCalendar(CalendarSystem.Iso));
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public void CanRoundTripValueWithIsoCalendar()
var obj = new Test { LocalDateTime = new LocalDateTime(2015, 1, 2, 3, 4, 5) };
obj.ToTestJson().Should().Contain("'LocalDateTime' : '2015-01-02T03:04:05'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.LocalDateTime.Should().Be(obj.LocalDateTime);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.LocalDateTime.Should().Be(obj.LocalDateTime);
}


Expand All @@ -31,8 +31,8 @@ public void ConvertsToIsoCalendarWhenSerializing()
var obj = new Test { LocalDateTime = new LocalDateTime(2015, 1, 2, 3, 4, 5).WithCalendar(CalendarSystem.PersianSimple) };
obj.ToTestJson().Should().Contain("'LocalDateTime' : '2015-01-02T03:04:05'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.LocalDateTime.Should().Be(obj.LocalDateTime.WithCalendar(CalendarSystem.Iso));
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.LocalDateTime.Should().Be(obj.LocalDateTime.WithCalendar(CalendarSystem.Iso));
}

[Fact]
Expand Down
4 changes: 2 additions & 2 deletions test/MongoDb.Bson.NodaTime.Tests/LocalTimeSerializerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public void CanRoundTripValueWithIsoCalendar()
var obj = new Test { LocalTime = new LocalTime(13, 25, 1) };
obj.ToTestJson().Should().Contain("'LocalTime' : '13:25:01'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.LocalTime.Should().Be(obj.LocalTime);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.LocalTime.Should().Be(obj.LocalTime);
}

[Fact]
Expand Down
8 changes: 4 additions & 4 deletions test/MongoDb.Bson.NodaTime.Tests/OffsetDateTimeSerializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public void CanRoundTripValueWithIsoCalendar()
var obj = new Test { OffsetDateTime = new LocalDateTime(2015, 1, 2, 3, 4, 5).WithOffset(Offset.FromHours(1)) };
obj.ToTestJson().Should().Contain("'OffsetDateTime' : '2015-01-02T03:04:05+01'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.OffsetDateTime.Should().Be(obj.OffsetDateTime);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.OffsetDateTime.Should().Be(obj.OffsetDateTime);
}


Expand All @@ -31,8 +31,8 @@ public void ConvertsToIsoCalendarWhenSerializing()
var obj = new Test { OffsetDateTime = new LocalDateTime(2015, 1, 2, 3, 4, 5).WithOffset(Offset.FromHours(1)).WithCalendar(CalendarSystem.PersianSimple) };
obj.ToTestJson().Should().Contain("'OffsetDateTime' : '2015-01-02T03:04:05+01'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.OffsetDateTime.Should().Be(obj.OffsetDateTime.WithCalendar(CalendarSystem.Iso));
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.OffsetDateTime.Should().Be(obj.OffsetDateTime.WithCalendar(CalendarSystem.Iso));
}

[Fact]
Expand Down
45 changes: 45 additions & 0 deletions test/MongoDb.Bson.NodaTime.Tests/OffsetSerializerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using FluentAssertions;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using NodaTime;
using System;
using Xunit;

namespace MongoDb.Bson.NodaTime.Tests
{
public class OffsetSerializerTests
{
static OffsetSerializerTests()
{
BsonSerializer.RegisterSerializer(new OffsetSerializer());
}

[Fact]
public void CanConvertValue()
{
var obj = new Test { Offset = Offset.FromHours(4) };
obj.ToTestJson().Should().Contain("'Offset' : '+04'");

var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.Offset.Should().Be(obj.Offset);
}

[Fact]
public void ThrowsWhenValueIsInvalid()
{
Assert.Throws<FormatException>(() => BsonSerializer.Deserialize<Test>(new BsonDocument(new BsonElement("Duration", "bleh"))));
}

[Fact]
public void CanParseNullable()
{
BsonSerializer.Deserialize<Test>(new BsonDocument(new BsonElement("OffsetNullable", BsonNull.Value))).OffsetNullable.Should().BeNull();
}

private class Test
{
public Offset Offset { get; set; }
public Offset? OffsetNullable { get; set; }
}
}
}
4 changes: 2 additions & 2 deletions test/MongoDb.Bson.NodaTime.Tests/PeriodSerializerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ public void CanConvertValue()
var obj = new Test { Period = Period.FromSeconds(34) };
obj.ToTestJson().Should().Contain("'Period' : 'PT34S'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.Period.Should().Be(obj.Period);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.Period.Should().Be(obj.Period);
}


Expand Down
16 changes: 8 additions & 8 deletions test/MongoDb.Bson.NodaTime.Tests/ZonedDateTimeSerializerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ public void CanRoundTripValue_Eastern()
var obj = new Test { ZonedDateTime = dateTime };
obj.ToTestJson().Should().Contain("'ZonedDateTime' : '2015-01-01T22:04:05 America/New_York (-05)'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.ZonedDateTime.Should().Be(obj.ZonedDateTime);
obj.ZonedDateTime.Should().Be(dateTime);
obj.ZonedDateTime.Zone.Should().Be(easternTimezone);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.ZonedDateTime.Should().Be(obj.ZonedDateTime);
deserialized.ZonedDateTime.Should().Be(dateTime);
deserialized.ZonedDateTime.Zone.Should().Be(easternTimezone);
}

[Fact]
Expand All @@ -35,10 +35,10 @@ public void CanRoundTripValue_UTC()
var obj = new Test { ZonedDateTime = dateTime };
obj.ToTestJson().Should().Contain("'ZonedDateTime' : '2015-01-02T03:04:05 UTC (+00)'");

obj = BsonSerializer.Deserialize<Test>(obj.ToBson());
obj.ZonedDateTime.Should().Be(obj.ZonedDateTime);
obj.ZonedDateTime.Should().Be(dateTime);
obj.ZonedDateTime.Zone.Should().Be(DateTimeZone.Utc);
var deserialized = BsonSerializer.Deserialize<Test>(obj.ToBson());
deserialized.ZonedDateTime.Should().Be(obj.ZonedDateTime);
deserialized.ZonedDateTime.Should().Be(dateTime);
deserialized.ZonedDateTime.Zone.Should().Be(DateTimeZone.Utc);
}

[Fact]
Expand Down

0 comments on commit f746e88

Please sign in to comment.