/*
 * Copyright 2016 DiffPlug
 *
 * Licensed 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 com.diffplug.spotless.java;

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

import com.diffplug.common.base.StringPrinter;
import com.diffplug.spotless.FormatterStep;
import com.diffplug.spotless.ResourceHarness;
import com.diffplug.spotless.SerializableEqualityTester;
import com.diffplug.spotless.StepHarness;
import com.diffplug.spotless.TestProvisioner;

public class GoogleJavaFormatStepTest extends ResourceHarness {
	@Test
	public void behavior() throws Exception {
		FormatterStep step = GoogleJavaFormatStep.create("1.2", TestProvisioner.mavenCentral());
		StepHarness.forStep(step)
				.testResource("java/googlejavaformat/JavaCodeUnformatted.test", "java/googlejavaformat/JavaCodeFormatted.test")
				.testResource("java/googlejavaformat/JavaCodeWithLicenseUnformatted.test", "java/googlejavaformat/JavaCodeWithLicenseFormatted.test")
				.testResource("java/googlejavaformat/JavaCodeWithLicensePackageUnformatted.test", "java/googlejavaformat/JavaCodeWithLicensePackageFormatted.test")
				.testResource("java/googlejavaformat/JavaCodeWithPackageUnformatted.test", "java/googlejavaformat/JavaCodeWithPackageFormatted.test");
	}

	@Test
	public void behaviorWithAospStyle() throws Exception {
		FormatterStep step = GoogleJavaFormatStep.create("1.2", "AOSP", TestProvisioner.mavenCentral());
		StepHarness.forStep(step)
				.testResource("java/googlejavaformat/JavaCodeUnformatted.test", "java/googlejavaformat/JavaCodeFormattedAOSP.test")
				.testResource("java/googlejavaformat/JavaCodeWithLicenseUnformatted.test", "java/googlejavaformat/JavaCodeWithLicenseFormattedAOSP.test")
				.testResource("java/googlejavaformat/JavaCodeWithLicensePackageUnformatted.test", "java/googlejavaformat/JavaCodeWithLicensePackageFormattedAOSP.test")
				.testResource("java/googlejavaformat/JavaCodeWithPackageUnformatted.test", "java/googlejavaformat/JavaCodeWithPackageFormattedAOSP.test");
	}

	@Test
	public void equality() throws Exception {
		new SerializableEqualityTester() {
			String version = "1.2";
			String style = "";

			@Override
			protected void setupTest(API api) {
				// same version == same
				api.areDifferentThan();
				// change the version, and it's different
				version = "1.1";
				api.areDifferentThan();
				// change the style, and it's different
				style = "AOSP";
				api.areDifferentThan();
			}

			@Override
			protected FormatterStep create() {
				String finalVersion = this.version;
				return GoogleJavaFormatStep.create(finalVersion, style, TestProvisioner.mavenCentral());
			}
		}.testEquals();
	}

	@Test
	public void fixWindowsBugForGfj1Point1() {
		fixWindowsBugTestcase("");
		fixWindowsBugTestcase(
				"",
				"import somepackage;",
				"");
		fixWindowsBugTestcase(
				"import somepackage;",
				"",
				"public class SomeClass {}");
		fixWindowsBugTestcase(
				"/** Some license */",
				"import somepackage;",
				"",
				"public class SomeClass {}");
		fixWindowsBugTestcase(
				"package thispackage;",
				"",
				"import somepackage;",
				"",
				"public class SomeClass {}");
		fixWindowsBugTestcase(
				"/*",
				" * A License.",
				" */",
				"",
				"package thispackage;",
				"",
				"import somepackage;",
				"",
				"public class SomeClass {}");
	}

	private void fixWindowsBugTestcase(String... lines) {
		String input = StringPrinter.buildStringFromLines(lines);
		Assert.assertEquals(input, GoogleJavaFormatStep.fixWindowsBug(input, "1.1"));
	}
}

@@ -762,16 +762,57 @@
 erStep;%0A
+import com.diffplug.spotless.JreVersion;%0A
 import c
@@ -1059,16 +1059,839 @@
 rness %7B%0A
+%09@Test%0A%09public void behavior18() throws Exception %7B%0A%09%09if (JreVersion.thisVm() == JreVersion._8) %7B%0A%09%09%09// google-java-format requires JRE 11+%0A%09%09%09return;%0A%09%09%7D%0A%09%09FormatterStep step = GoogleJavaFormatStep.create(%221.8%22, TestProvisioner.mavenCentral());%0A%09%09StepHarness.forStep(step)%0A%09%09%09%09.testResource(%22java/googlejavaformat/JavaCodeUnformatted.test%22, %22java/googlejavaformat/JavaCodeFormatted.test%22)%0A%09%09%09%09.testResource(%22java/googlejavaformat/JavaCodeWithLicenseUnformatted.test%22, %22java/googlejavaformat/JavaCodeWithLicenseFormatted.test%22)%0A%09%09%09%09.testResource(%22java/googlejavaformat/JavaCodeWithLicensePackageUnformatted.test%22, %22java/googlejavaformat/JavaCodeWithLicensePackageFormatted.test%22)%0A%09%09%09%09.testResource(%22java/googlejavaformat/JavaCodeWithPackageUnformatted.test%22, %22java/googlejavaformat/JavaCodeWithPackageFormatted.test%22);%0A%09%7D%0A%0A
 %09@Test%0A%09

Add test for google-java-format 1.8+, which is skipped on JRE 8.