/*
 * Copyright 2016-2020 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.maven;

import java.io.IOException;

import org.junit.Test;

public class SpecificFilesTest extends MavenIntegrationHarness {
	private String testFile(int number, boolean absolute) throws IOException {
		String rel = "src/main/java/test" + number + ".java";
		if (absolute) {
			return rootFolder() + "/" + rel;
		} else {
			return rel;
		}
	}

	private String testFile(int number) throws IOException {
		return testFile(number, false);
	}

	private String fixture(boolean formatted) {
		return "java/googlejavaformat/JavaCode" + (formatted ? "F" : "Unf") + "ormatted.test";
	}

	private void integration(String patterns, boolean firstFormatted, boolean secondFormatted, boolean thirdFormatted)
			throws IOException, InterruptedException {

		writePomWithJavaSteps(
				"<includes>",
				"  <include>src/**/java/**/*.java</include>",
				"</includes>",
				"<googleJavaFormat>",
				"  <version>1.2</version>",
				"</googleJavaFormat>");

		setFile(testFile(1)).toResource(fixture(false));
		setFile(testFile(2)).toResource(fixture(false));
		setFile(testFile(3)).toResource(fixture(false));

		mavenRunner()
				.withArguments("spotless:apply", "-DspotlessFiles=" + patterns)
				.runNoError();

		assertFile(testFile(1)).sameAsResource(fixture(firstFormatted));
		assertFile(testFile(2)).sameAsResource(fixture(secondFormatted));
		assertFile(testFile(3)).sameAsResource(fixture(thirdFormatted));
	}

	@Test
	public void singleFile() throws IOException, InterruptedException {
		integration(testFile(2, true), false, true, false);
	}

	@Test
	public void multiFile() throws IOException, InterruptedException {
		integration(testFile(1, true) + "," + testFile(3, true), true, false, true);
	}

	@Test
	public void regexp() throws IOException, InterruptedException {
		integration(".*/src/main/java/test\\(1\\|3\\).java", true, false, true);
	}
}

@@ -655,16 +655,71 @@
 ception;
+%0Aimport java.nio.file.Path;%0Aimport java.nio.file.Paths;
 %0A%0Aimport
@@ -933,16 +933,29 @@
 .java%22;%0A
+%09%09Path path;%0A
 %09%09if (ab
@@ -971,70 +971,334 @@
 %0A%09%09%09
-return rootFolder() + %22/%22 + rel;%0A%09%09%7D else %7B%0A%09%09%09return rel;%0A%09%09%7D
+path = Paths.get(rootFolder().getAbsolutePath(), rel);%0A%09%09%7D else %7B%0A%09%09%09path = Paths.get(rel);%0A%09%09%7D%0A%09%09String result = path.toString();%0A%09%09if (!isOnWindows()) %7B%0A%09%09%09return result;%0A%09%09%7D else %7B%0A%09%09%09return result.replace(%22%5C%5C%22, %22%5C%5C%5C%5C%22);%0A%09%09%7D%0A%09%7D%0A%0A%09private boolean isOnWindows() %7B%0A%09%09return System.getProperty(%22os.name%22).startsWith(%22Windows%22);
 %0A%09%7D%0A
@@ -2728,59 +2728,187 @@
 %7B%0A%09%09
-integration(%22.*/src/main/java/test%5C%5C(1%5C%5C%7C3%5C%5C).java%22
+String pattern;%0A%09%09if (isOnWindows())%0A%09%09%09pattern = %22%5C%22.*%5C%5C%5C%5Csrc%5C%5C%5C%5Cmain%5C%5C%5C%5Cjava%5C%5C%5C%5Ctest(1%7C3).java%5C%22%22;%0A%09%09else%0A%09%09%09pattern = %22'.*/src/main/java/test(1%7C3).java'%22;%0A%09%09integration(pattern
 , tr

Fix spotlessFiles parameter tests