public void WriteListTypeNameForProperty()
        {
            string listRef = ReflectionUtils.GetTypeName(
                typeof(List <int>),
                TypeNameAssemblyFormatHandling.Simple,
                null
                );

            TypeNameHandlingTests.TypeNameProperty typeNameProperty =
                new TypeNameHandlingTests.TypeNameProperty
            {
                Name  = "Name!",
                Value = new List <int> {
                    1, 2, 3, 4, 5
                }
            };

            string json = JsonConvert.SerializeObject(typeNameProperty, Formatting.Indented);

            StringAssert.AreEqual(
                @"{
  ""Name"": ""Name!"",
  ""Value"": {
    ""$type"": """
                + listRef
                + @""",
    ""$values"": [
      1,
      2,
      3,
      4,
      5
    ]
  }
}",
                json
                );

            TypeNameHandlingTests.TypeNameProperty deserialized =
                JsonConvert.DeserializeObject <TypeNameHandlingTests.TypeNameProperty>(
                    json,
                    new JsonSerializerSettings
            {
                MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead
            }
                    );
            Assert.AreEqual("Name!", deserialized.Name);
            CustomAssert.IsInstanceOfType(typeof(List <int>), deserialized.Value);

            List <int> nested = (List <int>)deserialized.Value;

            Assert.AreEqual(5, nested.Count);
            Assert.AreEqual(1, nested[0]);
            Assert.AreEqual(2, nested[1]);
            Assert.AreEqual(3, nested[2]);
            Assert.AreEqual(4, nested[3]);
            Assert.AreEqual(5, nested[4]);
        }
        public void WriteListTypeNameForProperty()
        {
            string listRef = ReflectionUtils.GetTypeName(typeof(List<int>), FormatterAssemblyStyle.Simple, null);

            TypeNameHandlingTests.TypeNameProperty typeNameProperty = new TypeNameHandlingTests.TypeNameProperty
            {
                Name = "Name!",
                Value = new List<int> { 1, 2, 3, 4, 5 }
            };

            string json = JsonConvert.SerializeObject(typeNameProperty, Formatting.Indented);

            StringAssert.AreEqual(@"{
  ""Name"": ""Name!"",
  ""Value"": {
    ""$type"": """ + listRef + @""",
    ""$values"": [
      1,
      2,
      3,
      4,
      5
    ]
  }
}", json);

            TypeNameHandlingTests.TypeNameProperty deserialized = JsonConvert.DeserializeObject<TypeNameHandlingTests.TypeNameProperty>(json, new JsonSerializerSettings
            {
                MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead
            });
            Assert.AreEqual("Name!", deserialized.Name);
            CustomAssert.IsInstanceOfType(typeof(List<int>), deserialized.Value);

            List<int> nested = (List<int>)deserialized.Value;
            Assert.AreEqual(5, nested.Count);
            Assert.AreEqual(1, nested[0]);
            Assert.AreEqual(2, nested[1]);
            Assert.AreEqual(3, nested[2]);
            Assert.AreEqual(4, nested[3]);
            Assert.AreEqual(5, nested[4]);
        }