private static void VerifyNavigator( string input, bool performExtraChecks = true) { CultureInfo defaultCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture; CultureInfo[] cultureInfoList = new CultureInfo[] { defaultCultureInfo, System.Globalization.CultureInfo.GetCultureInfo("fr-FR") }; try { foreach (CultureInfo cultureInfo in cultureInfoList) { System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; IJsonReader jsonReader = JsonReader.Create(Encoding.UTF8.GetBytes(input)); JsonToken[] tokensFromReader = JsonNavigatorTests.GetTokensWithReader(jsonReader); // Test text IJsonNavigator textNavigator = JsonNavigator.Create(Encoding.UTF8.GetBytes(input)); IJsonNavigatorNode textRootNode = textNavigator.GetRootNode(); JsonToken[] tokensFromTextNavigator = JsonNavigatorTests.GetTokensFromNode(textRootNode, textNavigator, performExtraChecks); Assert.IsTrue(tokensFromTextNavigator.SequenceEqual(tokensFromReader)); // Test binary byte[] binaryInput = JsonTestUtils.ConvertTextToBinary(input); IJsonNavigator binaryNavigator = JsonNavigator.Create(binaryInput); IJsonNavigatorNode binaryRootNode = binaryNavigator.GetRootNode(); JsonToken[] tokensFromBinaryNavigator = JsonNavigatorTests.GetTokensFromNode(binaryRootNode, binaryNavigator, performExtraChecks); Assert.IsTrue(tokensFromBinaryNavigator.SequenceEqual(tokensFromReader)); // Test binary + user string encoding JsonStringDictionary jsonStringDictionary = new JsonStringDictionary(capacity: 4096); byte[] binaryWithUserStringEncodingInput = JsonTestUtils.ConvertTextToBinary(input, jsonStringDictionary); if (jsonStringDictionary.TryGetStringAtIndex(index: 0, value: out _)) { Assert.IsFalse(binaryWithUserStringEncodingInput.SequenceEqual(binaryInput), "Binary should be different with user string encoding"); } IJsonNavigator binaryNavigatorWithUserStringEncoding = JsonNavigator.Create(binaryInput, jsonStringDictionary); IJsonNavigatorNode binaryRootNodeWithUserStringEncoding = binaryNavigatorWithUserStringEncoding.GetRootNode(); JsonToken[] tokensFromBinaryNavigatorWithUserStringEncoding = JsonNavigatorTests.GetTokensFromNode(binaryRootNodeWithUserStringEncoding, binaryNavigatorWithUserStringEncoding, performExtraChecks); Assert.IsTrue(tokensFromBinaryNavigatorWithUserStringEncoding.SequenceEqual(tokensFromReader)); } } finally { System.Threading.Thread.CurrentThread.CurrentCulture = defaultCultureInfo; } }
private static JsonToken[] GetTokensFromArrayNode(IJsonNavigatorNode node, IJsonNavigator navigator, bool performCorrectnessCheck) { // Get tokens once through IEnumerable List <JsonToken> tokensFromIEnumerable = new List <JsonToken>(); IEnumerable <IJsonNavigatorNode> arrayItems = navigator.GetArrayItems(node); tokensFromIEnumerable.Add(JsonToken.ArrayStart()); foreach (IJsonNavigatorNode arrayItem in arrayItems) { tokensFromIEnumerable.AddRange(JsonNavigatorTests.GetTokensFromNode(arrayItem, navigator, performCorrectnessCheck)); } tokensFromIEnumerable.Add(JsonToken.ArrayEnd()); if (performCorrectnessCheck) { // Get tokens once again through indexer List <JsonToken> tokensFromIndexer = new List <JsonToken>(); tokensFromIndexer.Add(JsonToken.ArrayStart()); for (int i = 0; i < navigator.GetArrayItemCount(node); ++i) { tokensFromIndexer.AddRange(JsonNavigatorTests.GetTokensFromNode(navigator.GetArrayItemAt(node, i), navigator, performCorrectnessCheck)); } tokensFromIndexer.Add(JsonToken.ArrayEnd()); Assert.AreEqual(arrayItems.Count(), navigator.GetArrayItemCount(node)); Assert.IsTrue(tokensFromIEnumerable.SequenceEqual(tokensFromIndexer)); try { navigator.GetArrayItemAt(node, navigator.GetArrayItemCount(node) + 1); Assert.Fail("Expected to get an index out of range exception from going one past the end of the array."); } catch (IndexOutOfRangeException) { Assert.AreEqual(navigator.SerializationFormat, JsonSerializationFormat.Binary); } catch (ArgumentOutOfRangeException) { Assert.AreEqual(navigator.SerializationFormat, JsonSerializationFormat.Text); } } return(tokensFromIEnumerable.ToArray()); }
internal static JsonToken[] GetTokensFromObjectNode(IJsonNavigatorNode node, IJsonNavigator navigator, bool performCorrectnessCheck) { // Get the tokens through .GetObjectProperties List <JsonToken> tokensFromGetProperties = new List <JsonToken>(); IEnumerable <ObjectProperty> properties = navigator.GetObjectProperties(node); tokensFromGetProperties.Add(JsonToken.ObjectStart()); foreach (ObjectProperty property in properties) { string fieldname = navigator.GetStringValue(property.NameNode); tokensFromGetProperties.Add(JsonToken.FieldName(fieldname)); tokensFromGetProperties.AddRange(JsonNavigatorTests.GetTokensFromNode(property.ValueNode, navigator, performCorrectnessCheck)); } tokensFromGetProperties.Add(JsonToken.ObjectEnd()); if (performCorrectnessCheck) { // Get the tokens again through .TryGetObjectProperty List <JsonToken> tokensFromTryGetProperty = new List <JsonToken>(); tokensFromTryGetProperty.Add(JsonToken.ObjectStart()); foreach (ObjectProperty objectProperty in properties) { ObjectProperty propertyFromTryGetProperty; string fieldname = navigator.GetStringValue(objectProperty.NameNode); if (navigator.TryGetObjectProperty(node, fieldname, out propertyFromTryGetProperty)) { tokensFromTryGetProperty.Add(JsonToken.FieldName(fieldname)); tokensFromTryGetProperty.AddRange(JsonNavigatorTests.GetTokensFromNode(propertyFromTryGetProperty.ValueNode, navigator, performCorrectnessCheck)); } else { Assert.Fail($"Failed to get object property with name: {fieldname}"); } } tokensFromTryGetProperty.Add(JsonToken.ObjectEnd()); Assert.AreEqual(properties.Count(), navigator.GetObjectPropertyCount(node)); Assert.IsTrue(tokensFromGetProperties.SequenceEqual(tokensFromTryGetProperty)); } return(tokensFromGetProperties.ToArray()); }
public static TimeSpan MeasureNavigationPerformance(IJsonNavigator jsonNavigator, int numberOfIterations = 1) { GC.Collect(); GC.WaitForPendingFinalizers(); JsonToken[] tokensFromNode; Stopwatch stopwatch = new Stopwatch(); for (int i = 0; i < numberOfIterations; i++) { stopwatch.Start(); tokensFromNode = JsonNavigatorTests.GetTokensFromNode(jsonNavigator.GetRootNode(), jsonNavigator, false); stopwatch.Stop(); if (tokensFromNode.Length == 0) { throw new InvalidOperationException("got back zero tokens"); } } return(stopwatch.Elapsed); }
private static void VerifyNavigator( string input, bool performExtraChecks = true) { CultureInfo defaultCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture; CultureInfo[] cultureInfoList = new CultureInfo[] { defaultCultureInfo, System.Globalization.CultureInfo.GetCultureInfo("fr-FR") }; try { foreach (CultureInfo cultureInfo in cultureInfoList) { System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; IJsonReader jsonReader = JsonReader.Create(Encoding.UTF8.GetBytes(input)); JsonToken[] tokensFromReader = JsonNavigatorTests.GetTokensWithReader(jsonReader); // Text IJsonNavigator textNavigator = JsonNavigator.Create(Encoding.UTF8.GetBytes(input)); // Binary byte[] binaryInput = JsonTestUtils.ConvertTextToBinary(input); IJsonNavigator binaryNavigator = JsonNavigator.Create(binaryInput); // Test binary + user string encoding JsonStringDictionary jsonStringDictionary = new JsonStringDictionary(capacity: 4096); byte[] binaryWithUserStringEncodingInput = JsonTestUtils.ConvertTextToBinary(input, jsonStringDictionary); if (jsonStringDictionary.TryGetStringAtIndex(index: 0, value: out _)) { Assert.IsFalse(binaryWithUserStringEncodingInput.SequenceEqual(binaryInput), "Binary should be different with user string encoding"); } IJsonNavigator binaryNavigatorWithUserStringEncoding = JsonNavigator.Create(binaryInput, jsonStringDictionary); // Test foreach (IJsonNavigator jsonNavigator in new IJsonNavigator[] { textNavigator, binaryNavigator, binaryNavigatorWithUserStringEncoding }) { IJsonNavigatorNode rootNode = jsonNavigator.GetRootNode(); JsonToken[] tokensFromNavigator = JsonNavigatorTests.GetTokensFromNode(rootNode, jsonNavigator, performExtraChecks); Assert.IsTrue(tokensFromNavigator.SequenceEqual(tokensFromReader)); // Test materialize JToken materializedToken = CosmosElement.Dispatch(jsonNavigator, rootNode).Materialize <JToken>(); try { if (materializedToken.ToString() != JToken.Parse(input).ToString()) { throw new MaterilizationFailedToMatchException(); } } catch (Newtonsoft.Json.JsonReaderException) { // If the input is extended type we ignore this check. } } } } finally { System.Threading.Thread.CurrentThread.CurrentCulture = defaultCultureInfo; } }
private static void VerifyNavigator( string input, bool performExtraChecks = true) { CultureInfo defaultCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture; CultureInfo[] cultureInfoList = new CultureInfo[] { defaultCultureInfo, System.Globalization.CultureInfo.GetCultureInfo("fr-FR") }; try { foreach (CultureInfo cultureInfo in cultureInfoList) { System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; IJsonReader jsonReader = JsonReader.Create(Encoding.UTF8.GetBytes(input)); JsonToken[] tokensFromReader = JsonNavigatorTests.GetTokensWithReader(jsonReader); // Text IJsonNavigator textNavigator = JsonNavigator.Create(Encoding.UTF8.GetBytes(input)); // Binary byte[] binaryInput = JsonTestUtils.ConvertTextToBinary(input); IJsonNavigator binaryNavigator = JsonNavigator.Create(binaryInput); // Test foreach (IJsonNavigator jsonNavigator in new IJsonNavigator[] { textNavigator, binaryNavigator }) { IJsonNavigatorNode rootNode = jsonNavigator.GetRootNode(); JsonToken[] tokensFromNavigator = JsonNavigatorTests.GetTokensFromNode(rootNode, jsonNavigator, performExtraChecks); Assert.AreEqual(tokensFromNavigator.Length, tokensFromReader.Length); IEnumerable <(JsonToken, JsonToken)> zippedTokens = tokensFromNavigator.Zip(tokensFromReader, (first, second) => (first, second)); foreach ((JsonToken tokenFromNavigator, JsonToken tokenFromReader) in zippedTokens) { if (!tokenFromNavigator.Equals(tokenFromReader)) { Assert.Fail(); } } // Test materialize JToken materializedToken = CosmosElement.Dispatch(jsonNavigator, rootNode).Materialize <JToken>(); try { if (materializedToken.ToString() != JToken.Parse(input).ToString()) { throw new MaterilizationFailedToMatchException(); } } catch (Newtonsoft.Json.JsonReaderException) { // If the input is extended type we ignore this check. } } } } finally { System.Threading.Thread.CurrentThread.CurrentCulture = defaultCultureInfo; } }