#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 leftPaths = (List)booleanExpression.Left; List rightPaths = (List)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(() => { new JPath("$ .Blah"); }, @"Unexpected character while parsing path: "); } [Test] public void NoFieldNameAfterDot() { ExceptionAssert.Throws(() => { new JPath("$.Blah."); }, @"Unexpected end while parsing path."); } [Test] public void RootWithBadWhitespace2() { ExceptionAssert.Throws(() => { 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 paths = (List)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 paths = (List)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 SinglePropertyAndFilterWithRegexAndOptions() { JPath path = new JPath("Blah[ ?( @.name=~/hi/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.RegexEquals, expressions.Operator); Assert.AreEqual("/hi/i", (string)(JToken)expressions.Right); } [Test] public void SinglePropertyAndFilterWithRegex() { JPath path = new JPath("Blah[?(@.title =~ /^.*Sword.*$/)]"); 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.RegexEquals, expressions.Operator); Assert.AreEqual("/^.*Sword.*$/", (string)(JToken)expressions.Right); } [Test] public void SinglePropertyAndFilterWithEscapedRegex() { JPath path = new JPath(@"Blah[?(@.title =~ /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g)]"); 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.RegexEquals, expressions.Operator); Assert.AreEqual(@"/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g", (string)(JToken)expressions.Right); } [Test] public void SinglePropertyAndFilterWithOpenRegex() { ExceptionAssert.Throws(() => { new JPath(@"Blah[?(@.title =~ /[\"); }, "Path ended with an open regex."); } [Test] public void SinglePropertyAndFilterWithUnknownEscape() { ExceptionAssert.Throws(() => { 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 paths = (List)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("[?(@.namenull)]"); 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)first.Left; Assert.AreEqual("name", ((FieldFilter)firstPaths[0]).Name); Assert.AreEqual(QueryOperator.Exists, first.Operator); var second = (BooleanQueryExpression)expressions.Expressions[1]; var secondPaths = (List)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)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)orFirst.Left; Assert.AreEqual("title", ((FieldFilter)orFirstPaths[0]).Name); Assert.AreEqual(QueryOperator.Exists, orFirst.Operator); var orSecond = (BooleanQueryExpression)orExpression.Expressions[1]; var orSecondPaths = (List)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 paths = (List)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(() => new JPath("[?(@.name||)]"), "Unexpected character while parsing path query: )"); } [Test] public void BaddOr2() { ExceptionAssert.Throws(() => new JPath("[?(@.name|)]"), "Unexpected character while parsing path query: |"); } [Test] public void BaddOr3() { ExceptionAssert.Throws(() => new JPath("[?(@.name|"), "Unexpected character while parsing path query: |"); } [Test] public void BaddOr4() { ExceptionAssert.Throws(() => new JPath("[?(@.name||"), "Path ended with open query."); } [Test] public void NoAtAfterOr() { ExceptionAssert.Throws(() => new JPath("[?(@.name||s"), "Unexpected character while parsing path query: s"); } [Test] public void NoPathAfterAt() { ExceptionAssert.Throws(() => new JPath("[?(@.name||@"), @"Path ended with open query."); } [Test] public void NoPathAfterDot() { ExceptionAssert.Throws(() => new JPath("[?(@.name||@."), @"Unexpected end while parsing path."); } [Test] public void NoPathAfterDot2() { ExceptionAssert.Throws(() => 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(() => { new JPath("Blah[[0]].Two.Three[1].Four"); }, @"Unexpected character while parsing path indexer: ["); } [Test] public void UnclosedIndexer() { ExceptionAssert.Throws(() => { 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(() => { new JPath("[]"); }, "Array index expected."); } [Test] public void IndexerCloseInProperty() { ExceptionAssert.Throws(() => { 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(() => { 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); } } }