/*
 * Copyright 2013-present Facebook, Inc.
 *
 * 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.facebook.buck.util;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class MoreStringsTest {

  @Test
  public void testIsEmpty() {
    assertTrue(MoreStrings.isEmpty(""));
    assertTrue(MoreStrings.isEmpty(new StringBuilder()));
    assertFalse(MoreStrings.isEmpty("text"));
    assertFalse(MoreStrings.isEmpty(new StringBuilder("text")));
  }

  @Test(expected = NullPointerException.class)
  public void testIsEmptyRejectsNull() {
    MoreStrings.isEmpty(null);
  }

  @Test
  public void testWithoutSuffix() {
    assertEquals("abc", MoreStrings.withoutSuffix("abcdef", "def"));
    assertEquals("", MoreStrings.withoutSuffix("abcdef", "abcdef"));
  }

  @Test
  public void testCapitalize() {
    assertEquals("Foo", MoreStrings.capitalize("foo"));
    assertEquals("F", MoreStrings.capitalize("f"));
    assertEquals("", MoreStrings.capitalize(""));
  }

  @Test(expected = NullPointerException.class)
  public void testCapitalizeRejectsNull() {
    MoreStrings.capitalize(null);
  }

  @Test
  public void testGetLevenshteinDistance() {
    assertEquals(
        "The distance between '' and 'BUILD' should be 5 (e.g., 5 insertions).", 
        5, 
        MoreStrings.getLevenshteinDistance("", "BUILD"));
    assertEquals(
        "'BUILD' and 'BUILD' should be identical.", 
        0, 
        MoreStrings.getLevenshteinDistance("BUILD", "BUILD"));
    assertEquals(
        "The distance between 'BIULD' and 'BUILD' should be 2 (e.g., 1 deletion + 1 insertion).", 
        2, 
        MoreStrings.getLevenshteinDistance("BIULD", "BUILD"));
    assertEquals(
        "The distance between 'INSTALL' and 'AUDIT' should be 7 (e.g., 5 substitutions + 2 deletions).", 
        7, 
        MoreStrings.getLevenshteinDistance("INSTALL", "AUDIT"));
    assertEquals(
        "The distance between 'aaa' and 'bbbbbb' should be 6 (e.g., 3 substitutions + 3 insertions).", 
        6, 
        MoreStrings.getLevenshteinDistance("aaa", "bbbbbb"));
    assertEquals(
        "The distance between 'build' and 'biuldd' should be 3 (e.g., 1 deletion + 2 insertions).", 
        3, 
        MoreStrings.getLevenshteinDistance("build", "biuldd"));
    assertEquals(
        "The distance between 'test' and 'tset' should be 2 (e.g., 1 deletion + 1 insertion).", 
        2, 
        MoreStrings.getLevenshteinDistance("test", "tset"));
  }
}
