/*******************************************************************************
 * Copyright (c) 2014 Leo Ufimtsev and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Leo Ufimtsev - initial API and implementation
 *******************************************************************************/
package org.eclipse.releng.tests.tools;

import static org.junit.Assert.assertTrue;

import org.eclipse.releng.tools.AdvancedCopyrightComment;
import org.eclipse.releng.tools.BlockComment;
import org.eclipse.releng.tools.CopyrightComment;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;


/**
 * <h1> Parse Tests </h1>
 *
 * <p> Test that year is updated correctly by the comment parser. <br>
 * This can be ran as a standard Junit4 test or as a Plugin Test </p>
 */
public class AdvancedCopyrightCommentTestsJunit4 {

	//to get name of test cases on the fly.
	@Rule public TestName name = new TestName();

	/**
	 * verify that standard comment will have the new year appended to it
	 */
	@Test
	public void singleYearComment() {
		String original = "<!--\n" +
				"    Copyright (c) 2000 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		//Last year updated to 2015
		String expectedOut = "<!--\n" +
				"    Copyright (c) 2000, 2015 IBM Corporation and others.  \n" +  //<<<< Note appended 2015
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015, expectedOut));
	}


	/**
	 * verify standard two year comments work correctly 2000, 2014
	 */
	@Test
	public void twoYearCommentCommaSeperated() {
		String original = "<!--\n" +
				"    Copyright (c) 2000, 2014 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		//Last year updated to 2015
		String expectedOut = "<!--\n" +
				"    Copyright (c) 2000, 2015 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015, expectedOut));
	}

	/**
	 * verify standard two year comments work correctly 2000 - 2014 <br>
	 * It should also handle dashes as well as commas.
	 */
	@Test
	public void twoYearCommentDashSeperated() {
		String original = "<!--\n" +
				"    Copyright (c) 2000 - 2014 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		//Last year updated to 2015
		String expectedOut = "<!--\n" +
				"    Copyright (c) 2000 - 2015 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015, expectedOut));
	}



	/**
	 * Verify that comments with multiple years are handled correctly.
	 */
	@Test
	public void multiYearComment() {
		String original = "<!--\n" +
				"    Copyright (c) 2000, 2011-2012, 2014 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		//Last year updated to 2015
		String expectedOut = "<!--\n" +
				"    Copyright (c) 2000, 2011-2012, 2015 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015, expectedOut));
	}


	/**
	 * Verify that newline at the end is copied across to the new comment correctly.
	 */
	@Test
	public void multiYearCommentNewlinePost() {
		String original = "<!--\n" +
				"    Copyright (c) 2000, 2011-2012, 2014 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->\n"; // NOTE new line char here.

		//
		String expectedOut = "<!--\n" +
				"    Copyright (c) 2000, 2011-2012, 2015 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->\n";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}

	/**
	 * Verify that newline at the beginning is copied across to the new comment correctly.
	 */
	@Test
	public void multiYearCommentNewlinePre() {
		String original = "\n<!--\n" + // NOTE new line char here.
				"    Copyright (c) 2000, 2011-2012, 2014 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		//
		String expectedOut = "\n<!--\n" +
				"    Copyright (c) 2000, 2011-2012, 2015 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}


	/**
	 * Check with Unix delimiters.
	 */
	@Test
	public void unixDelimiters() {
		String original = "<!--\n" +
				"    Copyright (c) 2000, 2014 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		//Last year updated to 2015
		String expectedOut = "<!--\n" +
				"    Copyright (c) 2000, 2015 IBM Corporation and others.  \n" +
				"    All rights reserved. This program and the accompanying materials\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\n" +
				"    which accompanies this distribution, and is available at\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\n" +
				"   \n" +
				"    Contributors:\n" +
				"        IBM Corporation - initial API and implementation\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}

	/**
	 * Check with windows delimiters. {@code \r\n}
	 */
	@Test
	public void windowsDelimiters() {
		String original = "<!--\r\n" + // NOTE new line char here.
				"    Copyright (c) 2000, 2014 IBM Corporation and others.  \r\n" +
				"    All rights reserved. This program and the accompanying materials \r\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\r\n" +
				"    which accompanies this distribution, and is available at\r\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\r\n" +
				"   \r\n" +
				"    Contributors:\r\n" +
				"        IBM Corporation - initial API and implementation\r\n" +
				" -->";

		String expectedOut = "<!--\r\n" + // NOTE new line char here.
				"    Copyright (c) 2000, 2015 IBM Corporation and others.  \r\n" +
				"    All rights reserved. This program and the accompanying materials \r\n" +
				"    are made available under the terms of the Eclipse Public License v1.0\r\n" +
				"    which accompanies this distribution, and is available at\r\n" +
				"    http://www.eclipse.org/legal/epl-v10.html\r\n" +
				"   \r\n" +
				"    Contributors:\r\n" +
				"        IBM Corporation - initial API and implementation\r\n" +
				" -->";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}

	/**
	 * the tool should work with the official header.
	 * https://www.eclipse.org/legal/copyrightandlicensenotice.php
	 */
	@Test
	public void eclipseCopyrightComment() {
		String original =
				"    /*******************************************************************************\n" +
				"     * Copyright (c) 2000 {INITIAL COPYRIGHT OWNER} {OTHER COPYRIGHT OWNERS}.\n" +
				"     * All rights reserved. This program and the accompanying materials\n" +
				"     * are made available under the terms of the Eclipse Public License v1.0\n" +
				"     * which accompanies this distribution, and is available at\n" +
				"     * http://www.eclipse.org/legal/epl-v10.html\n" +
				"     *\n" +
				"     * Contributors:\n" +
				"     *    {INITIAL AUTHOR} - initial API and implementation and/or initial documentation\n" +
				"     *******************************************************************************/";

		String expectedOut =
				"    /*******************************************************************************\n" +
				"     * Copyright (c) 2000, 2015 {INITIAL COPYRIGHT OWNER} {OTHER COPYRIGHT OWNERS}.\n" +
				"     * All rights reserved. This program and the accompanying materials\n" +
				"     * are made available under the terms of the Eclipse Public License v1.0\n" +
				"     * which accompanies this distribution, and is available at\n" +
				"     * http://www.eclipse.org/legal/epl-v10.html\n" +
				"     *\n" +
				"     * Contributors:\n" +
				"     *    {INITIAL AUTHOR} - initial API and implementation and/or initial documentation\n" +
				"     *******************************************************************************/";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}

	/**
	 * the tool should work with IBM headers.
	 * https://www.eclipse.org/legal/copyrightandlicensenotice.php
	 */
	@Test
	public void ibmCopyrightComment() {
		String original =
				"Copyright (c) 2000, 2010 IBM Corporation. \n" +
				"All rights reserved. This program and the accompanying materials \n" +
				"are made available under the terms of the Eclipse Public License v1.0 \n" +
				"which accompanies this distribution, and is available at \n" +
				"http://www.eclipse.org/legal/epl-v10.html  \n" +
				"\n" +
				"Contributors: \n" +
				"   IBM Corporation - initial API and implementation";

		String expectedOut =
				"Copyright (c) 2000, 2015 IBM Corporation. \n" +
				"All rights reserved. This program and the accompanying materials \n" +
				"are made available under the terms of the Eclipse Public License v1.0 \n" +
				"which accompanies this distribution, and is available at \n" +
				"http://www.eclipse.org/legal/epl-v10.html  \n" +
				"\n" +
				"Contributors: \n" +
				"   IBM Corporation - initial API and implementation";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}



	/**
	 * the tool should work with non-IBM copy right comments as well. <br>.
	 * for the purpose, a random realistic comment was extracted.
	 */
	@Test
	public void redHatCopyrightComment() {
		String original =
				"    /*******************************************************************************\n" +
				"     * Copyright (c) 2004, 2008, 2009, 2012 Red Hat, Inc. and others\n" +
				"     * All rights reserved. This program and the accompanying materials\n" +
				"     * are made available under the terms of the Eclipse Public License v1.0\n" +
				"     * which accompanies this distribution, and is available at\n" +
				"     * http://www.eclipse.org/legal/epl-v10.html\n" +
				"     *\n" +
				"     * Contributors:\n" +
				"     *    Kent Sebastian <ksebasti@redhat.com> - initial API and implementation\n" +
				"     *    Keith Seitz <keiths@redhat.com> - setup code in launch the method, initially\n" +
				"     *        written in the now-defunct OprofileSession class\n" +
				"     *    QNX Software Systems and others - the section of code marked in the launch\n" +
				"     *        method, and the exec method\n" +
				"     *    Lev Ufimtsev <lufimtse@redhat.com> --Added automatical enablement of options\n" +
				"     *                                         if thery are not set.\n" +
				"     *    Red Hat Inc. - modification of OProfileLaunchConfigurationDelegate to here\n" +
				"     *******************************************************************************/";

		String expectedOut =
				"    /*******************************************************************************\n" +
				"     * Copyright (c) 2004, 2008, 2009, 2015 Red Hat, Inc. and others\n" +
				"     * All rights reserved. This program and the accompanying materials\n" +
				"     * are made available under the terms of the Eclipse Public License v1.0\n" +
				"     * which accompanies this distribution, and is available at\n" +
				"     * http://www.eclipse.org/legal/epl-v10.html\n" +
				"     *\n" +
				"     * Contributors:\n" +
				"     *    Kent Sebastian <ksebasti@redhat.com> - initial API and implementation\n" +
				"     *    Keith Seitz <keiths@redhat.com> - setup code in launch the method, initially\n" +
				"     *        written in the now-defunct OprofileSession class\n" +
				"     *    QNX Software Systems and others - the section of code marked in the launch\n" +
				"     *        method, and the exec method\n" +
				"     *    Lev Ufimtsev <lufimtse@redhat.com> --Added automatical enablement of options\n" +
				"     *                                         if thery are not set.\n" +
				"     *    Red Hat Inc. - modification of OProfileLaunchConfigurationDelegate to here\n" +
				"     *******************************************************************************/";

		assertTrue(proccessAndCompare(original, 2015,expectedOut));
	}







	/**
	 * We test the AdvancedCopyrightComment parse(..) function.
	 *
	 * @param original  original comment
	 * @param reviseTo  year to which it should be updated to
	 * @param expected  expected updated comment.
	 * @return          true if modified original matches expected.
	 */
	private boolean proccessAndCompare(String original, int reviseTo, String expected) {

		//For our purposes, start/end line & start/end comment don't matter.
		BlockComment commentBlock = new BlockComment(0, 0, original, null, null);

		//Proccess input string.
		AdvancedCopyrightComment advComment = AdvancedCopyrightComment.parse(commentBlock,CopyrightComment.XML_COMMENT);

		advComment.setRevisionYear(reviseTo);

		//get updated comment.
		String actual = advComment.getCopyrightComment();

		//see if they are the same.
		boolean areSame = expected.equals(actual);

		//if tests differ, print onto console for inspection.
		if (! areSame) {
			printBadTest(original, expected, actual);
		}

		return areSame;
	}

	private void printBadTest(String original, String expected, String actual) {
		System.out.println("");
		System.out.println("----------------------------------------------");
		System.out.println("-------ERROR in test: " + name.getMethodName());
		System.out.println("----------------------------------------------");
		System.out.println("----- Original:");
		System.out.println(original);
		System.out.println("----- Expected:");
		System.out.println(expected);
		System.out.println("----- Actual: ");
		System.out.println(actual);
		System.out.println("##############################################");
	}


}
