/*******************************************************************************
 * Copyright (c) 2019 Christian Pontesegger and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     Christian Pontesegger - initial API and implementation
 *******************************************************************************/

package org.eclipse.ease.helpgenerator;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import org.junit.Test;

public class IntegrationTestJava5API {

	private static int buildDocs(boolean failOnHtmlError, boolean failOnMissingDocs, String packageName) {
		// @formatter:off
		return com.sun.tools.javadoc.Main.execute(new String[] {
				"-sourcepath", new File("./resources/org.eclipse.ease.helpgenerator.testproject/src").getAbsolutePath(),
				"-root", new File("./resources/org.eclipse.ease.helpgenerator.testproject").getAbsolutePath(),
				"-doclet", ModuleDoclet.class.getName(),
				"-docletpath",  new File("./target/classes").getAbsolutePath(),

				"-failOnHTMLError", Boolean.toString(failOnHtmlError),
				"-failOnMissingDocs", Boolean.toString(failOnMissingDocs),

				"-link", "https://docs.oracle.com/javase/8/docs/api",

				packageName
		});
		// @formatter:on
	}

	@Test
	public void validModule() {
		assertEquals(0, buildDocs(true, true, "org.eclipse.ease.helpgenerator.testproject.valid"));
	}

	@Test
	public void invalidXMLIgnoreErrors() {
		assertEquals(0, buildDocs(false, false, "org.eclipse.ease.helpgenerator.testproject.invalidxml"));
	}

	@Test
	public void invalidXMLShouldFail() {
		assertEquals(1, buildDocs(true, false, "org.eclipse.ease.helpgenerator.testproject.invalidxml"));
	}

	@Test
	public void missingDocsIgnoreErrors() {
		assertEquals(0, buildDocs(false, false, "org.eclipse.ease.helpgenerator.testproject.missingdocs"));
	}

	@Test
	public void missingDocsShouldFail() {
		assertEquals(1, buildDocs(false, true, "org.eclipse.ease.helpgenerator.testproject.missingdocs"));
	}

	@Test
	public void verifyContent() throws IOException {
		buildDocs(true, true, "org.eclipse.ease.helpgenerator.testproject.valid");
		String expected = new String(
				Files.readAllBytes(new File("./resources/expected_module_org.eclipse.ease.helpgenerator.testproject.module1.html").toPath()));
		expected = expected.replaceAll("\r", "");

		final String actual = new String(Files.readAllBytes(
				new File("./resources/org.eclipse.ease.helpgenerator.testproject/help/module_org.eclipse.ease.helpgenerator.testproject.module1.html")
						.toPath()));

		assertEquals(expected, actual);
	}
}
