public void DeserializeAsMetresWithFullySerializedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'metres': 123.456,
  'unit': {
    'name': 'kilometre',
    'abbreviation': 'km',
    'valueInMetres': '1000'
  }
}";
            var    converter      = new LengthJsonConverter();
            var    expectedResult =
                new Length(metres: (number)123.456m)
                .Convert(new LengthUnit(
                             name: "kilometre",
                             abbreviation: "km",
                             valueInMetres: (number)1000));

            // act
            var result = JsonConvert.DeserializeObject <Length>(json, converter);

            // assert
            result.Should().Be(expectedResult);
        }
        public void Serialize_ShouldReturnValidJson(LengthSerializeTestData testData)
        {
            // arrange
            var converter = new LengthJsonConverter(testData.Format, testData.UnitFormat);

            // act
            string actualJson = JsonConvert.SerializeObject(testData.Quantity, converter);

            // assert
            actualJson.Should().MatchRegex(testData.ExpectedJsonPattern);
        }
        public void DeserializeAsMetres_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'metres': 123.456
}";
            var    converter      = new LengthJsonConverter();
            var    expectedResult =
                new Length(metres: (number)123.456m);

            // act
            var result = JsonConvert.DeserializeObject <Length>(json, converter);

            // assert
            result.Should().Be(expectedResult);
        }
        public void DeserializeAsMetresWithPredefinedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'metres': 123.456,
  'unit': 'km'
}";
            var    converter      = new LengthJsonConverter();
            var    expectedResult =
                new Length(metres: (number)123.456m)
                .Convert(LengthUnit.Kilometre);

            // act
            var result = JsonConvert.DeserializeObject <Length>(json, converter);

            // assert
            result.Should().Be(expectedResult);
        }
        public void SerializeAndDeserializeWithoutMetres_ShouldBeApproximatelyIdempotent()
        {
            // arrange
            var length    = Fixture.Create <Length>();
            var converter = new LengthJsonConverter(LengthJsonSerializationFormat.AsValueWithUnit);

            // act
            string serializedLength1   = JsonConvert.SerializeObject(length, converter);
            var    deserializedLength1 = JsonConvert.DeserializeObject <Length>(serializedLength1, converter);
            string serializedLength2   = JsonConvert.SerializeObject(deserializedLength1, converter);
            var    deserializedLength2 = JsonConvert.DeserializeObject <Length>(serializedLength2, converter);

            // assert
            deserializedLength1.Metres.Should().BeApproximately(length.Metres);
            deserializedLength2.Metres.Should().BeApproximately(length.Metres);

            deserializedLength2.Should().Be(deserializedLength1);
            serializedLength2.Should().Be(serializedLength1);
        }
        public void SerializeAndDeserializeWithMetres_ShouldBeIdempotent(LengthJsonSerializationFormat format, LinearUnitJsonSerializationFormat unitFormat)
        {
            // arrange
            var length    = Fixture.Create <Length>();
            var converter = new LengthJsonConverter(format, unitFormat);

            // act
            string serializedLength1   = JsonConvert.SerializeObject(length, converter);
            var    deserializedLength1 = JsonConvert.DeserializeObject <Length>(serializedLength1, converter);
            string serializedLength2   = JsonConvert.SerializeObject(deserializedLength1, converter);
            var    deserializedLength2 = JsonConvert.DeserializeObject <Length>(serializedLength2, converter);

            // assert
            deserializedLength1.Should().Be(length);
            deserializedLength2.Should().Be(length);

            deserializedLength2.Should().Be(deserializedLength1);
            serializedLength2.Should().Be(serializedLength1);
        }