Co-authored-by: Sneha Shivakumar <snshivakumar@microsoft.com>
465 lines
14 KiB
C#
465 lines
14 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
#if NET20
|
|
using Newtonsoft.Json.Utilities.LinqBridge;
|
|
#else
|
|
using System.Linq;
|
|
#endif
|
|
using System.Text;
|
|
using Newtonsoft.Json.Linq;
|
|
#if DNXCORE50
|
|
using Xunit;
|
|
using TestAttribute = Xunit.FactAttribute;
|
|
using Assert = Newtonsoft.Json.Tests.XUnitAssert;
|
|
#else
|
|
using NUnit.Framework;
|
|
|
|
#endif
|
|
|
|
namespace Newtonsoft.Json.Tests.Linq
|
|
{
|
|
[TestFixture]
|
|
public class AnnotationsTests : TestFixtureBase
|
|
{
|
|
[Test]
|
|
public void AddAnnotation()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual("A string!", s);
|
|
|
|
s = (string)o.Annotation(typeof(string));
|
|
Assert.AreEqual("A string!", s);
|
|
}
|
|
|
|
[Test]
|
|
public void AddAnnotation_MultipleOfTheSameType()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation("Another string!");
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual("A string!", s);
|
|
|
|
s = (string)o.Annotation(typeof(string));
|
|
Assert.AreEqual("A string!", s);
|
|
}
|
|
|
|
[Test]
|
|
public void AddAnnotation_MultipleOfDifferentTypes()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation(new Uri("http://www.google.com/"));
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual("A string!", s);
|
|
|
|
s = (string)o.Annotation(typeof(string));
|
|
Assert.AreEqual("A string!", s);
|
|
|
|
Uri i = o.Annotation<Uri>();
|
|
Assert.AreEqual(new Uri("http://www.google.com/"), i);
|
|
|
|
i = (Uri)o.Annotation(typeof(Uri));
|
|
Assert.AreEqual(new Uri("http://www.google.com/"), i);
|
|
}
|
|
|
|
[Test]
|
|
public void GetAnnotation_NeverSet()
|
|
{
|
|
JObject o = new JObject();
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
s = (string)o.Annotation(typeof(string));
|
|
Assert.AreEqual(null, s);
|
|
}
|
|
|
|
[Test]
|
|
public void GetAnnotations()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation("A string 2!");
|
|
o.AddAnnotation("A string 3!");
|
|
|
|
IList<string> l = o.Annotations<string>().ToList();
|
|
|
|
Assert.AreEqual(3, l.Count);
|
|
Assert.AreEqual("A string!", l[0]);
|
|
Assert.AreEqual("A string 2!", l[1]);
|
|
Assert.AreEqual("A string 3!", l[2]);
|
|
|
|
l = o.Annotations(typeof(string)).Cast<string>().ToList();
|
|
|
|
Assert.AreEqual(3, l.Count);
|
|
Assert.AreEqual("A string!", l[0]);
|
|
Assert.AreEqual("A string 2!", l[1]);
|
|
Assert.AreEqual("A string 3!", l[2]);
|
|
}
|
|
|
|
[Test]
|
|
public void GetAnnotations_MultipleTypes()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation("A string 2!");
|
|
o.AddAnnotation("A string 3!");
|
|
o.AddAnnotation(new Uri("http://www.google.com/"));
|
|
|
|
IList<object> l = o.Annotations<object>().ToList();
|
|
|
|
Assert.AreEqual(4, l.Count);
|
|
Assert.AreEqual("A string!", l[0]);
|
|
Assert.AreEqual("A string 2!", l[1]);
|
|
Assert.AreEqual("A string 3!", l[2]);
|
|
Assert.AreEqual(new Uri("http://www.google.com/"), l[3]);
|
|
|
|
l = o.Annotations(typeof(object)).ToList();
|
|
|
|
Assert.AreEqual(4, l.Count);
|
|
Assert.AreEqual("A string!", l[0]);
|
|
Assert.AreEqual("A string 2!", l[1]);
|
|
Assert.AreEqual("A string 3!", l[2]);
|
|
Assert.AreEqual(new Uri("http://www.google.com/"), l[3]);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
|
|
o.RemoveAnnotations<string>();
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_NonGeneric()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
|
|
o.RemoveAnnotations(typeof(string));
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
s = (string)o.Annotation(typeof(string));
|
|
Assert.AreEqual(null, s);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_Multiple()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation("A string 2!");
|
|
o.AddAnnotation("A string 3!");
|
|
|
|
o.RemoveAnnotations<string>();
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
o.AddAnnotation("A string 4!");
|
|
|
|
s = o.Annotation<string>();
|
|
Assert.AreEqual("A string 4!", s);
|
|
|
|
Uri i = (Uri)o.Annotation(typeof(Uri));
|
|
Assert.AreEqual(null, i);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_MultipleCalls()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation(new Uri("http://www.google.com/"));
|
|
|
|
o.RemoveAnnotations<string>();
|
|
o.RemoveAnnotations<Uri>();
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
Uri i = o.Annotation<Uri>();
|
|
Assert.AreEqual(null, i);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_Multiple_NonGeneric()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation("A string 2!");
|
|
|
|
o.RemoveAnnotations(typeof(string));
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_MultipleCalls_NonGeneric()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation(new Uri("http://www.google.com/"));
|
|
|
|
o.RemoveAnnotations(typeof(string));
|
|
o.RemoveAnnotations(typeof(Uri));
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
Uri i = o.Annotation<Uri>();
|
|
Assert.AreEqual(null, i);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_MultipleWithDifferentTypes()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation(new Uri("http://www.google.com/"));
|
|
|
|
o.RemoveAnnotations<string>();
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
Uri i = o.Annotation<Uri>();
|
|
Assert.AreEqual(new Uri("http://www.google.com/"), i);
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveAnnotation_MultipleWithDifferentTypes_NonGeneric()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("A string!");
|
|
o.AddAnnotation(new Uri("http://www.google.com/"));
|
|
|
|
o.RemoveAnnotations(typeof(string));
|
|
|
|
string s = o.Annotation<string>();
|
|
Assert.AreEqual(null, s);
|
|
|
|
Uri i = o.Annotation<Uri>();
|
|
Assert.AreEqual(new Uri("http://www.google.com/"), i);
|
|
}
|
|
|
|
[Test]
|
|
public void AnnotationsAreCopied()
|
|
{
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("string!");
|
|
AssertCloneCopy(o, "string!");
|
|
|
|
JProperty p = new JProperty("Name", "Content");
|
|
p.AddAnnotation("string!");
|
|
AssertCloneCopy(p, "string!");
|
|
|
|
JArray a = new JArray();
|
|
a.AddAnnotation("string!");
|
|
AssertCloneCopy(a, "string!");
|
|
|
|
JConstructor c = new JConstructor("Test");
|
|
c.AddAnnotation("string!");
|
|
AssertCloneCopy(c, "string!");
|
|
|
|
JValue v = new JValue(true);
|
|
v.AddAnnotation("string!");
|
|
AssertCloneCopy(v, "string!");
|
|
|
|
JRaw r = new JRaw("raw");
|
|
r.AddAnnotation("string!");
|
|
AssertCloneCopy(r, "string!");
|
|
}
|
|
|
|
[Test]
|
|
public void MultipleAnnotationsAreCopied()
|
|
{
|
|
Version version = new Version(1, 2, 3, 4);
|
|
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("string!");
|
|
o.AddAnnotation(version);
|
|
|
|
JObject o2 = (JObject)o.DeepClone();
|
|
Assert.AreEqual("string!", o2.Annotation<string>());
|
|
Assert.AreEqual(version, o2.Annotation<Version>());
|
|
|
|
o2.RemoveAnnotations<Version>();
|
|
Assert.AreEqual(1, o.Annotations<Version>().Count());
|
|
Assert.AreEqual(0, o2.Annotations<Version>().Count());
|
|
}
|
|
|
|
[Test]
|
|
public void NestedAnnotationsAreCopied()
|
|
{
|
|
Version version = new Version(1, 2, 3, 4);
|
|
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("string!");
|
|
o.AddAnnotation(version);
|
|
|
|
JValue v = new JValue(true);
|
|
v.AddAnnotation("string!");
|
|
v.AddAnnotation(version);
|
|
|
|
o["Item1"] = v;
|
|
|
|
JObject o2 = (JObject)o.DeepClone();
|
|
Assert.AreEqual("string!", o2.Annotation<string>());
|
|
Assert.AreEqual(version, o2.Annotation<Version>());
|
|
|
|
JValue v2 = (JValue)o2["Item1"];
|
|
Assert.AreEqual("string!", v2.Annotation<string>());
|
|
Assert.AreEqual(version, v2.Annotation<Version>());
|
|
}
|
|
|
|
[Test]
|
|
public void NestedAnnotationsAreCopiedWithDefault()
|
|
{
|
|
Version version = new Version(1, 2, 3, 4);
|
|
JsonCloneSettings settings = new JsonCloneSettings();
|
|
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("string!");
|
|
o.AddAnnotation(version);
|
|
|
|
JValue v = new JValue(true);
|
|
v.AddAnnotation("string!");
|
|
v.AddAnnotation(version);
|
|
|
|
o["Item1"] = v;
|
|
|
|
JObject o2 = (JObject)o.DeepClone(settings);
|
|
Assert.AreEqual("string!", o2.Annotation<string>());
|
|
Assert.AreEqual(version, o2.Annotation<Version>());
|
|
|
|
JValue v2 = (JValue)o2["Item1"];
|
|
Assert.AreEqual("string!", v2.Annotation<string>());
|
|
Assert.AreEqual(version, v2.Annotation<Version>());
|
|
}
|
|
|
|
[Test]
|
|
public void NestedAnnotationsAreNotCopiedWithSettingsCopyAnnotationsFalse()
|
|
{
|
|
Version version = new Version(1, 2, 3, 4);
|
|
JsonCloneSettings settings = new JsonCloneSettings() { CopyAnnotations = false };
|
|
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("string!");
|
|
o.AddAnnotation(version);
|
|
|
|
JValue v = new JValue(true);
|
|
v.AddAnnotation("string!");
|
|
v.AddAnnotation(version);
|
|
|
|
o["Item1"] = v;
|
|
|
|
JObject o2 = (JObject)o.DeepClone(settings);
|
|
Assert.IsNull(o2.Annotation<string>());
|
|
Assert.AreEqual(0, o2.Annotations<Version>().Count());
|
|
|
|
JValue v2 = (JValue)o2["Item1"];
|
|
Assert.IsNull(v2.Annotation<string>());
|
|
Assert.AreEqual(0, v2.Annotations<Version>().Count());
|
|
}
|
|
|
|
private void AssertCloneCopy<T>(JToken t, T annotation) where T : class
|
|
{
|
|
Assert.AreEqual(annotation, t.DeepClone().Annotation<T>());
|
|
}
|
|
|
|
[Test]
|
|
public void MultipleAnnotationsAreNotCopiedWithSetting()
|
|
{
|
|
Version version = new Version(1, 2, 3, 4);
|
|
JsonCloneSettings settings = new JsonCloneSettings() { CopyAnnotations = false };
|
|
|
|
JObject o = new JObject();
|
|
o.AddAnnotation("string!");
|
|
o.AddAnnotation(version);
|
|
|
|
JObject o2 = (JObject)o.DeepClone(settings);
|
|
Assert.IsNull(o2.Annotation<string>());
|
|
Assert.AreEqual(0, o2.Annotations<Version>().Count());
|
|
|
|
JArray a = new JArray();
|
|
a.AddAnnotation("string!");
|
|
a.AddAnnotation(version);
|
|
|
|
JArray a2 = (JArray)a.DeepClone(settings);
|
|
Assert.IsNull(a2.Annotation<string>());
|
|
Assert.AreEqual(0, a2.Annotations<Version>().Count());
|
|
|
|
JProperty p = new JProperty("test");
|
|
p.AddAnnotation("string!");
|
|
p.AddAnnotation(version);
|
|
|
|
JProperty p2 = (JProperty)p.DeepClone(settings);
|
|
Assert.IsNull(p2.Annotation<string>());
|
|
Assert.AreEqual(0, p2.Annotations<Version>().Count());
|
|
|
|
JRaw r = new JRaw("test");
|
|
r.AddAnnotation("string!");
|
|
r.AddAnnotation(version);
|
|
|
|
JRaw r2 = (JRaw)r.DeepClone(settings);
|
|
Assert.IsNull(r2.Annotation<string>());
|
|
Assert.AreEqual(0, r2.Annotations<Version>().Count());
|
|
|
|
JConstructor c = new JConstructor("test");
|
|
c.AddAnnotation("string!");
|
|
c.AddAnnotation(version);
|
|
|
|
JConstructor c2 = (JConstructor)c.DeepClone(settings);
|
|
Assert.IsNull(c2.Annotation<string>());
|
|
Assert.AreEqual(0, c2.Annotations<Version>().Count());
|
|
|
|
JValue v = new JValue("test");
|
|
v.AddAnnotation("string!");
|
|
v.AddAnnotation(version);
|
|
|
|
JValue v2 = (JValue)v.DeepClone(settings);
|
|
Assert.IsNull(v2.Annotation<string>());
|
|
Assert.AreEqual(0, v2.Annotations<Version>().Count());
|
|
}
|
|
|
|
#if !NET20
|
|
[Test]
|
|
public void Example()
|
|
{
|
|
JObject o = JObject.Parse(@"{
|
|
'name': 'Bill G',
|
|
'age': 58,
|
|
'country': 'United States',
|
|
'employer': 'Microsoft'
|
|
}");
|
|
|
|
o.AddAnnotation(new HashSet<string>());
|
|
o.PropertyChanged += (sender, args) => o.Annotation<HashSet<string>>().Add(args.PropertyName);
|
|
|
|
o["age"] = 59;
|
|
o["employer"] = "Bill & Melinda Gates Foundation";
|
|
|
|
HashSet<string> changedProperties = o.Annotation<HashSet<string>>();
|
|
// age
|
|
// employer
|
|
|
|
Assert.AreEqual(2, changedProperties.Count);
|
|
}
|
|
#endif
|
|
}
|
|
} |