/*
 * Copyright (C) 2009, Google Inc. and others
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Distribution License v. 1.0 which is available at
 * https://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

package org.eclipse.jgit.util;

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

import org.junit.Test;

public class StringUtilsTest {
	@Test
	public void testToLowerCaseChar() {
		assertEquals('a', StringUtils.toLowerCase('A'));
		assertEquals('z', StringUtils.toLowerCase('Z'));

		assertEquals('a', StringUtils.toLowerCase('a'));
		assertEquals('z', StringUtils.toLowerCase('z'));

		assertEquals((char) 0, StringUtils.toLowerCase((char) 0));
		assertEquals((char) 0xffff, StringUtils.toLowerCase((char) 0xffff));
	}

	@Test
	public void testToLowerCaseString() {
		assertEquals("\n abcdefghijklmnopqrstuvwxyz\n", StringUtils
				.toLowerCase("\n ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"));
	}

	@Test
	public void testEqualsIgnoreCase1() {
		final String a = "FOO";
		assertTrue(StringUtils.equalsIgnoreCase(a, a));
	}

	@Test
	public void testEqualsIgnoreCase2() {
		assertFalse(StringUtils.equalsIgnoreCase("a", ""));
	}

	@Test
	public void testEqualsIgnoreCase3() {
		assertFalse(StringUtils.equalsIgnoreCase("a", "b"));
		assertFalse(StringUtils.equalsIgnoreCase("ac", "ab"));
	}

	@Test
	public void testEqualsIgnoreCase4() {
		assertTrue(StringUtils.equalsIgnoreCase("a", "a"));
		assertTrue(StringUtils.equalsIgnoreCase("A", "a"));
		assertTrue(StringUtils.equalsIgnoreCase("a", "A"));
	}

	@Test
	public void testReplaceLineBreaks() {
		assertEquals("a b c ",
				StringUtils.replaceLineBreaksWithSpace("a b\nc\r"));
		assertEquals("a b c ",
				StringUtils.replaceLineBreaksWithSpace("a b\nc\n"));
		assertEquals("a b c ",
				StringUtils.replaceLineBreaksWithSpace("a b\nc\r\n"));
		assertEquals("a b c d",
				StringUtils.replaceLineBreaksWithSpace("a\r\nb\nc d"));
	}

	@Test
	public void testFormatWithSuffix() {
		assertEquals("1023", StringUtils.formatWithSuffix(1023));
		assertEquals("1k", StringUtils.formatWithSuffix(1024));
		assertEquals("1025", StringUtils.formatWithSuffix(1025));
		assertEquals("1048575", StringUtils.formatWithSuffix(1024 * 1024 - 1));
		assertEquals("1m", StringUtils.formatWithSuffix(1024 * 1024));
		assertEquals("1048577", StringUtils.formatWithSuffix(1024 * 1024 + 1));
		assertEquals("1073741823",
				StringUtils.formatWithSuffix(1024 * 1024 * 1024 - 1));
		assertEquals("1g", StringUtils.formatWithSuffix(1024 * 1024 * 1024));
		assertEquals("1073741825",
				StringUtils.formatWithSuffix(1024 * 1024 * 1024 + 1));
		assertEquals("3k", StringUtils.formatWithSuffix(3 * 1024));
		assertEquals("3m", StringUtils.formatWithSuffix(3 * 1024 * 1024));
		assertEquals("2050k",
				StringUtils.formatWithSuffix(2 * 1024 * 1024 + 2048));
		assertEquals("3g",
				StringUtils.formatWithSuffix(3L * 1024 * 1024 * 1024));
		assertEquals("3000", StringUtils.formatWithSuffix(3000));
		assertEquals("3000000", StringUtils.formatWithSuffix(3_000_000));
		assertEquals("1953125k", StringUtils.formatWithSuffix(2_000_000_000));
		assertEquals("2000000010", StringUtils.formatWithSuffix(2_000_000_010));
		assertEquals("3000000000",
				StringUtils.formatWithSuffix(3_000_000_000L));
	}

	@Test
	public void testParseWithSuffix() {
		assertEquals(1024, StringUtils.parseIntWithSuffix("1k", true));
		assertEquals(1024, StringUtils.parseIntWithSuffix("1 k", true));
		assertEquals(1024, StringUtils.parseIntWithSuffix("1  k", true));
		assertEquals(1024, StringUtils.parseIntWithSuffix(" \t1  k  \n", true));
		assertEquals(1024, StringUtils.parseIntWithSuffix("1k", false));
		assertEquals(1024, StringUtils.parseIntWithSuffix("1K", false));
		assertEquals(1024 * 1024, StringUtils.parseIntWithSuffix("1m", false));
		assertEquals(1024 * 1024, StringUtils.parseIntWithSuffix("1M", false));
		assertEquals(-1024 * 1024,
				StringUtils.parseIntWithSuffix("-1M", false));
		assertEquals(1_000_000,
				StringUtils.parseIntWithSuffix("  1000000\r\n", false));
		assertEquals(1024 * 1024 * 1024,
				StringUtils.parseIntWithSuffix("1g", false));
		assertEquals(1024 * 1024 * 1024,
				StringUtils.parseIntWithSuffix("1G", false));
		assertEquals(3L * 1024 * 1024 * 1024,
				StringUtils.parseLongWithSuffix("3g", false));
		assertEquals(3L * 1024 * 1024 * 1024,
				StringUtils.parseLongWithSuffix("3G", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseIntWithSuffix("2G", false));
		assertEquals(2L * 1024 * 1024 * 1024,
				StringUtils.parseLongWithSuffix("2G", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("-1m", true));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("-1000", true));
		assertThrows(StringIndexOutOfBoundsException.class,
				() -> StringUtils.parseLongWithSuffix("", false));
		assertThrows(StringIndexOutOfBoundsException.class,
				() -> StringUtils.parseLongWithSuffix("   \t   \n", false));
		assertThrows(StringIndexOutOfBoundsException.class,
				() -> StringUtils.parseLongWithSuffix("k", false));
		assertThrows(StringIndexOutOfBoundsException.class,
				() -> StringUtils.parseLongWithSuffix("m", false));
		assertThrows(StringIndexOutOfBoundsException.class,
				() -> StringUtils.parseLongWithSuffix("g", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("1T", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("1t", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("Nonumber", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("0x001f", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("beef", false));
		assertThrows(NumberFormatException.class,
				() -> StringUtils.parseLongWithSuffix("8000000000000000000G",
						false));
	}

	@Test
	public void testCommonPrefix() {
		assertEquals("", StringUtils.commonPrefix((String[]) null));
		assertEquals("", StringUtils.commonPrefix(new String[] {}));
		assertEquals("", StringUtils.commonPrefix(new String[] { null }));
		assertEquals("", StringUtils.commonPrefix(null, null));
		assertEquals("", StringUtils.commonPrefix("", ""));
		assertEquals("", StringUtils.commonPrefix(null, ""));
		assertEquals("", StringUtils.commonPrefix("abcd", null, null));
		assertEquals("", StringUtils.commonPrefix(null, null, "abcd"));
		assertEquals("", StringUtils.commonPrefix("", "abcd"));
		assertEquals("", StringUtils.commonPrefix("abcd", "efgh"));
		assertEquals("abcd", StringUtils.commonPrefix("abcd"));
		assertEquals("ab", StringUtils.commonPrefix("abcd", "ab"));
		assertEquals("abcd", StringUtils.commonPrefix("abcd", "abcdefgh"));
		assertEquals("foo bar ",
				StringUtils.commonPrefix("foo bar 42", "foo bar 24"));
	}
}
