public void DeserializeAsTurnsWithFullySerializedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'turns': 123.456,
  'unit': {
    'name': 'degree',
    'abbreviation': 'deg',
    'symbol': '°',
    'unitsPerTurn': '360'
  }
}";
            var    converter      = new AngleJsonConverter();
            var    expectedResult =
                new Angle(turns: (number)123.456m)
                .Convert(new AngleUnit(
                             name: "degree",
                             abbreviation: "deg",
                             symbol: "°",
                             unitsPerTurn: (number)360));

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

            // assert
            result.Should().Be(expectedResult);
        }
 private static JsonSerializerSettings CreateSettings(AngleJsonConverter converter, string culture)
 {
     return(new JsonSerializerSettings
     {
         Converters = new JsonConverter[] { converter },
         Culture = CultureInfo.GetCultureInfo(culture),
     });
 }
        public void Serialize_ShouldReturnValidJson(AngleSerializeTestData testData)
        {
            // arrange
            var converter = new AngleJsonConverter(testData.Format, testData.UnitFormat);

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

            // assert
            actualJson.Should().MatchRegex(testData.ExpectedJsonPattern);
        }
        public void DeserializeAsTurns_ShouldReturnValidResult()
        {
            // arrange
            string json      = @"{
  'turns': 0.5
}";
            var    converter = new AngleJsonConverter();

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

            // assert
            result.Turns.Should().Be(0.5d);
            result.Value.Should().Be(0.5d);
            result.Unit.Should().Be(AngleUnit.Turn);
        }
        public void DeserializeAsTurnsWithPredefinedUnit_ShouldReturnValidResult()
        {
            // arrange
            string json           = @"{
  'turns': 123.456,
  'unit': 'deg'
}";
            var    converter      = new AngleJsonConverter();
            var    expectedResult =
                new Angle(turns: (number)123.456m)
                .Convert(AngleUnit.Degree);

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

            // assert
            result.Should().Be(expectedResult);
        }
        public void SerializeAndDeserializeWithoutTurns_ShouldBeApproximatelyIdempotent()
        {
            // arrange
            var angle     = Fixture.Create <Angle>();
            var converter = new AngleJsonConverter(AngleJsonSerializationFormat.AsValueWithUnit);

            // act
            string serializedAngle1   = JsonConvert.SerializeObject(angle, converter);
            var    deserializedAngle1 = JsonConvert.DeserializeObject <Angle>(serializedAngle1, converter);
            string serializedAngle2   = JsonConvert.SerializeObject(deserializedAngle1, converter);
            var    deserializedAngle2 = JsonConvert.DeserializeObject <Angle>(serializedAngle2, converter);

            // assert
            deserializedAngle1.Turns.Should().BeApproximately(angle.Turns);
            deserializedAngle2.Turns.Should().BeApproximately(angle.Turns);

            deserializedAngle2.Should().Be(deserializedAngle1);
            serializedAngle2.Should().Be(serializedAngle1);
        }
        public void SerializeAndDeserializeWithTurns_ShouldBeIdempotent(AngleJsonSerializationFormat format, LinearUnitJsonSerializationFormat unitFormat)
        {
            // arrange
            var angle     = Fixture.Create <Angle>();
            var converter = new AngleJsonConverter(format, unitFormat);

            // act
            string serializedAngle1   = JsonConvert.SerializeObject(angle, converter);
            var    deserializedAngle1 = JsonConvert.DeserializeObject <Angle>(serializedAngle1, converter);
            string serializedAngle2   = JsonConvert.SerializeObject(deserializedAngle1, converter);
            var    deserializedAngle2 = JsonConvert.DeserializeObject <Angle>(serializedAngle2, converter);

            // assert
            deserializedAngle1.Should().Be(angle);
            deserializedAngle2.Should().Be(angle);

            deserializedAngle2.Should().Be(deserializedAngle1);
            serializedAngle2.Should().Be(serializedAngle1);
        }
        public void DeserializeAsValueWithUnit_ShouldReturnValidResult()
        {
            // arrange
            string json      = @"{
  'value': 180,
  'unit': {
    'name': 'degree',
    'abbreviation': 'deg',
    'symbol': '°',
    'unitsPerTurn': 360
  }
}";
            var    converter = new AngleJsonConverter();

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

            // assert
            result.Turns.Should().Be(0.5d);
            result.Value.Should().Be(180d);
            result.Unit.Should().Be(AngleUnit.Degree);
        }