22
33import org .junit .jupiter .api .Test ;
44
5+ import java .util .Arrays ;
56import java .util .Collections ;
67import java .util .HashMap ;
78import java .util .List ;
@@ -19,6 +20,14 @@ public void pathKeys() {
1920 assertEquals (Collections .singletonList ("lang" ), keys );
2021 });
2122
23+ pathKeys ("/edit/{id}?" , keys -> {
24+ assertEquals (Collections .singletonList ("id" ), keys );
25+ });
26+
27+ pathKeys ("/path/{id}/{start}?/{end}?" , keys -> {
28+ assertEquals (Arrays .asList ("id" , "start" , "end" ), keys );
29+ });
30+
2231 pathKeys ("/*" , keys -> assertEquals (1 , keys .size ()));
2332
2433 pathKeys ("/foo/?*" , keys -> assertEquals (1 , keys .size ()));
@@ -48,7 +57,8 @@ public void reverse() {
4857
4958 assertEquals ("/123" , Router .reverse ("/{regex:\\ d+}" , map ("regex" , 123 )));
5059
51- assertEquals ("/resources/123/edit" , Router .reverse ("/resources/{num:\\ d+}/edit" , map ("num" , 123 )));
60+ assertEquals ("/resources/123/edit" ,
61+ Router .reverse ("/resources/{num:\\ d+}/edit" , map ("num" , 123 )));
5262
5363 assertEquals ("/prefix/v1/v2" , Router .reverse ("/prefix/{k1}/{k2}" , map ("k1" , "v1" , "k2" , "v2" )));
5464
@@ -61,13 +71,95 @@ public void reverse() {
6171 assertEquals ("/" , Router .reverse ("/" , Collections .emptyMap ()));
6272 assertEquals ("/path" , Router .reverse ("/path" , Collections .emptyMap ()));
6373 assertEquals ("/path" , Router .reverse ("/path" , map ("k" , "v" )));
74+ }
75+
76+ @ Test
77+ public void shouldExpandOptionalParams () {
78+ parse ("/{lang:[a-z]{2}}?" , paths -> {
79+ assertEquals (2 , paths .size ());
80+ assertEquals ("/" , paths .get (0 ));
81+ assertEquals ("/{lang:[a-z]{2}}" , paths .get (1 ));
82+ });
83+ parse ("/{lang:[a-z]{2}}" , paths -> {
84+ assertEquals (1 , paths .size ());
85+ assertEquals ("/{lang:[a-z]{2}}" , paths .get (0 ));
86+ });
87+ parse ("/edit/{id:[0-9]+}?" , paths -> {
88+ assertEquals (2 , paths .size ());
89+ assertEquals ("/edit" , paths .get (0 ));
90+ assertEquals ("/edit/{id:[0-9]+}" , paths .get (1 ));
91+ });
92+ parse ("/path/{id}/{start}?/{end}?" , paths -> {
93+ assertEquals (3 , paths .size ());
94+ assertEquals ("/path/{id}" , paths .get (0 ));
95+ assertEquals ("/path/{id}/{start}" , paths .get (1 ));
96+ assertEquals ("/path/{id}/{start}/{end}" , paths .get (2 ));
97+ });
98+ parse ("/{id}?/suffix" , paths -> {
99+ assertEquals (3 , paths .size ());
100+ assertEquals ("/" , paths .get (0 ));
101+ assertEquals ("/{id}/suffix" , paths .get (1 ));
102+ assertEquals ("/suffix" , paths .get (2 ));
103+ });
104+ parse ("/prefix/{id}?" , paths -> {
105+ assertEquals (2 , paths .size ());
106+ assertEquals ("/prefix" , paths .get (0 ));
107+ assertEquals ("/prefix/{id}" , paths .get (1 ));
108+ });
109+ parse ("/{id}?" , paths -> {
110+ assertEquals (2 , paths .size ());
111+ assertEquals ("/" , paths .get (0 ));
112+ assertEquals ("/{id}" , paths .get (1 ));
113+ });
114+ parse ("/path" , paths -> {
115+ assertEquals (1 , paths .size ());
116+ assertEquals ("/path" , paths .get (0 ));
117+ });
64118
119+ parse ("/path/subpath" , paths -> {
120+ assertEquals (1 , paths .size ());
121+ assertEquals ("/path/subpath" , paths .get (0 ));
122+ });
123+
124+ parse ("/{id}" , paths -> {
125+ assertEquals (1 , paths .size ());
126+ assertEquals ("/{id}" , paths .get (0 ));
127+ });
128+
129+ parse ("/{id}/suffix" , paths -> {
130+ assertEquals (1 , paths .size ());
131+ assertEquals ("/{id}/suffix" , paths .get (0 ));
132+ });
133+
134+ parse ("/prefix/{id}" , paths -> {
135+ assertEquals (1 , paths .size ());
136+ assertEquals ("/prefix/{id}" , paths .get (0 ));
137+ });
138+
139+ parse ("/" , paths -> {
140+ assertEquals (1 , paths .size ());
141+ assertEquals ("/" , paths .get (0 ));
142+ });
143+
144+ parse (null , paths -> {
145+ assertEquals (1 , paths .size ());
146+ assertEquals ("/" , paths .get (0 ));
147+ });
148+
149+ parse ("" , paths -> {
150+ assertEquals (1 , paths .size ());
151+ assertEquals ("/" , paths .get (0 ));
152+ });
65153 }
66154
67155 private void pathKeys (String pattern , Consumer <List <String >> consumer ) {
68156 consumer .accept (Router .pathKeys (pattern ));
69157 }
70158
159+ private void parse (String pattern , Consumer <List <String >> consumer ) {
160+ consumer .accept (Router .expandOptionalVariables (pattern ));
161+ }
162+
71163 public Map <String , Object > map (Object ... values ) {
72164 Map <String , Object > map = new HashMap <>();
73165 for (int i = 0 ; i < values .length ; i += 2 ) {
0 commit comments