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 void AddAndValidate(JsonStringDictionary jsonStringDictionary, string expectedString, int expectedIndex) { // Try to add the string. if (!jsonStringDictionary.TryAddString(expectedString, out int actualIndex)) { throw new AssertFailedException($"{nameof(JsonStringDictionary.TryAddString)}({expectedString}, out int {actualIndex}) failed."); } Assert.AreEqual(expectedIndex, actualIndex); // Try to read the string back by index if (!jsonStringDictionary.TryGetStringAtIndex(expectedIndex, out UtfAllString actualString)) { throw new AssertFailedException($"{nameof(JsonStringDictionary.TryGetStringAtIndex)}({expectedIndex}, out string {actualString}) failed."); } Assert.AreEqual(expectedString, actualString.Utf16String); }
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 PerformRoundTrip( SerializationFormat sourceFormat, SerializationFormat destinationFormat, string json) { JsonStringDictionary sourceDictionary = null; IJsonReader reader; switch (sourceFormat) { case SerializationFormat.Text: reader = JsonReader.Create(Encoding.UTF8.GetBytes(json)); break; case SerializationFormat.Binary: reader = JsonReader.Create(JsonTestUtils.ConvertTextToBinary(json)); break; case SerializationFormat.NewtonsoftText: reader = NewtonsoftToCosmosDBReader.CreateFromString(json); break; case SerializationFormat.BinaryWithDictionaryEncoding: sourceDictionary = new JsonStringDictionary(capacity: 128); reader = JsonReader.Create(JsonTestUtils.ConvertTextToBinary(json, sourceDictionary), sourceDictionary); break; default: throw new ArgumentException($"Unexpected {nameof(sourceFormat)} of type: {sourceFormat}"); } IJsonNavigator navigator; switch (sourceFormat) { case SerializationFormat.Text: navigator = JsonNavigator.Create(Encoding.UTF8.GetBytes(json)); break; case SerializationFormat.Binary: navigator = JsonNavigator.Create(JsonTestUtils.ConvertTextToBinary(json)); break; case SerializationFormat.NewtonsoftText: navigator = new JsonNewtonsoftNavigator(json); break; case SerializationFormat.BinaryWithDictionaryEncoding: sourceDictionary = new JsonStringDictionary(capacity: 128); navigator = JsonNavigator.Create(JsonTestUtils.ConvertTextToBinary(json, sourceDictionary), sourceDictionary); break; default: throw new ArgumentException($"Unexpected {nameof(sourceFormat)} of type: {sourceFormat}"); } object[] sources = new object[] { reader, navigator }; foreach (object source in sources) { IJsonWriter writer; JsonStringDictionary jsonStringDictionary; switch (destinationFormat) { case SerializationFormat.Text: writer = JsonWriter.Create(JsonSerializationFormat.Text); jsonStringDictionary = null; break; case SerializationFormat.Binary: writer = JsonWriter.Create(JsonSerializationFormat.Binary); jsonStringDictionary = null; break; case SerializationFormat.NewtonsoftText: writer = NewtonsoftToCosmosDBWriter.CreateTextWriter(); jsonStringDictionary = null; break; case SerializationFormat.BinaryWithDictionaryEncoding: jsonStringDictionary = new JsonStringDictionary(capacity: 128); if (sourceFormat == SerializationFormat.BinaryWithDictionaryEncoding) { int index = 0; while (sourceDictionary.TryGetStringAtIndex(index++, out UtfAllString value)) { Assert.IsTrue(jsonStringDictionary.TryAddString(value.Utf16String, out _)); } } writer = JsonWriter.Create(JsonSerializationFormat.Binary, jsonStringDictionary); break; default: throw new ArgumentException($"Unexpected {nameof(destinationFormat)} of type: {destinationFormat}"); } switch (source) { case IJsonReader sourceReader: sourceReader.WriteAll(writer); break; case IJsonNavigator sourceNavigator: sourceNavigator.WriteNode(sourceNavigator.GetRootNode(), writer); break; default: Assert.Fail("Failed to downcast source type."); break; } string result; switch (writer.SerializationFormat) { case JsonSerializationFormat.Text: result = Utf8String.UnsafeFromUtf8BytesNoValidation(writer.GetResult()).ToString(); break; case JsonSerializationFormat.Binary: result = JsonTestUtils.ConvertBinaryToText(writer.GetResult(), jsonStringDictionary); break; default: throw new ArgumentException(); } string normalizedResult = JsonRoundTripsTests.NewtonsoftFormat(result); string normalizedJson = JsonRoundTripsTests.NewtonsoftFormat(json); Assert.AreEqual(normalizedJson, normalizedResult); } }