// 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 static com.google.gitiles.TreeSoyData.getTargetDisplayName;
import static com.google.gitiles.TreeSoyData.resolveTargetUrl;

import com.google.common.base.Strings;

import org.eclipse.jgit.lib.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests for {@link TreeSoyData}. */
@RunWith(JUnit4.class)
public class TreeSoyDataTest {
  @Test
  public void getTargetDisplayNameReturnsDisplayName() throws Exception {
    assertThat(getTargetDisplayName("foo")).isEqualTo("foo");
    assertThat(getTargetDisplayName("foo/bar")).isEqualTo("foo/bar");
    assertThat(getTargetDisplayName(Strings.repeat("a/", 10) + "bar"))
        .isEqualTo("a/a/a/a/a/a/a/a/a/a/bar");
    assertThat(getTargetDisplayName(Strings.repeat("a/", 34) + "bar"))
        .isEqualTo("a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/bar");
    assertThat(getTargetDisplayName(Strings.repeat("a/", 35) + "bar")).isEqualTo(".../bar");
    assertThat(getTargetDisplayName(Strings.repeat("a/", 100) + "bar")).isEqualTo(".../bar");
    assertThat(getTargetDisplayName(Strings.repeat("a", 80)))
        .isEqualTo(
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  }

  @Test
  public void resolveTargetUrlReturnsUrl() throws Exception {
    ObjectId id = ObjectId.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
    GitilesView view =
        GitilesView.path()
            .setServletPath("/x")
            .setHostName("host")
            .setRepositoryName("repo")
            .setRevision(Revision.unpeeled("m", id))
            .setPathPart("a/b/c")
            .build();
    assertThat(resolveTargetUrl(view, "/foo")).isNull();
    assertThat(resolveTargetUrl(view, "../../")).isEqualTo("/x/repo/+/m/a");
    assertThat(resolveTargetUrl(view, ".././../")).isEqualTo("/x/repo/+/m/a");
    assertThat(resolveTargetUrl(view, "..//../")).isEqualTo("/x/repo/+/m/a");
    assertThat(resolveTargetUrl(view, "../../d")).isEqualTo("/x/repo/+/m/a/d");
    assertThat(resolveTargetUrl(view, "../../..")).isEqualTo("/x/repo/+/m/");
    assertThat(resolveTargetUrl(view, "../../d/e")).isEqualTo("/x/repo/+/m/a/d/e");
    assertThat(resolveTargetUrl(view, "../d/../e/../")).isEqualTo("/x/repo/+/m/a/b");
    assertThat(resolveTargetUrl(view, "../../../../")).isNull();
    assertThat(resolveTargetUrl(view, "../../a/../../..")).isNull();
  }
}
