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());
        }
Esempio n. 5
0
        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);
        }
Esempio n. 28
0
        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);
        }