Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

521 lines
27 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace System.Json
{
/// <summary>
/// Tests for events on <see cref="JsonValue"/> instances.
/// </summary>
public class JsonValueEventsTests
{
/// <summary>
/// Events tests for JsonArray, test all method the causes change and all change type and validate changing/changed child and sub/unsub
/// </summary>
[Fact]
public void JsonArrayEventsTest()
{
int seed = 1;
const int maxArrayLength = 1024;
Random rand = new Random(seed);
JsonArray ja = SpecialJsonValueHelper.CreatePrePopulatedJsonArray(seed, rand.Next(maxArrayLength));
int addPosition = ja.Count;
JsonValue insertValue = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
TestEvents(
ja,
arr => arr.Add(insertValue),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, addPosition)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, addPosition)),
});
addPosition = ja.Count;
JsonValue jv1 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
JsonValue jv2 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
TestEvents(
ja,
arr => arr.AddRange(jv1, jv2),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja,
new JsonValueChangeEventArgs(
jv1,
JsonValueChange.Add, addPosition)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja,
new JsonValueChangeEventArgs(
jv2,
JsonValueChange.Add, addPosition + 1)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja,
new JsonValueChangeEventArgs(
jv1,
JsonValueChange.Add, addPosition)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja,
new JsonValueChangeEventArgs(
jv2,
JsonValueChange.Add, addPosition + 1)),
});
int replacePosition = rand.Next(ja.Count - 1);
JsonValue oldValue = ja[replacePosition];
JsonValue newValue = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
TestEvents(
ja,
arr => arr[replacePosition] = newValue,
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(newValue, JsonValueChange.Replace, replacePosition)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(oldValue, JsonValueChange.Replace, replacePosition)),
});
int insertPosition = rand.Next(ja.Count - 1);
insertValue = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
TestEvents(
ja,
arr => arr.Insert(insertPosition, insertValue),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, insertPosition)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, insertPosition)),
});
TestEvents(
ja,
arr => arr.RemoveAt(insertPosition),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, insertPosition)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, insertPosition)),
});
ja.Insert(0, insertValue);
TestEvents(
ja,
arr => arr.Remove(insertValue),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, 0)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, 0)),
});
TestEvents(
ja,
arr => arr.Clear(),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0)),
});
ja = new JsonArray(1, 2, 3);
TestEvents(
ja,
arr => arr.Remove(new JsonPrimitive("Not there")),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
JsonValue elementInArray = ja[1];
TestEvents(
ja,
arr => arr.Remove(elementInArray),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(elementInArray, JsonValueChange.Remove, 1)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(elementInArray, JsonValueChange.Remove, 1)),
});
}
/// <summary>
/// Tests for events for <see cref="JsonValue"/> instances when using the dynamic programming.
/// </summary>
[Fact]
public void DynamicEventsTest()
{
int seed = 1;
int maxObj = 10;
JsonArray ja = new JsonArray();
dynamic d = ja.AsDynamic();
TestEventsDynamic(
d,
(Action<dynamic>)(arr => arr.Add(1)),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(1, JsonValueChange.Add, 0)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(1, JsonValueChange.Add, 0)),
});
const string key1 = "first";
const string key2 = "second";
JsonObject jo = new JsonObject
{
{ key1, SpecialJsonValueHelper.GetRandomJsonPrimitives(seed) },
};
JsonObject objectToAdd = SpecialJsonValueHelper.CreateRandomPopulatedJsonObject(seed, maxObj);
dynamic d2 = jo.AsDynamic();
TestEventsDynamic(
d2,
(Action<dynamic>)(obj => obj[key2] = objectToAdd),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Add, key2)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Add, key2)),
});
TestEventsDynamic(
d2,
(Action<dynamic>)(obj => obj[key2] = objectToAdd),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Replace, key2)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Replace, key2)),
});
}
/// <summary>
/// Tests for events in <see cref="JsonObject"/> instances.
/// </summary>
[Fact]
public void JsonObjectEventsTest()
{
int seed = 1;
const int maxObj = 10;
const string key1 = "first";
const string key2 = "second";
const string key3 = "third";
const string key4 = "fourth";
const string key5 = "fifth";
JsonObject jo = new JsonObject
{
{ key1, SpecialJsonValueHelper.GetRandomJsonPrimitives(seed) },
{ key2, SpecialJsonValueHelper.GetRandomJsonPrimitives(seed) },
{ key3, null },
};
JsonObject objToAdd = SpecialJsonValueHelper.CreateRandomPopulatedJsonObject(seed, maxObj);
TestEvents(
jo,
obj => obj.Add(key4, objToAdd),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(objToAdd, JsonValueChange.Add, key4)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(objToAdd, JsonValueChange.Add, key4)),
},
obj => obj.Add("key44", objToAdd));
JsonArray jaToAdd = SpecialJsonValueHelper.CreatePrePopulatedJsonArray(seed, maxObj);
JsonValue replaced = jo[key2];
TestEvents(
jo,
obj => obj[key2] = jaToAdd,
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jaToAdd, JsonValueChange.Replace, key2)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(replaced, JsonValueChange.Replace, key2)),
});
JsonValue jpToAdd = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
TestEvents(
jo,
obj => obj[key5] = jpToAdd,
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jpToAdd, JsonValueChange.Add, key5)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jpToAdd, JsonValueChange.Add, key5)),
});
jo.Remove(key4);
jo.Remove(key5);
JsonValue jp1 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
JsonValue jp2 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
TestEvents(
jo,
obj => obj.AddRange(new JsonObject { { key4, jp1 }, { key5, jp1 } }),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jp1, JsonValueChange.Add, key4)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Add, key5)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jp1, JsonValueChange.Add, key4)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Add, key5)),
},
obj => obj.AddRange(new JsonObject { { "new key", jp1 }, { "newnewKey", jp2 } }));
TestEvents(
jo,
obj => obj.Remove(key5),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Remove, key5)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Remove, key5)),
});
TestEvents(
jo,
obj => obj.Remove("not there"),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
jo = new JsonObject { { key1, 1 }, { key2, 2 }, { key3, 3 } };
TestEvents(
jo,
obj => obj.Clear(),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null)),
});
jo = new JsonObject { { key1, 1 }, { key2, 2 }, { key3, 3 } };
TestEvents(
jo,
obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>(key2, jo[key2])),
new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
{
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Remove, key2)),
new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Remove, key2)),
},
obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>(key1, jo[key1])));
}
/// <summary>
/// Tests for events in <see cref="JsonValue"/> instances when multiple listeners are registered.
/// </summary>
[Fact]
public void MultipleListenersTest()
{
const string key1 = "first";
const string key2 = "second";
const string key3 = "third";
for (int changingListeners = 0; changingListeners <= 3; changingListeners++)
{
for (int changedListeners = 0; changedListeners <= 3; changedListeners++)
{
MultipleListenersTestInternal<JsonObject>(
() => new JsonObject { { key1, 1 }, { key2, 2 } },
delegate(JsonObject obj)
{
obj[key2] = "hello";
obj.Remove(key1);
obj.Add(key3, "world");
obj.Clear();
},
new List<JsonValueChangeEventArgs>
{
new JsonValueChangeEventArgs("hello", JsonValueChange.Replace, key2),
new JsonValueChangeEventArgs(1, JsonValueChange.Remove, key1),
new JsonValueChangeEventArgs("world", JsonValueChange.Add, key3),
new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null),
},
new List<JsonValueChangeEventArgs>
{
new JsonValueChangeEventArgs(2, JsonValueChange.Replace, key2),
new JsonValueChangeEventArgs(1, JsonValueChange.Remove, key1),
new JsonValueChangeEventArgs("world", JsonValueChange.Add, key3),
new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null),
},
changingListeners,
changedListeners);
MultipleListenersTestInternal<JsonArray>(
() => new JsonArray(1, 2),
delegate(JsonArray arr)
{
arr[1] = "hello";
arr.RemoveAt(0);
arr.Add("world");
arr.Clear();
},
new List<JsonValueChangeEventArgs>
{
new JsonValueChangeEventArgs("hello", JsonValueChange.Replace, 1),
new JsonValueChangeEventArgs(1, JsonValueChange.Remove, 0),
new JsonValueChangeEventArgs("world", JsonValueChange.Add, 1),
new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0),
},
new List<JsonValueChangeEventArgs>
{
new JsonValueChangeEventArgs(2, JsonValueChange.Replace, 1),
new JsonValueChangeEventArgs(1, JsonValueChange.Remove, 0),
new JsonValueChangeEventArgs("world", JsonValueChange.Add, 1),
new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0),
},
changingListeners,
changedListeners);
}
}
}
internal static void TestEvents<JsonValueType>(JsonValueType target, Action<JsonValueType> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents, Action<JsonValueType> actionToTriggerEvent2 = null) where JsonValueType : JsonValue
{
var actualEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
EventHandler<JsonValueChangeEventArgs> changingHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
EventHandler<JsonValueChangeEventArgs> changedHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
target.Changing += changingHandler;
target.Changed += changedHandler;
actionToTriggerEvent(target);
target.Changing -= changingHandler;
target.Changed -= changedHandler;
ValidateExpectedEvents(expectedEvents, actualEvents);
if (actionToTriggerEvent2 == null)
{
actionToTriggerEvent(target);
}
else
{
actionToTriggerEvent2(target);
}
ValidateExpectedEvents(expectedEvents, actualEvents);
}
internal static void TestEventsDynamic(dynamic target, Action<dynamic> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents)
{
var actualEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
EventHandler<JsonValueChangeEventArgs> changingHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
EventHandler<JsonValueChangeEventArgs> changedHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
target.Changing += changingHandler;
target.Changed += changedHandler;
actionToTriggerEvent(target);
target.Changing -= changingHandler;
target.Changed -= changedHandler;
ValidateExpectedEvents(expectedEvents, actualEvents);
actionToTriggerEvent(target);
ValidateExpectedEvents(expectedEvents, actualEvents);
}
private static void ValidateExpectedEvents(List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> actualEvents)
{
Assert.Equal(expectedEvents.Count, actualEvents.Count);
for (int i = 0; i < expectedEvents.Count; i++)
{
bool expectedIsChanging = expectedEvents[i].Item1;
bool actualIsChanging = expectedEvents[i].Item1;
Assert.Equal(expectedIsChanging, actualIsChanging);
JsonValue expectedSender = expectedEvents[i].Item2;
JsonValue actualSender = actualEvents[i].Item2;
Assert.Equal(expectedSender, actualSender);
JsonValueChangeEventArgs expectedEventArgs = expectedEvents[i].Item3;
JsonValueChangeEventArgs actualEventArgs = actualEvents[i].Item3;
Assert.Equal(expectedEventArgs.Change, actualEventArgs.Change);
Assert.Equal(expectedEventArgs.Index, actualEventArgs.Index);
Assert.Equal(expectedEventArgs.Key, actualEventArgs.Key);
string expectedChild = expectedEventArgs.Child == null ? "null" : expectedEventArgs.Child.ToString();
string actualChild = actualEventArgs.Child == null ? "null" : actualEventArgs.Child.ToString();
Assert.Equal(expectedChild, actualChild);
}
}
internal static void MultipleListenersTestInternal<JsonValueType>(
Func<JsonValueType> createTarget,
Action<JsonValueType> actionToTriggerEvents,
List<JsonValueChangeEventArgs> expectedChangingEventArgs,
List<JsonValueChangeEventArgs> expectedChangedEventArgs,
int changingListeners,
int changedListeners) where JsonValueType : JsonValue
{
Log.Info("Testing events on a {0} for {1} changING listeners and {2} changED listeners", typeof(JsonValueType).Name, changingListeners, changedListeners);
JsonValueType target = createTarget();
List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[] actualChangingEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[changingListeners];
List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[] actualChangedEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[changedListeners];
List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedChangingEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>(
expectedChangingEventArgs.Select((args) => new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, target, args)));
List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedChangedEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>(
expectedChangedEventArgs.Select((args) => new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, target, args)));
for (int i = 0; i < changingListeners; i++)
{
actualChangingEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
var index = i;
target.Changing += delegate(object sender, JsonValueChangeEventArgs e)
{
actualChangingEvents[index].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
};
}
for (int i = 0; i < changedListeners; i++)
{
actualChangedEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
var index = i;
target.Changed += delegate(object sender, JsonValueChangeEventArgs e)
{
actualChangedEvents[index].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
};
}
actionToTriggerEvents(target);
for (int i = 0; i < changingListeners; i++)
{
Log.Info("Validating Changing events for listener {0}", i);
ValidateExpectedEvents(expectedChangingEvents, actualChangingEvents[i]);
}
for (int i = 0; i < changedListeners; i++)
{
Log.Info("Validating Changed events for listener {0}", i);
ValidateExpectedEvents(expectedChangedEvents, actualChangedEvents[i]);
}
for (int i = 0; i < changingListeners; i++)
{
actualChangingEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
var index = i;
target.Changing -= delegate(object sender, JsonValueChangeEventArgs e)
{
actualChangingEvents[i].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
};
}
for (int i = 0; i < changedListeners; i++)
{
actualChangedEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
var index = i;
target.Changed -= delegate(object sender, JsonValueChangeEventArgs e)
{
actualChangedEvents[i].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
};
}
target = createTarget();
expectedChangingEvents.Clear();
expectedChangedEvents.Clear();
actionToTriggerEvents(target);
for (int i = 0; i < changingListeners; i++)
{
Log.Info("Validating Changing events for listener {0}", i);
ValidateExpectedEvents(expectedChangingEvents, actualChangingEvents[i]);
}
for (int i = 0; i < changedListeners; i++)
{
Log.Info("Validating Changed events for listener {0}", i);
ValidateExpectedEvents(expectedChangedEvents, actualChangedEvents[i]);
}
}
private static void ValidateJsonArrayItems(JsonArray jsonArray, IEnumerable<JsonValue> expectedItems)
{
List<JsonValue> expected = new List<JsonValue>(expectedItems);
Assert.Equal(expected.Count, jsonArray.Count);
for (int i = 0; i < expected.Count; i++)
{
Assert.Equal(expected[i], jsonArray[i]);
}
}
}
}