// Copyright (C) 2014 The Android Open Source Project
//
// 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.gerrit.server.change;

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

import com.google.common.collect.Sets;

import org.junit.Test;

public class HashtagsTest {
  @Test
  public void emptyCommitMessage() throws Exception {
    assertThat((Iterable<?>)HashtagsUtil.extractTags("")).isEmpty();
  }

  @Test
  public void nullCommitMessage() throws Exception {
    assertThat((Iterable<?>)HashtagsUtil.extractTags(null)).isEmpty();
  }

  @Test
  public void noHashtags() throws Exception {
    String commitMessage = "Subject\n\nLine 1\n\nLine 2";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage)).isEmpty();
  }

  @Test
  public void singleHashtag() throws Exception {
    String commitMessage = "#Subject\n\nLine 1\n\nLine 2";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(Sets.newHashSet("Subject"));
  }

  @Test
  public void singleHashtagNumeric() throws Exception {
    String commitMessage = "Subject\n\n#123\n\nLine 2";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(Sets.newHashSet("123"));
  }

  @Test
  public void multipleHashtags() throws Exception {
    String commitMessage = "#Subject\n\n#Hashtag\n\nLine 2";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(Sets.newHashSet("Subject", "Hashtag"));
  }

  @Test
  public void repeatedHashtag() throws Exception {
    String commitMessage = "#Subject\n\n#Hashtag1\n\n#Hashtag2\n\n#Hashtag1";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(
          Sets.newHashSet("Subject", "Hashtag1", "Hashtag2"));
  }

  @Test
  public void multipleHashtagsNoSpaces() throws Exception {
    String commitMessage = "Subject\n\n#Hashtag1#Hashtag2";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(Sets.newHashSet("Hashtag1"));
  }

  @Test
  public void hyphenatedHashtag() throws Exception {
    String commitMessage = "Subject\n\n#Hyphenated-Hashtag";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(Sets.newHashSet("Hyphenated-Hashtag"));
  }

  @Test
  public void underscoredHashtag() throws Exception {
    String commitMessage = "Subject\n\n#Underscored_Hashtag";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(Sets.newHashSet("Underscored_Hashtag"));
  }

  @Test
  public void hashtagsWithAccentedCharacters() throws Exception {
    String commitMessage = "Jag #måste #öva på min #Svenska!\n\n"
        + "Jag behöver en #läkare.";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage))
      .containsExactlyElementsIn(
          Sets.newHashSet("måste", "öva", "Svenska", "läkare"));
  }

  @Test
  public void hashWithoutHashtag() throws Exception {
    String commitMessage = "Subject\n\n# Text";
    assertThat((Iterable<?>)HashtagsUtil.extractTags(commitMessage)).isEmpty();
  }
}
