// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gitiles;

import static com.google.common.truth.Truth.assertThat;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests for Gitiles views. */
@RunWith(JUnit4.class)
public class GitilesViewTest {
  private static final GitilesView HOST =
      GitilesView.hostIndex().setServletPath("/b").setHostName("host").build();

  @Test
  public void emptyServletPath() throws Exception {
    GitilesView view = GitilesView.hostIndex().setServletPath("").setHostName("host").build();
    assertThat(view.getServletPath()).isEqualTo("");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.HOST_INDEX);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isNull();
    assertThat(view.getRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/?format=HTML");
    assertThat(view.getBreadcrumbs()).containsExactly(breadcrumb("host", "/?format=HTML"));
  }

  @Test
  public void hostIndex() throws Exception {
    assertThat(HOST.getServletPath()).isEqualTo("/b");
    assertThat(HOST.getType()).isEqualTo(GitilesView.Type.HOST_INDEX);
    assertThat(HOST.getHostName()).isEqualTo("host");
    assertThat(HOST.getRepositoryName()).isNull();
    assertThat(HOST.getRevision()).isEqualTo(Revision.NULL);
    assertThat(HOST.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(HOST.toUrl()).isEqualTo("/b/?format=HTML");
    assertThat(HOST.getBreadcrumbs()).containsExactly(breadcrumb("host", "/b/?format=HTML"));
  }

  @Test
  public void hostIndexOneComponentPrefix() throws Exception {
    GitilesView view = GitilesView.hostIndex().copyFrom(HOST).setRepositoryPrefix("foo").build();

    assertThat(view.toUrl()).isEqualTo("/b/foo/");
    assertThat(view.getBreadcrumbs())
        .containsExactly(breadcrumb("host", "/b/?format=HTML"), breadcrumb("foo", "/b/foo/"))
        .inOrder();
  }

  @Test
  public void hostIndexTwoComponentPrefix() throws Exception {
    GitilesView view =
        GitilesView.hostIndex().copyFrom(HOST).setRepositoryPrefix("foo/bar").build();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"))
        .inOrder();
  }

  @Test
  public void queryParams() throws Exception {
    GitilesView view =
        GitilesView.log()
            .copyFrom(HOST)
            .setRepositoryName("repo")
            .setRevision(Revision.named("master"))
            .putParam("foo", "foovalue")
            .putParam("bar", "barvalue")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("repo");
    assertThat(view.getRevision()).isEqualTo(Revision.named("master"));
    assertThat(view.getPathPart()).isNull();
    assertThat(view.getParameters())
        .containsExactlyEntriesIn(
            ImmutableListMultimap.of(
                "foo", "foovalue",
                "bar", "barvalue"));

    assertThat(view.toUrl()).isEqualTo("/b/repo/+log/master?foo=foovalue&bar=barvalue");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("repo", "/b/repo/"),
            breadcrumb("master", "/b/repo/+log/master?foo=foovalue&bar=barvalue"))
        .inOrder();
  }

  @Test
  public void queryParamsCopiedOnlyOnSameType() throws Exception {
    GitilesView view =
        GitilesView.repositoryIndex()
            .copyFrom(HOST)
            .setRepositoryName("repo")
            .putParam("foo", "foovalue")
            .putParam("bar", "barvalue")
            .build();
    assertThat(view.getParameters()).isNotEmpty();
    assertThat(GitilesView.repositoryIndex().copyFrom(view).build().getParameters())
        .isEqualTo(view.getParameters());
    assertThat(GitilesView.hostIndex().copyFrom(view).build().getParameters()).isEmpty();
  }

