/*
 * Copyright (C) 2012, Google Inc.
 * and other copyright owners as documented in the project's IP log.
 *
 * This program and the accompanying materials are made available
 * under the terms of the Eclipse Distribution License v1.0 which
 * accompanies this distribution, is reproduced below, and is
 * available at http://www.eclipse.org/org/documents/edl-v10.php
 *
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following
 * conditions are met:
 *
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above
 *   copyright notice, this list of conditions and the following
 *   disclaimer in the documentation and/or other materials provided
 *   with the distribution.
 *
 * - Neither the name of the Eclipse Foundation, Inc. nor the
 *   names of its contributors may be used to endorse or promote
 *   products derived from this software without specific prior
 *   written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.eclipse.jgit.http.server;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.eclipse.jgit.http.server.ClientVersionUtil.hasPushStatusBug;
import static org.eclipse.jgit.http.server.ClientVersionUtil.invalidVersion;
import static org.eclipse.jgit.http.server.ClientVersionUtil.parseVersion;

import org.junit.Assert;
import org.junit.Test;

public class ClientVersionUtilTest {
	@Test
	public void testParse() {
		assertEquals("1.6.5", parseVersion("git/1.6.6-rc0"));
		assertEquals("1.6.6", parseVersion("git/1.6.6"));
		assertEquals("1.7.5", parseVersion("git/1.7.5.GIT"));
		assertEquals("1.7.6.1", parseVersion("git/1.7.6.1.45.gbe0cc"));

		assertEquals("1.5.4.3", parseVersion("git/1.5.4.3,gzip(proxy)"));
		assertEquals("1.7.0.2", parseVersion("git/1.7.0.2.msysgit.0.14.g956d7,gzip"));
		assertEquals("1.7.10.2", parseVersion("git/1.7.10.2 (Apple Git-33)"));

		assertEquals(ClientVersionUtil.toString(invalidVersion()), parseVersion("foo"));
	}

	@Test
	public void testPushStatusBug() {
		assertTrue(hasPushStatusBug(parseVersion("git/1.6.6")));
		assertTrue(hasPushStatusBug(parseVersion("git/1.6.6.1")));
		assertTrue(hasPushStatusBug(parseVersion("git/1.7.9")));

		assertFalse(hasPushStatusBug(parseVersion("git/1.7.8.6")));
		assertFalse(hasPushStatusBug(parseVersion("git/1.7.9.1")));
		assertFalse(hasPushStatusBug(parseVersion("git/1.7.9.2")));
		assertFalse(hasPushStatusBug(parseVersion("git/1.7.10")));
	}

	private static void assertEquals(String exp, int[] act) {
		Assert.assertEquals(exp, ClientVersionUtil.toString(act));
	}
}
