public void EscapeCharacterTest() { /// <summary> /// Set of all escape characters in JSON. /// </summary> Tuple <string, string>[] escapeCharacters = new Tuple <string, string>[] { new Tuple <string, string>(@"\b", "\b"), new Tuple <string, string>(@"\f", "\f"), new Tuple <string, string>(@"\n", "\n"), new Tuple <string, string>(@"\r", "\r"), new Tuple <string, string>(@"\t", "\t"), new Tuple <string, string>(@"\""", "\""), new Tuple <string, string>(@"\\", @"\"), new Tuple <string, string>(@"\/", "/"), }; foreach (Tuple <string, string> escapeCharacter in escapeCharacters) { string input = "\"" + escapeCharacter.Item1 + "\""; JsonTokenInfo[] token = { JsonTokenInfo.String(escapeCharacter.Item2), }; this.PerformRoundTripTest(input, token); } }
internal static JsonTokenInfo[] GetTokensFromNode(IJsonNavigatorNode node, IJsonNavigator navigator, bool performCorrectnessCheck) { switch (navigator.GetNodeType(node)) { case JsonNodeType.Null: return(new JsonTokenInfo[] { JsonTokenInfo.Null() }); case JsonNodeType.False: return(new JsonTokenInfo[] { JsonTokenInfo.Boolean(false) }); case JsonNodeType.True: return(new JsonTokenInfo[] { JsonTokenInfo.Boolean(true) }); case JsonNodeType.Number: return(new JsonTokenInfo[] { JsonTokenInfo.Number(navigator.GetNumberValue(node)) }); case JsonNodeType.String: return(new JsonTokenInfo[] { JsonTokenInfo.String(navigator.GetStringValue(node)) }); case JsonNodeType.Array: return(JsonNavigatorTests.GetTokensFromArrayNode(node, navigator, performCorrectnessCheck)); case JsonNodeType.Object: return(JsonNavigatorTests.GetTokensFromObjectNode(node, navigator, performCorrectnessCheck)); case JsonNodeType.FieldName: return(new JsonTokenInfo[] { JsonTokenInfo.FieldName(navigator.GetStringValue(node)) }); default: throw new InvalidOperationException(); } }
public void WhitespaceCharacterTest() { /// <summary> /// http://www.ietf.org/rfc/rfc4627.txt for JSON whitespace definition (Section 2). /// </summary> char[] whitespaceCharacters = new char[] { ' ', '\t', '\r', '\n' }; string input = "[" + " " + "\"hello\"" + "," + "\t" + "\"my\"" + "\r" + "," + "\"name\"" + "\n" + "," + "\"is\"" + "]"; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.String("hello"), JsonTokenInfo.String("my"), JsonTokenInfo.String("name"), JsonTokenInfo.String("is"), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
internal static JsonTokenInfo[] GetTokensWithReader(IJsonReader jsonReader) { List <JsonTokenInfo> tokens = new List <JsonTokenInfo>(); while (jsonReader.Read()) { switch (jsonReader.CurrentTokenType) { case JsonTokenType.NotStarted: throw new InvalidOperationException(); case JsonTokenType.BeginArray: tokens.Add(JsonTokenInfo.ArrayStart()); break; case JsonTokenType.EndArray: tokens.Add(JsonTokenInfo.ArrayEnd()); break; case JsonTokenType.BeginObject: tokens.Add(JsonTokenInfo.ObjectStart()); break; case JsonTokenType.EndObject: tokens.Add(JsonTokenInfo.ObjectEnd()); break; case JsonTokenType.String: tokens.Add(JsonTokenInfo.String(jsonReader.GetStringValue())); break; case JsonTokenType.Number: tokens.Add(JsonTokenInfo.Number(jsonReader.GetNumberValue())); break; case JsonTokenType.True: tokens.Add(JsonTokenInfo.Boolean(true)); break; case JsonTokenType.False: tokens.Add(JsonTokenInfo.Boolean(false)); break; case JsonTokenType.Null: tokens.Add(JsonTokenInfo.Null()); break; case JsonTokenType.FieldName: tokens.Add(JsonTokenInfo.FieldName(jsonReader.GetStringValue())); break; default: break; } } return(tokens.ToArray()); }
public static JsonTokenInfo[] Tokenize(IJsonReader jsonReader, string json) { List <JsonTokenInfo> tokensFromReader = new List <JsonTokenInfo>(); while (jsonReader.Read()) { switch (jsonReader.CurrentTokenType) { case JsonTokenType.NotStarted: throw new ArgumentException(string.Format("Got an unexpected JsonTokenType: {0} as an expected token type", jsonReader.CurrentTokenType)); case JsonTokenType.BeginArray: tokensFromReader.Add(JsonTokenInfo.ArrayStart()); break; case JsonTokenType.EndArray: tokensFromReader.Add(JsonTokenInfo.ArrayEnd()); break; case JsonTokenType.BeginObject: tokensFromReader.Add(JsonTokenInfo.ObjectStart()); break; case JsonTokenType.EndObject: tokensFromReader.Add(JsonTokenInfo.ObjectEnd()); break; case JsonTokenType.String: tokensFromReader.Add(JsonTokenInfo.String(jsonReader.GetStringValue())); break; case JsonTokenType.Number: tokensFromReader.Add(JsonTokenInfo.Number(jsonReader.GetNumberValue())); break; case JsonTokenType.True: tokensFromReader.Add(JsonTokenInfo.Boolean(true)); break; case JsonTokenType.False: tokensFromReader.Add(JsonTokenInfo.Boolean(false)); break; case JsonTokenType.Null: tokensFromReader.Add(JsonTokenInfo.Null()); break; case JsonTokenType.FieldName: tokensFromReader.Add(JsonTokenInfo.FieldName(jsonReader.GetStringValue())); break; default: break; } } return(tokensFromReader.ToArray()); }
public void TrueTest() { string input = "true"; JsonTokenInfo[] token = { JsonTokenInfo.Boolean(true) }; this.PerformRoundTripTest(input, token); }
public void FalseTest() { string input = "false"; JsonTokenInfo[] token = { JsonTokenInfo.Boolean(false) }; this.PerformRoundTripTest(input, token); }
public void StringTest() { string input = "\"Hello World\""; JsonTokenInfo[] token = { JsonTokenInfo.String("Hello World") }; this.PerformRoundTripTest(input, token); }
public void EmptyStringTest() { string input = "\"\""; JsonTokenInfo[] token = { JsonTokenInfo.String(string.Empty) }; this.PerformRoundTripTest(input, token); }
public void ScientificWithNegativeExponent() { string input2 = "6.02252E-23"; JsonTokenInfo[] token = { JsonTokenInfo.Number(6.02252e-23) }; this.PerformRoundTripTest(input2, token); }
public void NumberWithScientificNotationTest() { string input2 = "6.02252E+23"; JsonTokenInfo[] token = { JsonTokenInfo.Number(6.02252e23) }; this.PerformRoundTripTest(input2, token); }
public void NegativeNumberTest() { string input = "-1337.7"; JsonTokenInfo[] token = { JsonTokenInfo.Number(-1337.7) }; this.PerformRoundTripTest(input, token); }
public void NullTest() { string input = "null"; JsonTokenInfo[] token = { JsonTokenInfo.Null() }; this.PerformRoundTripTest(input, token); }
public void DoubleTest() { string input = "1337.7"; JsonTokenInfo[] token = { JsonTokenInfo.Number(1337.7) }; this.PerformRoundTripTest(input, token); }
public void EmptyArrayTest() { string input = "[ ] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
public void EmptyObjectTest() { string input = "{}"; JsonTokenInfo[] token = { JsonTokenInfo.ObjectStart(), JsonTokenInfo.ObjectEnd(), }; this.PerformRoundTripTest(input, token); }
public void UnicodeTest() { // the user might literally paste a unicode character into the json. string unicodeString = "\"€\""; // This is the 2 byte equivalent. string expectedString = "€"; JsonTokenInfo[] token = { JsonTokenInfo.String(expectedString), }; this.PerformRoundTripTest(unicodeString, token); }
public void EmojiUTF32Test() { // the user might literally paste a utf 32 character (like the poop emoji). string unicodeString = "\"💩\""; // This is the 4 byte equivalent. string expectedString = "💩"; JsonTokenInfo[] token = { JsonTokenInfo.String(expectedString), }; this.PerformRoundTripTest(unicodeString, token); }
public void BooleanArrayTest() { string input = "[ true, false] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.Boolean(true), JsonTokenInfo.Boolean(false), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
public void NumberArrayTest() { string input = "[15, 22, 0.1] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.Number(15), JsonTokenInfo.Number(22), JsonTokenInfo.Number(0.1), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
public void NullArrayTest() { string input = "[ null, null, null] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.Null(), JsonTokenInfo.Null(), JsonTokenInfo.Null(), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
public void ObjectArrayTest() { string input = "[{}, {}] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.ObjectStart(), JsonTokenInfo.ObjectEnd(), JsonTokenInfo.ObjectStart(), JsonTokenInfo.ObjectEnd(), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
public void SimpleObjectTest() { string input = "{\"GlossDiv\":10,\"title\": \"example glossary\" }"; JsonTokenInfo[] token = { JsonTokenInfo.ObjectStart(), JsonTokenInfo.FieldName("GlossDiv"), JsonTokenInfo.Number(10), JsonTokenInfo.FieldName("title"), JsonTokenInfo.String("example glossary"), JsonTokenInfo.ObjectEnd(), }; this.PerformRoundTripTest(input, token); }
internal static JsonTokenInfo[] GetTokensFromArrayNode(IJsonNavigatorNode node, IJsonNavigator navigator, bool performCorrectnessCheck) { // Get tokens once through IEnumerable List <JsonTokenInfo> tokensFromIEnumerable = new List <JsonTokenInfo>(); IEnumerable <IJsonNavigatorNode> arrayItems = navigator.GetArrayItems(node); tokensFromIEnumerable.Add(JsonTokenInfo.ArrayStart()); foreach (IJsonNavigatorNode arrayItem in arrayItems) { tokensFromIEnumerable.AddRange(JsonNavigatorTests.GetTokensFromNode(arrayItem, navigator, performCorrectnessCheck)); } tokensFromIEnumerable.Add(JsonTokenInfo.ArrayEnd()); if (performCorrectnessCheck) { // Get tokens once again through indexer List <JsonTokenInfo> tokensFromIndexer = new List <JsonTokenInfo>(); tokensFromIndexer.Add(JsonTokenInfo.ArrayStart()); for (int i = 0; i < navigator.GetArrayItemCount(node); ++i) { tokensFromIndexer.AddRange(JsonNavigatorTests.GetTokensFromNode(navigator.GetArrayItemAt(node, i), navigator, performCorrectnessCheck)); } tokensFromIndexer.Add(JsonTokenInfo.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()); }
public void IntArrayTest() { string input = "[ -2, -1, 0, 1, 2] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.Number(-2), JsonTokenInfo.Number(-1), JsonTokenInfo.Number(0), JsonTokenInfo.Number(1), JsonTokenInfo.Number(2), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
internal static JsonTokenInfo[] GetTokensFromObjectNode(IJsonNavigatorNode node, IJsonNavigator navigator, bool performCorrectnessCheck) { // Get the tokens through .GetObjectProperties List <JsonTokenInfo> tokensFromGetProperties = new List <JsonTokenInfo>(); IEnumerable <ObjectProperty> properties = navigator.GetObjectProperties(node); tokensFromGetProperties.Add(JsonTokenInfo.ObjectStart()); foreach (ObjectProperty property in properties) { string fieldname = navigator.GetStringValue(property.NameNode); tokensFromGetProperties.Add(JsonTokenInfo.FieldName(fieldname)); tokensFromGetProperties.AddRange(JsonNavigatorTests.GetTokensFromNode(property.ValueNode, navigator, performCorrectnessCheck)); } tokensFromGetProperties.Add(JsonTokenInfo.ObjectEnd()); if (performCorrectnessCheck) { // Get the tokens again through .TryGetObjectProperty List <JsonTokenInfo> tokensFromTryGetProperty = new List <JsonTokenInfo>(); tokensFromTryGetProperty.Add(JsonTokenInfo.ObjectStart()); foreach (ObjectProperty objectProperty in properties) { ObjectProperty propertyFromTryGetProperty; string fieldname = navigator.GetStringValue(objectProperty.NameNode); if (navigator.TryGetObjectProperty(node, fieldname, out propertyFromTryGetProperty)) { tokensFromTryGetProperty.Add(JsonTokenInfo.FieldName(fieldname)); tokensFromTryGetProperty.AddRange(JsonNavigatorTests.GetTokensFromNode(propertyFromTryGetProperty.ValueNode, navigator, performCorrectnessCheck)); } else { Assert.Fail($"Failed to get object property with name: {fieldname}"); } } tokensFromTryGetProperty.Add(JsonTokenInfo.ObjectEnd()); Assert.AreEqual(properties.Count(), navigator.GetObjectPropertyCount(node)); Assert.IsTrue(tokensFromGetProperties.SequenceEqual(tokensFromTryGetProperty)); } return(tokensFromGetProperties.ToArray()); }
public void AllPrimitiveArrayTest() { string input = "[0, 0.1, -1, -1.1, 1, 2, \"hello\", null, true, false] "; JsonTokenInfo[] token = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.Number(0), JsonTokenInfo.Number(0.1), JsonTokenInfo.Number(-1), JsonTokenInfo.Number(-1.1), JsonTokenInfo.Number(1), JsonTokenInfo.Number(2), JsonTokenInfo.String("hello"), JsonTokenInfo.Null(), JsonTokenInfo.Boolean(true), JsonTokenInfo.Boolean(false), JsonTokenInfo.ArrayEnd(), }; this.PerformRoundTripTest(input, token); }
public bool Equals(JsonTokenInfo other) { if (object.ReferenceEquals(this, other)) { return(true); } // If the token types don't match then we know they aren't equal if (this.JsonTokenType != other.JsonTokenType) { return(false); } // If the token is a string, fieldname or number then we have to check the values switch (this.JsonTokenType) { case JsonTokenType.NotStarted: case JsonTokenType.BeginArray: case JsonTokenType.EndArray: case JsonTokenType.BeginObject: case JsonTokenType.EndObject: case JsonTokenType.True: case JsonTokenType.False: case JsonTokenType.Null: return(true); case JsonTokenType.String: case JsonTokenType.FieldName: return(this.BufferedToken.SequenceEqual(other.BufferedToken)); case JsonTokenType.Number: return(this.Value == other.Value); default: throw new ArgumentException("Invalid token type"); } }
public void ArrayLengthLimitsTest() { // empty array string emptyArrayInput = "[]"; JsonTokenInfo[] emptyArrayTokens = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.ArrayEnd() }; this.PerformRoundTripTest(emptyArrayInput, emptyArrayTokens); // single item array string singleItemArrayInput = @"[""a""]"; JsonTokenInfo[] singleItemArrayTokens = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.String("a"), JsonTokenInfo.ArrayEnd() }; this.PerformRoundTripTest(singleItemArrayInput, singleItemArrayTokens); // max 1 byte length array string maxByteLengthPayload = new string('a', byte.MaxValue - 1 - 1); string maxByteLengthInput = @"[""" + maxByteLengthPayload + @"""]"; JsonTokenInfo[] maxByteLengthTokens = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.String(maxByteLengthPayload), JsonTokenInfo.ArrayEnd() }; this.PerformRoundTripTest(maxByteLengthInput, maxByteLengthTokens); // max 2 byte length array string maxUShortLengthPayload = new string('a', ushort.MaxValue - 1 - 2); string maxUShortLengthInput = @"[""" + maxUShortLengthPayload + @"""]"; JsonTokenInfo[] maxUShortLengthTokens = { JsonTokenInfo.ArrayStart(), JsonTokenInfo.String(maxUShortLengthPayload), JsonTokenInfo.ArrayEnd() }; this.PerformRoundTripTest(maxUShortLengthInput, maxUShortLengthTokens); // max 4 byte length array string maxUIntLengthPayload = new string('a', ushort.MaxValue); string maxUIntLengthInput = @"[""" + maxUIntLengthPayload + @"""]"; JsonTokenInfo[] maxUIntLengthTokens = { JsonTokenInfo.ArrayStart(), // 2 of them just to go past int.MaxValue but < uint.MaxValue JsonTokenInfo.String(maxUIntLengthPayload), JsonTokenInfo.ArrayEnd() }; this.PerformRoundTripTest(maxUIntLengthInput, maxUIntLengthTokens); }
public void NumberLimitsTest() { // min byte string minByteInput = "0"; JsonTokenInfo[] minByteTokens = { JsonTokenInfo.Number(byte.MinValue) }; this.PerformRoundTripTest(minByteInput, minByteTokens); // max byte string maxByteInput = "255"; JsonTokenInfo[] maxByteTokens = { JsonTokenInfo.Number(byte.MaxValue) }; this.PerformRoundTripTest(maxByteInput, maxByteTokens); // min short string minShortInput = "-32768"; JsonTokenInfo[] minShortTokens = { JsonTokenInfo.Number(short.MinValue) }; this.PerformRoundTripTest(minShortInput, minShortTokens); // max short string maxShortInput = "32767"; JsonTokenInfo[] maxShortTokens = { JsonTokenInfo.Number(short.MaxValue) }; this.PerformRoundTripTest(maxShortInput, maxShortTokens); // min int string minIntInput = "-2147483648"; JsonTokenInfo[] minIntTokens = { JsonTokenInfo.Number(int.MinValue) }; this.PerformRoundTripTest(minIntInput, minIntTokens); // max int string maxIntInput = "2147483647"; JsonTokenInfo[] maxIntTokens = { JsonTokenInfo.Number(int.MaxValue) }; this.PerformRoundTripTest(maxIntInput, maxIntTokens); // min long string minLongInput = "-9223372036854775808"; JsonTokenInfo[] minLongTokens = { JsonTokenInfo.Number(long.MinValue) }; this.PerformRoundTripTest(minLongInput, minLongTokens); // max long string maxLongInput = "9223372036854775807"; JsonTokenInfo[] maxLongTokens = { JsonTokenInfo.Number(long.MaxValue) }; this.PerformRoundTripTest(maxLongInput, maxLongTokens); // min double string minDoubleInput = "-1.7976931348623157E+308"; JsonTokenInfo[] minDoubleTokens = { JsonTokenInfo.Number(double.MinValue) }; this.PerformRoundTripTest(minDoubleInput, minDoubleTokens); // max double string maxDoubleInput = "1.7976931348623157E+308"; JsonTokenInfo[] maxDoubleTokens = { JsonTokenInfo.Number(double.MaxValue) }; this.PerformRoundTripTest(maxDoubleInput, maxDoubleTokens); }