  @Test
  public void repositoryIndex() throws Exception {
    GitilesView view =
        GitilesView.repositoryIndex().copyFrom(HOST).setRepositoryName("foo/bar").build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.REPOSITORY_INDEX);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"))
        .inOrder();
  }

  @Test
  public void refs() throws Exception {
    GitilesView view = GitilesView.refs().copyFrom(HOST).setRepositoryName("foo/bar").build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.REFS);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+refs");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"))
        .inOrder();
  }

  @Test
  public void refWithRevision() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.revision()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.REVISION);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"))
        .inOrder();
  }

  @Test
  public void describe() throws Exception {
    GitilesView view =
        GitilesView.describe()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setPathPart("deadbeef")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.DESCRIBE);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isEqualTo("deadbeef");
    assertThat(HOST.getParameters()).isEmpty();
  }

  @Test
  public void noPathComponents() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.path()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.PATH);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"))
        .inOrder();
  }

  @Test
  public void onePathComponent() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.path()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.PATH);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"),
            breadcrumb("file", "/b/foo/bar/+/master/file"))
        .inOrder();
  }

  @Test
  public void oneDocFileAuto() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.doc()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/README.md")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.DOC);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("README.md");
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/README.md");
  }

  @Test
  public void oneDocTree() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.doc()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/docs/")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.DOC);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("docs");
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+doc/master/docs");
  }

  @Test
  public void showMarkdown() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.show()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/README.md")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.SHOW);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("README.md");
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+show/master/README.md");
  }

  @Test
  public void rootedDoc() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.rootedDoc()
            .copyFrom(HOST)
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/docs/")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.ROOTED_DOC);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("docs");
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/docs");
  }

  @Test
  public void multiplePathComponents() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.path()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.PATH);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getPathPart()).isEqualTo("path/to/a/file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/path/to/a/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"),
            breadcrumb("path", "/b/foo/bar/+/master/path"),
            breadcrumb("to", "/b/foo/bar/+/master/path/to"),
            breadcrumb("a", "/b/foo/bar/+/master/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+/master/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void diffAgainstFirstParent() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
    GitilesView view =
        GitilesView.diff()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setOldRevision(Revision.unpeeled("master^", parent))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.DIFF);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision().getName()).isEqualTo("master^");
    assertThat(view.getPathPart()).isEqualTo("path/to/a/file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master%5E%21/path/to/a/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master^!", "/b/foo/bar/+/master%5E%21/"),
            breadcrumb(".", "/b/foo/bar/+/master%5E%21/"),
            breadcrumb("path", "/b/foo/bar/+/master%5E%21/path"),
            breadcrumb("to", "/b/foo/bar/+/master%5E%21/path/to"),
            breadcrumb("a", "/b/foo/bar/+/master%5E%21/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+/master%5E%21/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void diffAgainstEmptyRevision() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.diff()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.DIFF);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isEqualTo("path/to/a/file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master%5E%21/path/to/a/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master^!", "/b/foo/bar/+/master%5E%21/"),
            breadcrumb(".", "/b/foo/bar/+/master%5E%21/"),
            breadcrumb("path", "/b/foo/bar/+/master%5E%21/path"),
            breadcrumb("to", "/b/foo/bar/+/master%5E%21/path/to"),
            breadcrumb("a", "/b/foo/bar/+/master%5E%21/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+/master%5E%21/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void diffAgainstOther() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    ObjectId other = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
    GitilesView view =
        GitilesView.diff()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setOldRevision(Revision.unpeeled("efab5678", other))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.DIFF);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision().getName()).isEqualTo("efab5678");
    assertThat(view.getPathPart()).isEqualTo("path/to/a/file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/efab5678..master/path/to/a/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("efab5678..master", "/b/foo/bar/+/efab5678..master/"),
            breadcrumb(".", "/b/foo/bar/+/efab5678..master/"),
            breadcrumb("path", "/b/foo/bar/+/efab5678..master/path"),
            breadcrumb("to", "/b/foo/bar/+/efab5678..master/path/to"),
            breadcrumb("a", "/b/foo/bar/+/efab5678..master/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+/efab5678..master/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void branchLogWithoutPath() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.log()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+log/master");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+log/master"))
        .inOrder();
  }

  @Test
  public void idLogWithoutPath() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.log()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("abcd1234", id))
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("abcd1234");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+log/abcd1234");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("abcd1234", "/b/foo/bar/+log/abcd1234"))
        .inOrder();
  }

  @Test
  public void logWithoutOldRevision() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.log()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isEqualTo("path/to/a/file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+log/master/path/to/a/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+log/master"),
            breadcrumb("path", "/b/foo/bar/+log/master/path"),
            breadcrumb("to", "/b/foo/bar/+log/master/path/to"),
            breadcrumb("a", "/b/foo/bar/+log/master/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+log/master/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void logWithOldRevision() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
    GitilesView view =
        GitilesView.log()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setOldRevision(Revision.unpeeled("master^", parent))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision().getName()).isEqualTo("master^");
    assertThat(view.getPathPart()).isEqualTo("path/to/a/file");
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+log/master%5E..master/path/to/a/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master^..master", "/b/foo/bar/+log/master%5E..master"),
            breadcrumb("path", "/b/foo/bar/+log/master%5E..master/path"),
            breadcrumb("to", "/b/foo/bar/+log/master%5E..master/path/to"),
            breadcrumb("a", "/b/foo/bar/+log/master%5E..master/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+log/master%5E..master/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void logWithNoRevision() throws Exception {
    GitilesView view = GitilesView.log().copyFrom(HOST).setRepositoryName("foo/bar").build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(HOST.getParameters()).isEmpty();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+log");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("HEAD", "/b/foo/bar/+log"))
        .inOrder();
  }

  @Test
  public void archiveWithNoPath() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.archive()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setExtension(".tar.bz2")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.ARCHIVE);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isNull();
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+archive/master.tar.bz2");
  }

  @Test
  public void archiveWithPath() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.archive()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/path/to/a/dir")
            .setExtension(".tar.bz2")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.ARCHIVE);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isEqualTo("path/to/a/dir");
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+archive/master/path/to/a/dir.tar.bz2");
  }

  @Test
  public void blame() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.blame()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/dir/file")
            .build();

    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.BLAME);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo/bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("master");
    assertThat(view.getOldRevision()).isEqualTo(Revision.NULL);
    assertThat(view.getPathPart()).isEqualTo("dir/file");
    assertThat(HOST.getParameters()).isEmpty();
    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+blame/master/dir/file");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"),
            breadcrumb("dir", "/b/foo/bar/+/master/dir"),
            breadcrumb("file", "/b/foo/bar/+blame/master/dir/file"))
        .inOrder();
  }

  @Test
  public void escaping() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    ObjectId parent = ObjectId.fromString("efab5678efab5678efab5678efab5678efab5678");
    // Some of these values are not valid for Git, but check them anyway.
    GitilesView view =
        GitilesView.log()
            .copyFrom(HOST)
            .setRepositoryName("foo?bar")
            .setRevision(Revision.unpeeled("ba/d#name", id))
            .setOldRevision(Revision.unpeeled("other\"na/me", parent))
            .setPathPart("we ird/pa'th/name")
            .putParam("k e y", "val/ue")
            .setAnchor("anc#hor")
            .build();

    // Fields returned by getters are not escaped.
    assertThat(view.getServletPath()).isEqualTo("/b");
    assertThat(view.getType()).isEqualTo(GitilesView.Type.LOG);
    assertThat(view.getHostName()).isEqualTo("host");
    assertThat(view.getRepositoryName()).isEqualTo("foo?bar");
    assertThat(view.getRevision().getId()).isEqualTo(id);
    assertThat(view.getRevision().getName()).isEqualTo("ba/d#name");
    assertThat(view.getOldRevision().getId()).isEqualTo(parent);
    assertThat(view.getOldRevision().getName()).isEqualTo("other\"na/me");
    assertThat(view.getPathPart()).isEqualTo("we ird/pa'th/name");
    assertThat(view.getParameters())
        .isEqualTo(ImmutableListMultimap.<String, String>of("k e y", "val/ue"));

    String qs = "?k+e+y=val%2Fue";
    assertThat(view.toUrl())
        .isEqualTo(
            "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name"
                + qs
                + "#anc%23hor");
    assertThat(view.getBreadcrumbs())
        .containsExactly(
            // Names are not escaped (auto-escaped by Soy) but values are.
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo?bar", "/b/foo%3Fbar/"),
            breadcrumb(
                "other\"na/me..ba/d#name", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name" + qs),
            breadcrumb("we ird", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird" + qs),
            breadcrumb(
                "pa'th", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th" + qs),
            breadcrumb(
                "name", "/b/foo%3Fbar/+log/other%22na/me..ba/d%23name/we%20ird/pa%27th/name" + qs))
        .inOrder();
  }

  @Test
  public void breadcrumbsHasSingleTree() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.path()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("/path/to/a/file")
            .build();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/path/to/a/file");
    assertThat(view.getBreadcrumbs(ImmutableList.of(false, true, true)))
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"),
            breadcrumb("path", "/b/foo/bar/+/master/path"),
            breadcrumb("to", "/b/foo/bar/+/master/path/to?autodive=0"),
            breadcrumb("a", "/b/foo/bar/+/master/path/to/a?autodive=0"),
            breadcrumb("file", "/b/foo/bar/+/master/path/to/a/file"))
        .inOrder();
    assertThat(view.getBreadcrumbs(ImmutableList.of(true, false, false)))
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"),
            breadcrumb("path", "/b/foo/bar/+/master/path?autodive=0"),
            breadcrumb("to", "/b/foo/bar/+/master/path/to"),
            breadcrumb("a", "/b/foo/bar/+/master/path/to/a"),
            breadcrumb("file", "/b/foo/bar/+/master/path/to/a/file"))
        .inOrder();
  }

  @Test
  public void breadcrumbsHasSingleTreeRootPath() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.path()
            .copyFrom(HOST)
            .setRepositoryName("foo/bar")
            .setRevision(Revision.unpeeled("master", id))
            .setPathPart("")
            .build();

    assertThat(view.toUrl()).isEqualTo("/b/foo/bar/+/master/");
    assertThat(view.getBreadcrumbs(ImmutableList.<Boolean>of()))
        .containsExactly(
            breadcrumb("host", "/b/?format=HTML"),
            breadcrumb("foo", "/b/foo/"),
            breadcrumb("bar", "/b/foo/bar/"),
            breadcrumb("master", "/b/foo/bar/+/master"),
            breadcrumb(".", "/b/foo/bar/+/master/"))
        .inOrder();
  }

  private static ImmutableMap<String, String> breadcrumb(String text, String url) {
    return ImmutableMap.of("text", text, "url", url);
  }
}
