Files
Newtonsoft.Json/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathParseTests.cs
T

733 lines
29 KiB
C#

#region License
// Copyright (c) 2007 James Newton-King
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
#endregion
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq.JsonPath;
#if DNXCORE50
using Xunit;
using Test = Xunit.FactAttribute;
using Assert = Newtonsoft.Json.Tests.XUnitAssert;
#else
using NUnit.Framework;
#endif
using Newtonsoft.Json.Linq;
#if NET20
using Newtonsoft.Json.Utilities.LinqBridge;
#else
using System.Linq;
#endif
namespace Newtonsoft.Json.Tests.Linq.JsonPath
{
[TestFixture]
public class JPathParseTests : TestFixtureBase
{
[Test]
public void BooleanQuery_TwoValues()
{
JPath path = new JPath("[?(1 > 2)]");
Assert.AreEqual(1, path.Filters.Count);
BooleanQueryExpression booleanExpression = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(1, (int)(JValue)booleanExpression.Left);
Assert.AreEqual(2, (int)(JValue)booleanExpression.Right);
Assert.AreEqual(QueryOperator.GreaterThan, booleanExpression.Operator);
}
[Test]
public void BooleanQuery_TwoPaths()
{
JPath path = new JPath("[?(@.price > @.max_price)]");
Assert.AreEqual(1, path.Filters.Count);
BooleanQueryExpression booleanExpression = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
List<PathFilter> leftPaths = (List<PathFilter>)booleanExpression.Left;
List<PathFilter> rightPaths = (List<PathFilter>)booleanExpression.Right;
Assert.AreEqual("price", ((FieldFilter)leftPaths[0]).Name);
Assert.AreEqual("max_price", ((FieldFilter)rightPaths[0]).Name);
Assert.AreEqual(QueryOperator.GreaterThan, booleanExpression.Operator);
}
[Test]
public void SingleProperty()
{
JPath path = new JPath("Blah");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SingleQuotedProperty()
{
JPath path = new JPath("['Blah']");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SingleQuotedPropertyWithWhitespace()
{
JPath path = new JPath("[ 'Blah' ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SingleQuotedPropertyWithDots()
{
JPath path = new JPath("['Blah.Ha']");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah.Ha", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SingleQuotedPropertyWithBrackets()
{
JPath path = new JPath("['[*]']");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("[*]", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SinglePropertyWithRoot()
{
JPath path = new JPath("$.Blah");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SinglePropertyWithRootWithStartAndEndWhitespace()
{
JPath path = new JPath(" $.Blah ");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void RootWithBadWhitespace()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("$ .Blah"); }, @"Unexpected character while parsing path: ");
}
[Test]
public void NoFieldNameAfterDot()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("$.Blah."); }, @"Unexpected end while parsing path.");
}
[Test]
public void RootWithBadWhitespace2()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("$. Blah"); }, @"Unexpected character while parsing path: ");
}
[Test]
public void WildcardPropertyWithRoot()
{
JPath path = new JPath("$.*");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(null, ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void WildcardArrayWithRoot()
{
JPath path = new JPath("$.[*]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(null, ((ArrayIndexFilter)path.Filters[0]).Index);
}
[Test]
public void RootArrayNoDot()
{
JPath path = new JPath("$[1]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(1, ((ArrayIndexFilter)path.Filters[0]).Index);
}
[Test]
public void WildcardArray()
{
JPath path = new JPath("[*]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(null, ((ArrayIndexFilter)path.Filters[0]).Index);
}
[Test]
public void WildcardArrayWithProperty()
{
JPath path = new JPath("[ * ].derp");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual(null, ((ArrayIndexFilter)path.Filters[0]).Index);
Assert.AreEqual("derp", ((FieldFilter)path.Filters[1]).Name);
}
[Test]
public void QuotedWildcardPropertyWithRoot()
{
JPath path = new JPath("$.['*']");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("*", ((FieldFilter)path.Filters[0]).Name);
}
[Test]
public void SingleScanWithRoot()
{
JPath path = new JPath("$..Blah");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual("Blah", ((ScanFilter)path.Filters[0]).Name);
}
[Test]
public void QueryTrue()
{
JPath path = new JPath("$.elements[?(true)]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("elements", ((FieldFilter)path.Filters[0]).Name);
Assert.AreEqual(QueryOperator.Exists, ((QueryFilter)path.Filters[1]).Expression.Operator);
}
[Test]
public void ScanQuery()
{
JPath path = new JPath("$.elements..[?(@.id=='AAA')]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("elements", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expression = (BooleanQueryExpression)((QueryScanFilter) path.Filters[1]).Expression;
List<PathFilter> paths = (List<PathFilter>)expression.Left;
Assert.IsInstanceOf(typeof(FieldFilter), paths[0]);
}
[Test]
public void WildcardScanWithRoot()
{
JPath path = new JPath("$..*");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(null, ((ScanFilter)path.Filters[0]).Name);
}
[Test]
public void WildcardScanWithRootWithWhitespace()
{
JPath path = new JPath("$..* ");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(null, ((ScanFilter)path.Filters[0]).Name);
}
[Test]
public void TwoProperties()
{
JPath path = new JPath("Blah.Two");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
Assert.AreEqual("Two", ((FieldFilter)path.Filters[1]).Name);
}
[Test]
public void OnePropertyOneScan()
{
JPath path = new JPath("Blah..Two");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
Assert.AreEqual("Two", ((ScanFilter)path.Filters[1]).Name);
}
[Test]
public void SinglePropertyAndIndexer()
{
JPath path = new JPath("Blah[0]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
Assert.AreEqual(0, ((ArrayIndexFilter)path.Filters[1]).Index);
}
[Test]
public void SinglePropertyAndExistsQuery()
{
JPath path = new JPath("Blah[ ?( @..name ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Exists, expressions.Operator);
List<PathFilter> paths = (List<PathFilter>)expressions.Left;
Assert.AreEqual(1, paths.Count);
Assert.AreEqual("name", ((ScanFilter)paths[0]).Name);
}
[Test]
public void SinglePropertyAndFilterWithWhitespace()
{
JPath path = new JPath("Blah[ ?( @.name=='hi' ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Equals, expressions.Operator);
Assert.AreEqual("hi", (string)(JToken)expressions.Right);
}
[Test]
public void SinglePropertyAndFilterWithEscapeQuote()
{
JPath path = new JPath(@"Blah[ ?( @.name=='h\'i' ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Equals, expressions.Operator);
Assert.AreEqual("h'i", (string)(JToken)expressions.Right);
}
[Test]
public void SinglePropertyAndFilterWithDoubleEscape()
{
JPath path = new JPath(@"Blah[ ?( @.name=='h\\i' ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Equals, expressions.Operator);
Assert.AreEqual("h\\i", (string)(JToken)expressions.Right);
}
[Test]
public void SinglePropertyAndFilterWithUnknownEscape()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath(@"Blah[ ?( @.name=='h\i' ) ]"); }, @"Unknown escape character: \i");
}
[Test]
public void SinglePropertyAndFilterWithFalse()
{
JPath path = new JPath("Blah[ ?( @.name==false ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Equals, expressions.Operator);
Assert.AreEqual(false, (bool)(JToken)expressions.Right);
}
[Test]
public void SinglePropertyAndFilterWithTrue()
{
JPath path = new JPath("Blah[ ?( @.name==true ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Equals, expressions.Operator);
Assert.AreEqual(true, (bool)(JToken)expressions.Right);
}
[Test]
public void SinglePropertyAndFilterWithNull()
{
JPath path = new JPath("Blah[ ?( @.name==null ) ]");
Assert.AreEqual(2, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[1]).Expression;
Assert.AreEqual(QueryOperator.Equals, expressions.Operator);
Assert.AreEqual(null, ((JValue)expressions.Right).Value);
}
[Test]
public void FilterWithScan()
{
JPath path = new JPath("[?(@..name<>null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
List<PathFilter> paths = (List<PathFilter>)expressions.Left;
Assert.AreEqual("name", ((ScanFilter)paths[0]).Name);
}
[Test]
public void FilterWithNotEquals()
{
JPath path = new JPath("[?(@.name<>null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.NotEquals, expressions.Operator);
}
[Test]
public void FilterWithNotEquals2()
{
JPath path = new JPath("[?(@.name!=null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.NotEquals, expressions.Operator);
}
[Test]
public void FilterWithLessThan()
{
JPath path = new JPath("[?(@.name<null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.LessThan, expressions.Operator);
}
[Test]
public void FilterWithLessThanOrEquals()
{
JPath path = new JPath("[?(@.name<=null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.LessThanOrEquals, expressions.Operator);
}
[Test]
public void FilterWithGreaterThan()
{
JPath path = new JPath("[?(@.name>null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.GreaterThan, expressions.Operator);
}
[Test]
public void FilterWithGreaterThanOrEquals()
{
JPath path = new JPath("[?(@.name>=null)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.GreaterThanOrEquals, expressions.Operator);
}
[Test]
public void FilterWithInteger()
{
JPath path = new JPath("[?(@.name>=12)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(12, (int)(JToken)expressions.Right);
}
[Test]
public void FilterWithNegativeInteger()
{
JPath path = new JPath("[?(@.name>=-12)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(-12, (int)(JToken)expressions.Right);
}
[Test]
public void FilterWithFloat()
{
JPath path = new JPath("[?(@.name>=12.1)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(12.1d, (double)(JToken)expressions.Right);
}
[Test]
public void FilterExistWithAnd()
{
JPath path = new JPath("[?(@.name&&@.title)]");
CompositeExpression expressions = (CompositeExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.And, expressions.Operator);
Assert.AreEqual(2, expressions.Expressions.Count);
var first = (BooleanQueryExpression)expressions.Expressions[0];
var firstPaths = (List<PathFilter>)first.Left;
Assert.AreEqual("name", ((FieldFilter)firstPaths[0]).Name);
Assert.AreEqual(QueryOperator.Exists, first.Operator);
var second = (BooleanQueryExpression)expressions.Expressions[1];
var secondPaths = (List<PathFilter>)second.Left;
Assert.AreEqual("title", ((FieldFilter)secondPaths[0]).Name);
Assert.AreEqual(QueryOperator.Exists, second.Operator);
}
[Test]
public void FilterExistWithAndOr()
{
JPath path = new JPath("[?(@.name&&@.title||@.pie)]");
CompositeExpression andExpression = (CompositeExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(QueryOperator.And, andExpression.Operator);
Assert.AreEqual(2, andExpression.Expressions.Count);
var first = (BooleanQueryExpression)andExpression.Expressions[0];
var firstPaths = (List<PathFilter>)first.Left;
Assert.AreEqual("name", ((FieldFilter)firstPaths[0]).Name);
Assert.AreEqual(QueryOperator.Exists, first.Operator);
CompositeExpression orExpression = (CompositeExpression)andExpression.Expressions[1];
Assert.AreEqual(2, orExpression.Expressions.Count);
var orFirst = (BooleanQueryExpression)orExpression.Expressions[0];
var orFirstPaths = (List<PathFilter>)orFirst.Left;
Assert.AreEqual("title", ((FieldFilter)orFirstPaths[0]).Name);
Assert.AreEqual(QueryOperator.Exists, orFirst.Operator);
var orSecond = (BooleanQueryExpression)orExpression.Expressions[1];
var orSecondPaths = (List<PathFilter>)orSecond.Left;
Assert.AreEqual("pie", ((FieldFilter)orSecondPaths[0]).Name);
Assert.AreEqual(QueryOperator.Exists, orSecond.Operator);
}
[Test]
public void FilterWithRoot()
{
JPath path = new JPath("[?($.name>=12.1)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
List<PathFilter> paths = (List<PathFilter>)expressions.Left;
Assert.AreEqual(2, paths.Count);
Assert.IsInstanceOf(typeof(RootFilter), paths[0]);
Assert.IsInstanceOf(typeof(FieldFilter), paths[1]);
}
[Test]
public void BadOr1()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name||)]"), "Unexpected character while parsing path query: )");
}
[Test]
public void BaddOr2()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name|)]"), "Unexpected character while parsing path query: |");
}
[Test]
public void BaddOr3()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name|"), "Unexpected character while parsing path query: |");
}
[Test]
public void BaddOr4()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name||"), "Path ended with open query.");
}
[Test]
public void NoAtAfterOr()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name||s"), "Unexpected character while parsing path query: s");
}
[Test]
public void NoPathAfterAt()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name||@"), @"Path ended with open query.");
}
[Test]
public void NoPathAfterDot()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name||@."), @"Unexpected end while parsing path.");
}
[Test]
public void NoPathAfterDot2()
{
ExceptionAssert.Throws<JsonException>(() => new JPath("[?(@.name||@.)]"), @"Unexpected end while parsing path.");
}
[Test]
public void FilterWithFloatExp()
{
JPath path = new JPath("[?(@.name>=5.56789e+0)]");
BooleanQueryExpression expressions = (BooleanQueryExpression)((QueryFilter)path.Filters[0]).Expression;
Assert.AreEqual(5.56789e+0, (double)(JToken)expressions.Right);
}
[Test]
public void MultiplePropertiesAndIndexers()
{
JPath path = new JPath("Blah[0]..Two.Three[1].Four");
Assert.AreEqual(6, path.Filters.Count);
Assert.AreEqual("Blah", ((FieldFilter)path.Filters[0]).Name);
Assert.AreEqual(0, ((ArrayIndexFilter)path.Filters[1]).Index);
Assert.AreEqual("Two", ((ScanFilter)path.Filters[2]).Name);
Assert.AreEqual("Three", ((FieldFilter)path.Filters[3]).Name);
Assert.AreEqual(1, ((ArrayIndexFilter)path.Filters[4]).Index);
Assert.AreEqual("Four", ((FieldFilter)path.Filters[5]).Name);
}
[Test]
public void BadCharactersInIndexer()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("Blah[[0]].Two.Three[1].Four"); }, @"Unexpected character while parsing path indexer: [");
}
[Test]
public void UnclosedIndexer()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("Blah[0"); }, @"Path ended with open indexer.");
}
[Test]
public void IndexerOnly()
{
JPath path = new JPath("[111119990]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(111119990, ((ArrayIndexFilter)path.Filters[0]).Index);
}
[Test]
public void IndexerOnlyWithWhitespace()
{
JPath path = new JPath("[ 10 ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(10, ((ArrayIndexFilter)path.Filters[0]).Index);
}
[Test]
public void MultipleIndexes()
{
JPath path = new JPath("[111119990,3]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(2, ((ArrayMultipleIndexFilter)path.Filters[0]).Indexes.Count);
Assert.AreEqual(111119990, ((ArrayMultipleIndexFilter)path.Filters[0]).Indexes[0]);
Assert.AreEqual(3, ((ArrayMultipleIndexFilter)path.Filters[0]).Indexes[1]);
}
[Test]
public void MultipleIndexesWithWhitespace()
{
JPath path = new JPath("[ 111119990 , 3 ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(2, ((ArrayMultipleIndexFilter)path.Filters[0]).Indexes.Count);
Assert.AreEqual(111119990, ((ArrayMultipleIndexFilter)path.Filters[0]).Indexes[0]);
Assert.AreEqual(3, ((ArrayMultipleIndexFilter)path.Filters[0]).Indexes[1]);
}
[Test]
public void MultipleQuotedIndexes()
{
JPath path = new JPath("['111119990','3']");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(2, ((FieldMultipleFilter)path.Filters[0]).Names.Count);
Assert.AreEqual("111119990", ((FieldMultipleFilter)path.Filters[0]).Names[0]);
Assert.AreEqual("3", ((FieldMultipleFilter)path.Filters[0]).Names[1]);
}
[Test]
public void MultipleQuotedIndexesWithWhitespace()
{
JPath path = new JPath("[ '111119990' , '3' ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(2, ((FieldMultipleFilter)path.Filters[0]).Names.Count);
Assert.AreEqual("111119990", ((FieldMultipleFilter)path.Filters[0]).Names[0]);
Assert.AreEqual("3", ((FieldMultipleFilter)path.Filters[0]).Names[1]);
}
[Test]
public void SlicingIndexAll()
{
JPath path = new JPath("[111119990:3:2]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(111119990, ((ArraySliceFilter)path.Filters[0]).Start);
Assert.AreEqual(3, ((ArraySliceFilter)path.Filters[0]).End);
Assert.AreEqual(2, ((ArraySliceFilter)path.Filters[0]).Step);
}
[Test]
public void SlicingIndex()
{
JPath path = new JPath("[111119990:3]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(111119990, ((ArraySliceFilter)path.Filters[0]).Start);
Assert.AreEqual(3, ((ArraySliceFilter)path.Filters[0]).End);
Assert.AreEqual(null, ((ArraySliceFilter)path.Filters[0]).Step);
}
[Test]
public void SlicingIndexNegative()
{
JPath path = new JPath("[-111119990:-3:-2]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(-111119990, ((ArraySliceFilter)path.Filters[0]).Start);
Assert.AreEqual(-3, ((ArraySliceFilter)path.Filters[0]).End);
Assert.AreEqual(-2, ((ArraySliceFilter)path.Filters[0]).Step);
}
[Test]
public void SlicingIndexEmptyStop()
{
JPath path = new JPath("[ -3 : ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(-3, ((ArraySliceFilter)path.Filters[0]).Start);
Assert.AreEqual(null, ((ArraySliceFilter)path.Filters[0]).End);
Assert.AreEqual(null, ((ArraySliceFilter)path.Filters[0]).Step);
}
[Test]
public void SlicingIndexEmptyStart()
{
JPath path = new JPath("[ : 1 : ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(null, ((ArraySliceFilter)path.Filters[0]).Start);
Assert.AreEqual(1, ((ArraySliceFilter)path.Filters[0]).End);
Assert.AreEqual(null, ((ArraySliceFilter)path.Filters[0]).Step);
}
[Test]
public void SlicingIndexWhitespace()
{
JPath path = new JPath("[ -111119990 : -3 : -2 ]");
Assert.AreEqual(1, path.Filters.Count);
Assert.AreEqual(-111119990, ((ArraySliceFilter)path.Filters[0]).Start);
Assert.AreEqual(-3, ((ArraySliceFilter)path.Filters[0]).End);
Assert.AreEqual(-2, ((ArraySliceFilter)path.Filters[0]).Step);
}
[Test]
public void EmptyIndexer()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("[]"); }, "Array index expected.");
}
[Test]
public void IndexerCloseInProperty()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("]"); }, "Unexpected character while parsing path: ]");
}
[Test]
public void AdjacentIndexers()
{
JPath path = new JPath("[1][0][0][" + int.MaxValue + "]");
Assert.AreEqual(4, path.Filters.Count);
Assert.AreEqual(1, ((ArrayIndexFilter)path.Filters[0]).Index);
Assert.AreEqual(0, ((ArrayIndexFilter)path.Filters[1]).Index);
Assert.AreEqual(0, ((ArrayIndexFilter)path.Filters[2]).Index);
Assert.AreEqual(int.MaxValue, ((ArrayIndexFilter)path.Filters[3]).Index);
}
[Test]
public void MissingDotAfterIndexer()
{
ExceptionAssert.Throws<JsonException>(() => { new JPath("[1]Blah"); }, "Unexpected character following indexer: B");
}
[Test]
public void PropertyFollowingEscapedPropertyName()
{
JPath path = new JPath("frameworks.dnxcore50.dependencies.['System.Xml.ReaderWriter'].source");
Assert.AreEqual(5, path.Filters.Count);
Assert.AreEqual("frameworks", ((FieldFilter)path.Filters[0]).Name);
Assert.AreEqual("dnxcore50", ((FieldFilter)path.Filters[1]).Name);
Assert.AreEqual("dependencies", ((FieldFilter)path.Filters[2]).Name);
Assert.AreEqual("System.Xml.ReaderWriter", ((FieldFilter)path.Filters[3]).Name);
Assert.AreEqual("source", ((FieldFilter)path.Filters[4]).Name);
}
}
}