public void DeserializeAsKilogramsWithFullySerializedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'kilograms': 123.456,
  'unit': {
    'name': 'gram',
    'abbreviation': 'g',
    'valueInKilograms': '0.001'
  }
}";
            var    converter      = new WeightJsonConverter();
            var    expectedResult =
                new Weight(kilograms: (number)123.456m)
                .Convert(new WeightUnit(
                             name: "gram",
                             abbreviation: "g",
                             valueInKilograms: (number)0.001m));

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

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

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

            // assert
            actualJson.Should().MatchRegex(testData.ExpectedJsonPattern);
        }
        public void DeserializeAsKilograms_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'kilograms': 123.456
}";
            var    converter      = new WeightJsonConverter();
            var    expectedResult =
                new Weight(kilograms: (number)123.456m);

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

            // assert
            result.Should().Be(expectedResult);
        }
        public void SerializeAndDeserializeWithoutKilograms_ShouldBeApproximatelyIdempotent()
        {
            // arrange
            var weight    = Fixture.Create <Weight>();
            var converter = new WeightJsonConverter(WeightJsonSerializationFormat.AsValueWithUnit);

            // act
            string serializedWeight1   = JsonConvert.SerializeObject(weight, converter);
            var    deserializedWeight1 = JsonConvert.DeserializeObject <Weight>(serializedWeight1, converter);
            string serializedWeight2   = JsonConvert.SerializeObject(deserializedWeight1, converter);
            var    deserializedWeight2 = JsonConvert.DeserializeObject <Weight>(serializedWeight2, converter);

            // assert
            deserializedWeight1.Kilograms.Should().BeApproximately(weight.Kilograms);
            deserializedWeight2.Kilograms.Should().BeApproximately(weight.Kilograms);

            deserializedWeight2.Should().Be(deserializedWeight1);
            serializedWeight2.Should().Be(serializedWeight1);
        }
        public void SerializeAndDeserializeWithKilograms_ShouldBeIdempotent(WeightJsonSerializationFormat format, LinearUnitJsonSerializationFormat unitFormat)
        {
            // arrange
            var weight    = Fixture.Create <Weight>();
            var converter = new WeightJsonConverter(format, unitFormat);

            // act
            string serializedWeight1   = JsonConvert.SerializeObject(weight, converter);
            var    deserializedWeight1 = JsonConvert.DeserializeObject <Weight>(serializedWeight1, converter);
            string serializedWeight2   = JsonConvert.SerializeObject(deserializedWeight1, converter);
            var    deserializedWeight2 = JsonConvert.DeserializeObject <Weight>(serializedWeight2, converter);

            // assert
            deserializedWeight1.Should().Be(weight);
            deserializedWeight2.Should().Be(weight);

            deserializedWeight2.Should().Be(deserializedWeight1);
            serializedWeight2.Should().Be(serializedWeight1);
        }