/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.log4j.pattern;

import junit.framework.TestCase;


/**
 * Tests for NameAbbrevator.
 *
 */
public class NameAbbreviatorTest extends TestCase {
  /**
   * Create a new instance.
   *
   * @param name test name
   */
  public NameAbbreviatorTest(final String name) {
    super(name);
  }

  /**
   * Check that getDefaultAbbreviator does not return null.
   *
   */
  public void testGetDefault() {
    NameAbbreviator abbrev = NameAbbreviator.getDefaultAbbreviator();
    assertNotNull(abbrev);
  }

  /**
   * Check that "0" drops all name content.
   *
   */
  public void testZero() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("0");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());
  }

  /**
   * Check that getAbbreviator(" ") returns default abbreviator.
   *
   */
  public void testBlank() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("   ");
    NameAbbreviator defaultAbbrev = NameAbbreviator.getDefaultAbbreviator();
    assertTrue(abbrev == defaultAbbrev);
  }

  /**
   * Check that getAbbreviator("1").abbreviate() drops all but the final name element.
   *
   */
  public void testOne() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("1");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());
  }

  /**
   * Check that blanks are trimmed in evaluating abbreviation pattern.
   */
  public void testBlankOne() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator(" 1 ");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());
  }

  /**
   * Check that getAbbreviator("2").abbreviate drops all but the last two elements.
   *
   */
  public void testTwo() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("2");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - foo.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - foo.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());
  }

  /**
   * Check that getAbbreviator("1.").abbreviate abbreviates non-final elements
   * to one character.
   *
   */
  public void testOneDot() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("1.");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o.e.f.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("org.example.foo.");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o.e.f.", buf.toString());


    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - f.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append(".");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - .", buf.toString());
  }

  /**
   * Check that getAbbreviator("1~.").abbreviate abbreviates non-final elements
   * to one character and a tilde.
   *
   */
  public void testOneTildeDot() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("1~.");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o~.e~.f~.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("org.example.foo.");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o~.e~.f~.", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - f~.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());


    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append(".");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - .", buf.toString());


    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("o.e.f.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o.e.f.bar", buf.toString());
  }

  /**
   * Check that getAbbreviator("1.*.2").abbreviate drops all but the first
   * character from the first element, uses all of the second element and
   * drops all but the first two characters of the rest of the non-final elements.
   *
   */
  public void testMulti() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("1.*.2");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o.example.fo.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("org.example.foo.");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - o.example.fo.", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - f.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append(".");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - .", buf.toString());
  }

  /**
   * Check that getAbbreviator("-1").abbreviate() drops first name element.
   *
   */
  public void testMinusOne() {
    NameAbbreviator abbrev = NameAbbreviator.getAbbreviator("-1");
    StringBuffer buf = new StringBuffer("DEBUG - ");
    int fieldStart = buf.length();
    buf.append("org.example.foo.bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - example.foo.bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append("bar");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - bar", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());

    buf.setLength(0);
    buf.append("DEBUG - ");
    fieldStart = buf.length();
    buf.append(".");
    abbrev.abbreviate(fieldStart, buf);
    assertEquals("DEBUG - ", buf.toString());

  }

}
