/*
 * 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.java.abi;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;

import com.google.common.collect.ImmutableList;

import org.junit.Test;

public class JoinerTest {

  @Test(expected = NullPointerException.class)
  public void separatorMustNotBeNull() {
    Joiner.on(null);
  }

  @Test
  public void aSingleItemShouldNotBeJoinedWithAnything() {
    String joined = Joiner.on(",").join(ImmutableList.of("hello"));

    assertThat(joined, not(containsString(",")));
  }

  @Test
  public void separatorShouldOnlyBeInsertedBetweenItems() {
    String joined = Joiner.on(".").join(ImmutableList.of("hello", "world"));

    assertEquals("hello.world", joined);
  }

  @Test
  public void shouldAppendToAStringBuilder() {
    StringBuilder builder = new StringBuilder("This example: ");
    Joiner.on(", ").appendTo(builder, ImmutableList.of("one", "two", "three"));

    assertEquals("This example: one, two, three", builder.toString());
  }
}
