blob: cf246b9cced7757c4ade4dc127292ac3ea1d14fb [file] [log] [blame]
Dave Borowitz9de65952012-08-13 16:09:45 -07001// Copyright 2012 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package com.google.gitiles;
16
17import com.google.common.collect.ImmutableList;
18import com.google.common.collect.ImmutableListMultimap;
19import com.google.common.collect.ImmutableMap;
20import com.google.gitiles.GitilesView.Type;
21
22import junit.framework.TestCase;
23
24import org.eclipse.jgit.lib.ObjectId;
25
26/** Tests for Gitiles views. */
27public class GitilesViewTest extends TestCase {
28 private static final GitilesView HOST = GitilesView.hostIndex()
29 .setServletPath("/b")
30 .setHostName("host")
31 .build();
32
33 public void testEmptyServletPath() throws Exception {
34 GitilesView view = GitilesView.hostIndex()
35 .setServletPath("")
36 .setHostName("host")
37 .build();
38 assertEquals("", view.getServletPath());
39 assertEquals(Type.HOST_INDEX, view.getType());
40 assertEquals("host", view.getHostName());
41 assertNull(view.getRepositoryName());
42 assertEquals(Revision.NULL, view.getRevision());
43 assertNull(view.getTreePath());
44 assertTrue(HOST.getParameters().isEmpty());
45
46 assertEquals("/?format=HTML", view.toUrl());
47 assertEquals(ImmutableList.of(ImmutableMap.of("text", "host", "url", "/?format=HTML")),
48 view.getBreadcrumbs());
49 }
50
51 public void testHostIndex() throws Exception {
52 assertEquals("/b", HOST.getServletPath());
53 assertEquals(Type.HOST_INDEX, HOST.getType());
54 assertEquals("host", HOST.getHostName());
55 assertNull(HOST.getRepositoryName());
56 assertEquals(Revision.NULL, HOST.getRevision());
57 assertNull(HOST.getTreePath());
58 assertTrue(HOST.getParameters().isEmpty());
59
60 assertEquals("/b/?format=HTML", HOST.toUrl());
61 assertEquals(ImmutableList.of(ImmutableMap.of("text", "host", "url", "/b/?format=HTML")),
62 HOST.getBreadcrumbs());
63 }
64
65 public void testQueryParams() throws Exception {
66 GitilesView view = GitilesView.hostIndex().copyFrom(HOST)
67 .putParam("foo", "foovalue")
68 .putParam("bar", "barvalue")
69 .build();
70
71 assertEquals("/b", view.getServletPath());
72 assertEquals(Type.HOST_INDEX, view.getType());
73 assertEquals("host", view.getHostName());
74 assertNull(view.getRepositoryName());
75 assertEquals(Revision.NULL, view.getRevision());
76 assertNull(view.getTreePath());
77 assertEquals(
78 ImmutableListMultimap.of(
79 "foo", "foovalue",
80 "bar", "barvalue"),
81 view.getParameters());
82
83 assertEquals("/b/?format=HTML&foo=foovalue&bar=barvalue", view.toUrl());
84 assertEquals(ImmutableList.of(ImmutableMap.of("text", "host", "url", "/b/?format=HTML")),
85 view.getBreadcrumbs());
86 }
87
88 public void testQueryParamsNotCopied() throws Exception {
89 GitilesView view = GitilesView.hostIndex().copyFrom(HOST)
90 .putParam("foo", "foovalue")
91 .putParam("bar", "barvalue")
92 .build();
93 GitilesView copy = GitilesView.hostIndex().copyFrom(view).build();
94 assertFalse(view.getParameters().isEmpty());
95 assertTrue(copy.getParameters().isEmpty());
96 }
97
98 public void testRepositoryIndex() throws Exception {
99 GitilesView view = GitilesView.repositoryIndex()
100 .copyFrom(HOST)
101 .setRepositoryName("foo/bar")
102 .build();
103
104 assertEquals("/b", view.getServletPath());
105 assertEquals(Type.REPOSITORY_INDEX, view.getType());
106 assertEquals("host", view.getHostName());
107 assertEquals("foo/bar", view.getRepositoryName());
108 assertEquals(Revision.NULL, view.getRevision());
109 assertNull(view.getTreePath());
110 assertTrue(HOST.getParameters().isEmpty());
111
112 assertEquals("/b/foo/bar/", view.toUrl());
113 assertEquals(
114 ImmutableList.of(
115 breadcrumb("host", "/b/?format=HTML"),
116 breadcrumb("foo/bar", "/b/foo/bar/")),
117 view.getBreadcrumbs());
118 }
119
120 public void testRefWithRevision() throws Exception {
121 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
122 GitilesView view = GitilesView.revision()
123 .copyFrom(HOST)
124 .setRepositoryName("foo/bar")
125 .setRevision(Revision.unpeeled("master", id))
126 .build();
127
128 assertEquals("/b", view.getServletPath());
129 assertEquals(Type.REVISION, view.getType());
130 assertEquals("host", view.getHostName());
131 assertEquals("foo/bar", view.getRepositoryName());
132 assertEquals(id, view.getRevision().getId());
133 assertEquals("master", view.getRevision().getName());
134 assertNull(view.getTreePath());
135 assertTrue(HOST.getParameters().isEmpty());
136
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800137 assertEquals("/b/foo/bar/+/master", view.toUrl());
Dave Borowitz9de65952012-08-13 16:09:45 -0700138 assertEquals(
139 ImmutableList.of(
140 breadcrumb("host", "/b/?format=HTML"),
141 breadcrumb("foo/bar", "/b/foo/bar/"),
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800142 breadcrumb("master", "/b/foo/bar/+/master")),
Dave Borowitz9de65952012-08-13 16:09:45 -0700143 view.getBreadcrumbs());
144 }
145
146 public void testNoPathComponents() throws Exception {
147 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
148 GitilesView view = GitilesView.path()
149 .copyFrom(HOST)
150 .setRepositoryName("foo/bar")
151 .setRevision(Revision.unpeeled("master", id))
152 .setTreePath("/")
153 .build();
154
155 assertEquals("/b", view.getServletPath());
156 assertEquals(Type.PATH, view.getType());
157 assertEquals("host", view.getHostName());
158 assertEquals("foo/bar", view.getRepositoryName());
159 assertEquals(id, view.getRevision().getId());
160 assertEquals("master", view.getRevision().getName());
161 assertEquals("", view.getTreePath());
162 assertTrue(HOST.getParameters().isEmpty());
163
164 assertEquals("/b/foo/bar/+/master/", view.toUrl());
165 assertEquals(
166 ImmutableList.of(
167 breadcrumb("host", "/b/?format=HTML"),
168 breadcrumb("foo/bar", "/b/foo/bar/"),
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800169 breadcrumb("master", "/b/foo/bar/+/master"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700170 breadcrumb(".", "/b/foo/bar/+/master/")),
171 view.getBreadcrumbs());
172 }
173
174 public void testOnePathComponent() throws Exception {
175 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
176 GitilesView view = GitilesView.path()
177 .copyFrom(HOST)
178 .setRepositoryName("foo/bar")
179 .setRevision(Revision.unpeeled("master", id))
180 .setTreePath("/file")
181 .build();
182
183 assertEquals("/b", view.getServletPath());
184 assertEquals(Type.PATH, view.getType());
185 assertEquals("host", view.getHostName());
186 assertEquals("foo/bar", view.getRepositoryName());
187 assertEquals(id, view.getRevision().getId());
188 assertEquals("master", view.getRevision().getName());
189 assertEquals("file", view.getTreePath());
190 assertTrue(HOST.getParameters().isEmpty());
191
192 assertEquals("/b/foo/bar/+/master/file", view.toUrl());
193 assertEquals(
194 ImmutableList.of(
195 breadcrumb("host", "/b/?format=HTML"),
196 breadcrumb("foo/bar", "/b/foo/bar/"),
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800197 breadcrumb("master", "/b/foo/bar/+/master"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700198 breadcrumb(".", "/b/foo/bar/+/master/"),
199 breadcrumb("file", "/b/foo/bar/+/master/file")),
200 view.getBreadcrumbs());
201 }
202
203 public void testMultiplePathComponents() throws Exception {
204 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
205 GitilesView view = GitilesView.path()
206 .copyFrom(HOST)
207 .setRepositoryName("foo/bar")
208 .setRevision(Revision.unpeeled("master", id))
209 .setTreePath("/path/to/a/file")
210 .build();
211
212 assertEquals("/b", view.getServletPath());
213 assertEquals(Type.PATH, view.getType());
214 assertEquals("host", view.getHostName());
215 assertEquals("foo/bar", view.getRepositoryName());
216 assertEquals(id, view.getRevision().getId());
217 assertEquals("master", view.getRevision().getName());
218 assertEquals("path/to/a/file", view.getTreePath());
219 assertTrue(HOST.getParameters().isEmpty());
220
221 assertEquals("/b/foo/bar/+/master/path/to/a/file", view.toUrl());
222 assertEquals(
223 ImmutableList.of(
224 breadcrumb("host", "/b/?format=HTML"),
225 breadcrumb("foo/bar", "/b/foo/bar/"),
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800226 breadcrumb("master", "/b/foo/bar/+/master"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700227 breadcrumb(".", "/b/foo/bar/+/master/"),
228 breadcrumb("path", "/b/foo/bar/+/master/path"),
229 breadcrumb("to", "/b/foo/bar/+/master/path/to"),
230 breadcrumb("a", "/b/foo/bar/+/master/path/to/a"),
231 breadcrumb("file", "/b/foo/bar/+/master/path/to/a/file")),
232 view.getBreadcrumbs());
233 }
234
235 public void testDiffAgainstFirstParent() throws Exception {
236 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
237 ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
238 GitilesView view = GitilesView.diff()
239 .copyFrom(HOST)
240 .setRepositoryName("foo/bar")
241 .setRevision(Revision.unpeeled("master", id))
242 .setOldRevision(Revision.unpeeled("master^", parent))
243 .setTreePath("/path/to/a/file")
244 .build();
245
246 assertEquals("/b", view.getServletPath());
247 assertEquals(Type.DIFF, view.getType());
248 assertEquals("host", view.getHostName());
249 assertEquals("foo/bar", view.getRepositoryName());
250 assertEquals(id, view.getRevision().getId());
251 assertEquals("master", view.getRevision().getName());
252 assertEquals("master^", view.getOldRevision().getName());
253 assertEquals("path/to/a/file", view.getTreePath());
254 assertTrue(HOST.getParameters().isEmpty());
255
256 assertEquals("/b/foo/bar/+/master%5E%21/path/to/a/file", view.toUrl());
257 assertEquals(
258 ImmutableList.of(
259 breadcrumb("host", "/b/?format=HTML"),
260 breadcrumb("foo/bar", "/b/foo/bar/"),
261 breadcrumb("master^!", "/b/foo/bar/+/master%5E%21/"),
262 breadcrumb(".", "/b/foo/bar/+/master%5E%21/"),
263 breadcrumb("path", "/b/foo/bar/+/master%5E%21/path"),
264 breadcrumb("to", "/b/foo/bar/+/master%5E%21/path/to"),
265 breadcrumb("a", "/b/foo/bar/+/master%5E%21/path/to/a"),
266 breadcrumb("file", "/b/foo/bar/+/master%5E%21/path/to/a/file")),
267 view.getBreadcrumbs());
268 }
269
270 public void testDiffAgainstEmptyRevision() throws Exception {
271 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
272 GitilesView view = GitilesView.diff()
273 .copyFrom(HOST)
274 .setRepositoryName("foo/bar")
275 .setRevision(Revision.unpeeled("master", id))
276 .setTreePath("/path/to/a/file")
277 .build();
278
279 assertEquals("/b", view.getServletPath());
280 assertEquals(Type.DIFF, view.getType());
281 assertEquals("host", view.getHostName());
282 assertEquals("foo/bar", view.getRepositoryName());
283 assertEquals(id, view.getRevision().getId());
284 assertEquals("master", view.getRevision().getName());
285 assertEquals(Revision.NULL, view.getOldRevision());
286 assertEquals("path/to/a/file", view.getTreePath());
287 assertTrue(HOST.getParameters().isEmpty());
288
289 assertEquals("/b/foo/bar/+/master%5E%21/path/to/a/file", view.toUrl());
290 assertEquals(
291 ImmutableList.of(
292 breadcrumb("host", "/b/?format=HTML"),
293 breadcrumb("foo/bar", "/b/foo/bar/"),
294 breadcrumb("master^!", "/b/foo/bar/+/master%5E%21/"),
295 breadcrumb(".", "/b/foo/bar/+/master%5E%21/"),
296 breadcrumb("path", "/b/foo/bar/+/master%5E%21/path"),
297 breadcrumb("to", "/b/foo/bar/+/master%5E%21/path/to"),
298 breadcrumb("a", "/b/foo/bar/+/master%5E%21/path/to/a"),
299 breadcrumb("file", "/b/foo/bar/+/master%5E%21/path/to/a/file")),
300 view.getBreadcrumbs());
301 }
302
303 public void testDiffAgainstOther() throws Exception {
304 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
305 ObjectId other = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
306 GitilesView view = GitilesView.diff()
307 .copyFrom(HOST)
308 .setRepositoryName("foo/bar")
309 .setRevision(Revision.unpeeled("master", id))
310 .setOldRevision(Revision.unpeeled("efab5678", other))
311 .setTreePath("/path/to/a/file")
312 .build();
313
314 assertEquals("/b", view.getServletPath());
315 assertEquals(Type.DIFF, view.getType());
316 assertEquals("host", view.getHostName());
317 assertEquals("foo/bar", view.getRepositoryName());
318 assertEquals(id, view.getRevision().getId());
319 assertEquals("master", view.getRevision().getName());
320 assertEquals("efab5678", view.getOldRevision().getName());
321 assertEquals("path/to/a/file", view.getTreePath());
322 assertTrue(HOST.getParameters().isEmpty());
323
324 assertEquals("/b/foo/bar/+/efab5678..master/path/to/a/file", view.toUrl());
325 assertEquals(
326 ImmutableList.of(
327 breadcrumb("host", "/b/?format=HTML"),
328 breadcrumb("foo/bar", "/b/foo/bar/"),
329 breadcrumb("efab5678..master", "/b/foo/bar/+/efab5678..master/"),
330 breadcrumb(".", "/b/foo/bar/+/efab5678..master/"),
331 breadcrumb("path", "/b/foo/bar/+/efab5678..master/path"),
332 breadcrumb("to", "/b/foo/bar/+/efab5678..master/path/to"),
333 breadcrumb("a", "/b/foo/bar/+/efab5678..master/path/to/a"),
334 breadcrumb("file", "/b/foo/bar/+/efab5678..master/path/to/a/file")),
335 view.getBreadcrumbs());
336 }
337
338 public void testBranchLogWithoutPath() throws Exception {
339 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
340 GitilesView view = GitilesView.log()
341 .copyFrom(HOST)
342 .setRepositoryName("foo/bar")
343 .setRevision(Revision.unpeeled("master", id))
344 .build();
345
346 assertEquals("/b", view.getServletPath());
347 assertEquals(Type.LOG, view.getType());
348 assertEquals("host", view.getHostName());
349 assertEquals("foo/bar", view.getRepositoryName());
350 assertEquals(id, view.getRevision().getId());
351 assertEquals("master", view.getRevision().getName());
352 assertEquals(Revision.NULL, view.getOldRevision());
353 assertNull(view.getTreePath());
354 assertTrue(HOST.getParameters().isEmpty());
355
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800356 assertEquals("/b/foo/bar/+log/master", view.toUrl());
Dave Borowitz9de65952012-08-13 16:09:45 -0700357 assertEquals(
358 ImmutableList.of(
359 breadcrumb("host", "/b/?format=HTML"),
360 breadcrumb("foo/bar", "/b/foo/bar/"),
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800361 breadcrumb("master", "/b/foo/bar/+log/master")),
Dave Borowitz9de65952012-08-13 16:09:45 -0700362 view.getBreadcrumbs());
363 }
364
365 public void testIdLogWithoutPath() throws Exception {
366 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
367 GitilesView view = GitilesView.log()
368 .copyFrom(HOST)
369 .setRepositoryName("foo/bar")
370 .setRevision(Revision.unpeeled("abcd1234", id))
371 .build();
372
373 assertEquals("/b", view.getServletPath());
374 assertEquals(Type.LOG, view.getType());
375 assertEquals("host", view.getHostName());
376 assertEquals("foo/bar", view.getRepositoryName());
377 assertEquals(id, view.getRevision().getId());
378 assertEquals("abcd1234", view.getRevision().getName());
379 assertEquals(Revision.NULL, view.getOldRevision());
380 assertNull(view.getTreePath());
381 assertTrue(HOST.getParameters().isEmpty());
382
383 assertEquals("/b/foo/bar/+log/abcd1234", view.toUrl());
384 assertEquals(
385 ImmutableList.of(
386 breadcrumb("host", "/b/?format=HTML"),
387 breadcrumb("foo/bar", "/b/foo/bar/"),
388 breadcrumb("abcd1234", "/b/foo/bar/+log/abcd1234")),
389 view.getBreadcrumbs());
390 }
391
392 public void testLogWithoutOldRevision() throws Exception {
393 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
394 GitilesView view = GitilesView.log()
395 .copyFrom(HOST)
396 .setRepositoryName("foo/bar")
397 .setRevision(Revision.unpeeled("master", id))
398 .setTreePath("/path/to/a/file")
399 .build();
400
401 assertEquals("/b", view.getServletPath());
402 assertEquals(Type.LOG, view.getType());
403 assertEquals("host", view.getHostName());
404 assertEquals("foo/bar", view.getRepositoryName());
405 assertEquals(id, view.getRevision().getId());
406 assertEquals("master", view.getRevision().getName());
407 assertEquals(Revision.NULL, view.getOldRevision());
408 assertEquals("path/to/a/file", view.getTreePath());
409 assertTrue(HOST.getParameters().isEmpty());
410
411 assertEquals("/b/foo/bar/+log/master/path/to/a/file", view.toUrl());
412 assertEquals(
413 ImmutableList.of(
414 breadcrumb("host", "/b/?format=HTML"),
415 breadcrumb("foo/bar", "/b/foo/bar/"),
Dave Borowitzd3e6dd72012-12-20 15:48:24 -0800416 breadcrumb("master", "/b/foo/bar/+log/master"),
Dave Borowitz9de65952012-08-13 16:09:45 -0700417 breadcrumb("path", "/b/foo/bar/+log/master/path"),
418 breadcrumb("to", "/b/foo/bar/+log/master/path/to"),
419 breadcrumb("a", "/b/foo/bar/+log/master/path/to/a"),
420 breadcrumb("file", "/b/foo/bar/+log/master/path/to/a/file")),
421 view.getBreadcrumbs());
422 }
423
424 public void testLogWithOldRevision() throws Exception {
425 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
426 ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
427 GitilesView view = GitilesView.log()
428 .copyFrom(HOST)
429 .setRepositoryName("foo/bar")
430 .setRevision(Revision.unpeeled("master", id))
431 .setOldRevision(Revision.unpeeled("master^", parent))
432 .setTreePath("/path/to/a/file")
433 .build();
434
435 assertEquals("/b", view.getServletPath());
436 assertEquals(Type.LOG, view.getType());
437 assertEquals("host", view.getHostName());
438 assertEquals("foo/bar", view.getRepositoryName());
439 assertEquals(id, view.getRevision().getId());
440 assertEquals("master", view.getRevision().getName());
441 assertEquals("master^", view.getOldRevision().getName());
442 assertEquals("path/to/a/file", view.getTreePath());
443 assertTrue(HOST.getParameters().isEmpty());
444
445 assertEquals("/b/foo/bar/+log/master%5E..master/path/to/a/file", view.toUrl());
446 assertEquals(
447 ImmutableList.of(
448 breadcrumb("host", "/b/?format=HTML"),
449 breadcrumb("foo/bar", "/b/foo/bar/"),
450 breadcrumb("master^..master", "/b/foo/bar/+log/master%5E..master"),
451 breadcrumb("path", "/b/foo/bar/+log/master%5E..master/path"),
452 breadcrumb("to", "/b/foo/bar/+log/master%5E..master/path/to"),
453 breadcrumb("a", "/b/foo/bar/+log/master%5E..master/path/to/a"),
454 breadcrumb("file", "/b/foo/bar/+log/master%5E..master/path/to/a/file")),
455 view.getBreadcrumbs());
456 }
457
458 public void testEscaping() throws Exception {
459 ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
460 ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
461 // Some of these values are not valid for Git, but check them anyway.
462 GitilesView view = GitilesView.log()
463 .copyFrom(HOST)
464 .setRepositoryName("foo?bar")
465 .setRevision(Revision.unpeeled("ba/d#name", id))
466 .setOldRevision(Revision.unpeeled("other\"na/me", parent))
467 .setTreePath("we ird/pa'th/name")
468 .putParam("k e y", "val/ue")
469 .setAnchor("anc#hor")
470 .build();
471
472 // Fields returned by getters are not escaped.
473 assertEquals("/b", view.getServletPath());
474 assertEquals(Type.LOG, view.getType());
475 assertEquals("host", view.getHostName());
476 assertEquals("foo?bar", view.getRepositoryName());
477 assertEquals(id, view.getRevision().getId());
478 assertEquals("ba/d#name", view.getRevision().getName());
479 assertEquals(parent, view.getOldRevision().getId());
480 assertEquals("other\"na/me", view.getOldRevision().getName());
481 assertEquals("we ird/pa'th/name", view.getTreePath());
482 assertEquals(ImmutableListMultimap.<String, String> of("k e y", "val/ue"),
483 view.getParameters());
484
485 assertEquals(
486 "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name"
487 + "?k+e+y=val%2Fue#anc%23hor", view.toUrl());
488 assertEquals(
489 ImmutableList.of(
490 // Names are not escaped (auto-escaped by Soy) but values are.
491 breadcrumb("host", "/b/?format=HTML"),
492 breadcrumb("foo?bar", "/b/foo%3Fbar/"),
493 breadcrumb("other\"na/me..ba/d#name", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name"),
494 breadcrumb("we ird", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird"),
495 breadcrumb("pa'th", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th"),
496 breadcrumb("name",
497 "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name")),
498 view.getBreadcrumbs());
499 }
500
501 private static ImmutableMap<String, String> breadcrumb(String text, String url) {
502 return ImmutableMap.of("text", text, "url", url);
503 }
504}