public void DeserializeAsWattsWithFullySerializedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'watts': 123.456,
  'unit': {
    'name': 'kilowatt',
    'abbreviation': 'kW',
    'valueInWatts': '1000'
  }
}";
            var    converter      = new PowerJsonConverter();
            var    expectedResult =
                new Power(watts: (number)123.456m)
                .Convert(new PowerUnit(
                             name: "kilowatt",
                             abbreviation: "kW",
                             valueInWatts: (number)1000));

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

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

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

            // assert
            actualJson.Should().MatchRegex(testData.ExpectedJsonPattern);
        }
        public void DeserializeAsWatts_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'watts': 123.456
}";
            var    converter      = new PowerJsonConverter();
            var    expectedResult =
                new Power(watts: (number)123.456m);

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

            // assert
            result.Should().Be(expectedResult);
        }
        public void DeserializeAsWattsWithPredefinedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'watts': 123.456,
  'unit': 'kW'
}";
            var    converter      = new PowerJsonConverter();
            var    expectedResult =
                new Power(watts: (number)123.456m)
                .Convert(PowerUnit.Kilowatt);

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

            // assert
            result.Should().Be(expectedResult);
        }
        public void SerializeAndDeserializeWithoutWatts_ShouldBeApproximatelyIdempotent()
        {
            // arrange
            var power     = Fixture.Create <Power>();
            var converter = new PowerJsonConverter(PowerJsonSerializationFormat.AsValueWithUnit);

            // act
            string serializedPower1   = JsonConvert.SerializeObject(power, converter);
            var    deserializedPower1 = JsonConvert.DeserializeObject <Power>(serializedPower1, converter);
            string serializedPower2   = JsonConvert.SerializeObject(deserializedPower1, converter);
            var    deserializedPower2 = JsonConvert.DeserializeObject <Power>(serializedPower2, converter);

            // assert
            deserializedPower1.Watts.Should().BeApproximately(power.Watts);
            deserializedPower2.Watts.Should().BeApproximately(power.Watts);

            deserializedPower2.Should().Be(deserializedPower1);
            serializedPower2.Should().Be(serializedPower1);
        }
        public void SerializeAndDeserializeWithWatts_ShouldBeIdempotent(PowerJsonSerializationFormat format, LinearUnitJsonSerializationFormat unitFormat)
        {
            // arrange
            var power     = Fixture.Create <Power>();
            var converter = new PowerJsonConverter(format, unitFormat);

            // act
            string serializedPower1   = JsonConvert.SerializeObject(power, converter);
            var    deserializedPower1 = JsonConvert.DeserializeObject <Power>(serializedPower1, converter);
            string serializedPower2   = JsonConvert.SerializeObject(deserializedPower1, converter);
            var    deserializedPower2 = JsonConvert.DeserializeObject <Power>(serializedPower2, converter);

            // assert
            deserializedPower1.Should().Be(power);
            deserializedPower2.Should().Be(power);

            deserializedPower2.Should().Be(deserializedPower1);
            serializedPower2.Should().Be(serializedPower1);
        }