@@ -14,90 +14,109 @@ public class JsonPointerGeneratorFilteringTest extends com.fasterxml.jackson.cor
1414
1515 public void testSimplePropertyWithPath () throws Exception
1616 {
17- _assert (SIMPLE_INPUT , "/c" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" );
18- _assert (SIMPLE_INPUT , "/c/d" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" );
19- _assert (SIMPLE_INPUT , "/c/d/a" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" );
17+ _assert (SIMPLE_INPUT , "/c" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" , false );
18+ _assert (SIMPLE_INPUT , "/c/d" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" , false );
19+ _assert (SIMPLE_INPUT , "/c/d/a" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" , false );
2020
21- _assert (SIMPLE_INPUT , "/c/d/a" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" );
21+ _assert (SIMPLE_INPUT , "/c/d/a" , Inclusion .INCLUDE_ALL_AND_PATH , "{'c':{'d':{'a':true}}}" , false );
2222
23- _assert (SIMPLE_INPUT , "/a" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':1}" );
24- _assert (SIMPLE_INPUT , "/d" , Inclusion .INCLUDE_ALL_AND_PATH , "{'d':null}" );
23+ _assert (SIMPLE_INPUT , "/a" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':1}" , false );
24+ _assert (SIMPLE_INPUT , "/d" , Inclusion .INCLUDE_ALL_AND_PATH , "{'d':null}" , false );
2525
2626 // and then non-match
27- _assert (SIMPLE_INPUT , "/x" , Inclusion .INCLUDE_ALL_AND_PATH , "" );
27+ _assert (SIMPLE_INPUT , "/x" , Inclusion .INCLUDE_ALL_AND_PATH , "" , false );
2828 }
2929
3030 public void testSimplePropertyWithoutPath () throws Exception
3131 {
32- _assert (SIMPLE_INPUT , "/c" , Inclusion .ONLY_INCLUDE_ALL , "{'d':{'a':true}}" );
33- _assert (SIMPLE_INPUT , "/c/d" , Inclusion .ONLY_INCLUDE_ALL , "{'a':true}" );
34- _assert (SIMPLE_INPUT , "/c/d/a" , Inclusion .ONLY_INCLUDE_ALL , "true" );
32+ _assert (SIMPLE_INPUT , "/c" , Inclusion .ONLY_INCLUDE_ALL , "{'d':{'a':true}}" , false );
33+ _assert (SIMPLE_INPUT , "/c/d" , Inclusion .ONLY_INCLUDE_ALL , "{'a':true}" , false );
34+ _assert (SIMPLE_INPUT , "/c/d/a" , Inclusion .ONLY_INCLUDE_ALL , "true" , false );
3535
36- _assert (SIMPLE_INPUT , "/a" , Inclusion .ONLY_INCLUDE_ALL , "1" );
37- _assert (SIMPLE_INPUT , "/d" , Inclusion .ONLY_INCLUDE_ALL , "null" );
36+ _assert (SIMPLE_INPUT , "/a" , Inclusion .ONLY_INCLUDE_ALL , "1" , false );
37+ _assert (SIMPLE_INPUT , "/d" , Inclusion .ONLY_INCLUDE_ALL , "null" , false );
3838
3939 // and then non-match
40- _assert (SIMPLE_INPUT , "/x" , Inclusion .ONLY_INCLUDE_ALL , "" );
40+ _assert (SIMPLE_INPUT , "/x" , Inclusion .ONLY_INCLUDE_ALL , "" , false );
4141 }
4242
4343 public void testArrayElementWithPath () throws Exception
4444 {
45- _assert (SIMPLE_INPUT , "/b" , Inclusion .INCLUDE_ALL_AND_PATH , "{'b':[1,2,3]}" );
46- _assert (SIMPLE_INPUT , "/b/1" , Inclusion .INCLUDE_ALL_AND_PATH , "{'b':[2]}" );
47- _assert (SIMPLE_INPUT , "/b/2" , Inclusion .INCLUDE_ALL_AND_PATH , "{'b':[3]}" );
45+ _assert (SIMPLE_INPUT , "/b" , Inclusion .INCLUDE_ALL_AND_PATH , "{'b':[1,2,3]}" , false );
46+ _assert (SIMPLE_INPUT , "/b/1" , Inclusion .INCLUDE_ALL_AND_PATH , "{'b':[2]}" , false );
47+ _assert (SIMPLE_INPUT , "/b/2" , Inclusion .INCLUDE_ALL_AND_PATH , "{'b':[3]}" , false );
4848
4949 // and then non-match
50- _assert (SIMPLE_INPUT , "/b/8" , Inclusion .INCLUDE_ALL_AND_PATH , "" );
50+ _assert (SIMPLE_INPUT , "/b/8" , Inclusion .INCLUDE_ALL_AND_PATH , "" , false );
5151 }
5252
5353 public void testArrayNestedWithPath () throws Exception
5454 {
55- _assert ("{'a':[true,{'b':3,'d':2},false]}" , "/a/1/b" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':[{'b':3}]}" );
56- _assert ("[true,[1]]" , "/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[true]" );
57- _assert ("[true,[1]]" , "/1" , Inclusion .INCLUDE_ALL_AND_PATH , "[[1]]" );
58- _assert ("[true,[1,2,[true],3],0]" , "/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[true]" );
59- _assert ("[true,[1,2,[true],3],0]" , "/1" , Inclusion .INCLUDE_ALL_AND_PATH , "[[1,2,[true],3]]" );
60-
61- _assert ("[true,[1,2,[true],3],0]" , "/1/2" , Inclusion .INCLUDE_ALL_AND_PATH , "[[[true]]]" );
62- _assert ("[true,[1,2,[true],3],0]" , "/1/2/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[[[true]]]" );
63- _assert ("[true,[1,2,[true],3],0]" , "/1/3/0" , Inclusion .INCLUDE_ALL_AND_PATH , "" );
55+ _assert ("{'a':[true,{'b':3,'d':2},false]}" , "/a/1/b" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':[{'b':3}]}" , false );
56+ _assert ("[true,[1]]" , "/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[true]" , false );
57+ _assert ("[true,[1]]" , "/1" , Inclusion .INCLUDE_ALL_AND_PATH , "[[1]]" , false );
58+ _assert ("[true,[1,2,[true],3],0]" , "/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[true]" , false );
59+ _assert ("[true,[1,2,[true],3],0]" , "/1" , Inclusion .INCLUDE_ALL_AND_PATH , "[[1,2,[true],3]]" , false );
60+
61+ _assert ("[true,[1,2,[true],3],0]" , "/1/2" , Inclusion .INCLUDE_ALL_AND_PATH , "[[[true]]]" , false );
62+ _assert ("[true,[1,2,[true],3],0]" , "/1/2/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[[[true]]]" , false );
63+ _assert ("[true,[1,2,[true],3],0]" , "/1/3/0" , Inclusion .INCLUDE_ALL_AND_PATH , "" , false );
6464 }
6565
6666 public void testArrayNestedWithoutPath () throws Exception
6767 {
68- _assert ("{'a':[true,{'b':3,'d':2},false]}" , "/a/1/b" , Inclusion .ONLY_INCLUDE_ALL , "3" );
69- _assert ("[true,[1,2,[true],3],0]" , "/0" , Inclusion .ONLY_INCLUDE_ALL , "true" );
68+ _assert ("{'a':[true,{'b':3,'d':2},false]}" , "/a/1/b" , Inclusion .ONLY_INCLUDE_ALL , "3" , false );
69+ _assert ("[true,[1,2,[true],3],0]" , "/0" , Inclusion .ONLY_INCLUDE_ALL , "true" , false );
7070 _assert ("[true,[1,2,[true],3],0]" , "/1" , Inclusion .ONLY_INCLUDE_ALL ,
71- "[1,2,[true],3]" );
71+ "[1,2,[true],3]" , false );
7272
73- _assert ("[true,[1,2,[true],3],0]" , "/1/2" , Inclusion .ONLY_INCLUDE_ALL , "[true]" );
74- _assert ("[true,[1,2,[true],3],0]" , "/1/2/0" , Inclusion .ONLY_INCLUDE_ALL , "true" );
75- _assert ("[true,[1,2,[true],3],0]" , "/1/3/0" , Inclusion .ONLY_INCLUDE_ALL , "" );
73+ _assert ("[true,[1,2,[true],3],0]" , "/1/2" , Inclusion .ONLY_INCLUDE_ALL , "[true]" , false );
74+ _assert ("[true,[1,2,[true],3],0]" , "/1/2/0" , Inclusion .ONLY_INCLUDE_ALL , "true" , false );
75+ _assert ("[true,[1,2,[true],3],0]" , "/1/3/0" , Inclusion .ONLY_INCLUDE_ALL , "" , false );
7676 }
7777
7878// final String SIMPLE_INPUT = aposToQuotes("{'a':1,'b':[1,2,3],'c':{'d':{'a':true}},'d':null}");
7979
8080 public void testArrayElementWithoutPath () throws Exception
8181 {
82- _assert (SIMPLE_INPUT , "/b" , Inclusion .ONLY_INCLUDE_ALL , "[1,2,3]" );
83- _assert (SIMPLE_INPUT , "/b/1" , Inclusion .ONLY_INCLUDE_ALL , "2" );
84- _assert (SIMPLE_INPUT , "/b/2" , Inclusion .ONLY_INCLUDE_ALL , "3" );
82+ _assert (SIMPLE_INPUT , "/b" , Inclusion .ONLY_INCLUDE_ALL , "[1,2,3]" , false );
83+ _assert (SIMPLE_INPUT , "/b/1" , Inclusion .ONLY_INCLUDE_ALL , "2" , false );
84+ _assert (SIMPLE_INPUT , "/b/2" , Inclusion .ONLY_INCLUDE_ALL , "3" , false );
8585
86- _assert (SIMPLE_INPUT , "/b/8" , Inclusion .ONLY_INCLUDE_ALL , "" );
86+ _assert (SIMPLE_INPUT , "/b/8" , Inclusion .ONLY_INCLUDE_ALL , "" , false );
8787
8888 // and then non-match
89- _assert (SIMPLE_INPUT , "/x" , Inclusion .ONLY_INCLUDE_ALL , "" );
89+ _assert (SIMPLE_INPUT , "/x" , Inclusion .ONLY_INCLUDE_ALL , "" , false );
9090 }
9191
92- private void _assert (String input , String pathExpr , Inclusion tokenFilterInclusion , String exp )
92+ public void testAllowMultipleMatchesWithPath () throws Exception
93+ {
94+ _assert ("[1,2,3]" , "/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[1]" , true );
95+ _assert ("[1,2,3]" , "/1" , Inclusion .INCLUDE_ALL_AND_PATH , "[2]" , true );
96+ _assert ("[1,2,3]" , "/2" , Inclusion .INCLUDE_ALL_AND_PATH , "[3]" , true );
97+
98+ _assert ("{'a':[1,2,3]}" , "/a/0" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':[1]}" , true );
99+ _assert ("{'a':[1,2,3]}" , "/a/1" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':[2]}" , true );
100+ _assert ("{'a':[1,2,3]}" , "/a/2" , Inclusion .INCLUDE_ALL_AND_PATH , "{'a':[3]}" , true );
101+
102+ _assert ("[{'id':1},{'id':2},{'id':3}]" , "/0/id" , Inclusion .INCLUDE_ALL_AND_PATH , "[{'id':1}]" , true );
103+ _assert ("[{'id':1},{'id':2},{'id':3}]" , "/1/id" , Inclusion .INCLUDE_ALL_AND_PATH , "[{'id':2}]" , true );
104+ _assert ("[{'id':1},{'id':2},{'id':3}]" , "/2/id" , Inclusion .INCLUDE_ALL_AND_PATH , "[{'id':3}]" , true );
105+
106+ _assert ("[{'id':1,'stuff':[1,2,3]},{'id':2,'stuff':[4,5,6]},{'id':3,'stuff':[7,8,9]}]" , "/0/stuff/0" , Inclusion .INCLUDE_ALL_AND_PATH , "[{'stuff':[1]}]" , true );
107+ _assert ("[{'id':1,'stuff':[1,2,3]},{'id':2,'stuff':[4,5,6]},{'id':3,'stuff':[7,8,9]}]" , "/1/stuff/1" , Inclusion .INCLUDE_ALL_AND_PATH , "[{'stuff':[5]}]" , true );
108+ _assert ("[{'id':1,'stuff':[1,2,3]},{'id':2,'stuff':[4,5,6]},{'id':3,'stuff':[7,8,9]}]" , "/2/stuff/2" , Inclusion .INCLUDE_ALL_AND_PATH , "[{'stuff':[9]}]" , true );
109+ }
110+
111+ private void _assert (String input , String pathExpr , Inclusion tokenFilterInclusion , String exp , boolean allowMultipleMatches )
93112 throws Exception
94113 {
95114 StringWriter w = new StringWriter ();
96115
97116 JsonGenerator g0 = JSON_F .createGenerator (w );
98117 FilteringGeneratorDelegate g = new FilteringGeneratorDelegate (g0 ,
99118 new JsonPointerBasedFilter (pathExpr ),
100- tokenFilterInclusion , false );
119+ tokenFilterInclusion , allowMultipleMatches );
101120
102121 try {
103122 writeJsonDoc (JSON_F , input , g );
0 commit comments