/*
 * 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);
  }
}
