apply plugin: 'java'
apply plugin: 'eclipse'

jar {
	manifest {
		attributes 'Implementation-Title': 'PDF-AS-4 Test Library', 'JARMANIFEST': 'PDF-AS-LIB'
	}
}

repositories {	
	mavenLocal()
	mavenCentral()
	maven { url "https://repository.jboss.org/maven2/" }
	maven { url "http://anonsvn.icesoft.org/repo/maven2/releases/" }
	maven { url "https://repository.jboss.org/nexus/content/repositories/thirdparty-releases/" }
	
}

configurations{
	pdfBox2Compile
}

sourceSets{
	pdfBox2{
		compileClasspath = configurations.pdfBox2Compile
	}
}

dependencies {
	implementation project (':pdf-as-lib')
	testImplementation project (':pdf-as-moa')
	
	implementation project (':signature-standards:sigs-pkcs7detached')
	implementation project (':signature-standards:sigs-pades')

	implementation group: 'org.slf4j', name: 'slf4j-api', version: '1.7.7'
	implementation group: 'javax.activation', name: 'activation', version: '1.1.1'

	testImplementation group: 'junit', name: 'junit', version: '4.12'
	testImplementation group: 'org.icepdf.os', name: 'icepdf-core', version: '6.1.1'

	implementation project (':pdf-as-pdfbox-2')
	//compile group: 'org.apache.pdfbox', name: 'preflight', version: '2.0.21'
	//compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.21'
	//compile group: 'org.apache.pdfbox', name: 'pdfbox-tools', version: '2.0.21'

}


logger.info("Building tasks for Test suites")
def suiteDir = new File(projectDir, "src/test/test-suites")
logger.info("Searching: " + suiteDir.absolutePath)

//Eclipse UI shows an error because source set dependencies are not recognized, so we add the dependencies manually
//eclipse.classpath.plusConfigurations+=[configurations.pdfBox1Compile]

suiteDir.eachDir {	File subDir ->
	def dirname = subDir.name
	logger.info("Test Suite " + subDir.name + " found in " + subDir.absolutePath)

	task "runTestSuite${dirname.capitalize()}"(type: Test) {

		description "runs tests from Test Suite: " + dirname
		systemProperties 'test.dir': subDir.absolutePath

		if(dirname =="public_pdfbox2"){
			classpath += sourceSets.pdfBox2.compileClasspath
			compileTestJava.classpath += sourceSets.pdfBox2.compileClasspath
		}

		include '**/ParameterizedSignatureTestSuite.class'

		beforeSuite { TestDescriptor descriptor ->

			if(descriptor.getParent() == null) {
				logger.quiet("++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
			}
			if(descriptor.getClassName().equals("at.gv.egiz.param_tests.ParameterizedSignatureTestSuite")) {
				logger.quiet("Starting suite: " + dirname + " (" + descriptor.getName() + ")")
			}
		}

		afterSuite { TestDescriptor descriptor, TestResult result ->
			if(descriptor.getClassName().equals("at.gv.egiz.param_tests.ParameterizedSignatureTestSuite")) {
				logger.quiet("------------------");
				logger.quiet("Ending suite: " + dirname);
				logger.quiet("\tResult (SUCCESS/ERROR/SKIPPED/TOTAL): " +
					result.getSuccessfulTestCount() + "/" +
					result.getFailedTestCount() + "/" +
					result.getSkippedTestCount() + "/" +
					result.getTestCount());
				float duration_ms = result.getEndTime() - result.getStartTime()
				float duration_sec = duration_ms / 1000.0f
				logger.quiet("\tDuration: " + duration_sec + " s [" + duration_ms + " ms]")
				logger.quiet("\tReport @ file://" + subDir.absolutePath + "/index.html")
			}
			if(descriptor.getParent() == null) {
				logger.quiet("++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
			}
		}

		beforeTest { TestDescriptor descriptor ->
			logger.quiet("------------------");
			logger.info("Running test: " + descriptor.getName())
		}

		afterTest { TestDescriptor descriptor, TestResult result ->
			float duration_ms = result.getEndTime() - result.getStartTime()
			float duration_sec = duration_ms / 1000.0f
			logger.quiet(result.getResultType().toString() + " => [" + 
				descriptor.getName() + "] took " + duration_sec + " s [" + duration_ms + " ms]")
			if(TestResult.ResultType.FAILURE.equals(result.getResultType())) {
				if(result.getException() != null) {
					logger.error("Failed test: " + result.getException().getMessage());
					result.getException().printStackTrace();
				} else {
					logger.error("Failed test provided no exception");
				}
			}
		}
		

	}


	test.dependsOn tasks.getByPath("runTestSuite${dirname.capitalize()}")
	
	

	task "cleanTestSuite${dirname.capitalize()}"(type: Delete) {
		outputs.upToDateWhen { false }
		delete fileTree (dir: subDir.absolutePath, include: "index.html")
		delete fileTree (dir: subDir.absolutePath, include: "**/test_result.html")
	}
	
	task "cleanOutFolders${dirname.capitalize()}"() {
		doLast {
			subDir.eachDir { File tcDir -> 
				File outDir = new File(tcDir, "out");
				if(outDir.exists() && outDir.isDirectory()) {
					outDir.eachFileRecurse { File mfile -> 
						mfile.delete()
					}
					outDir.delete()
				}
			}
		}
	}
	
	clean.dependsOn tasks.getByPath("cleanOutFolders${dirname.capitalize()}")
	clean.dependsOn tasks.getByPath("cleanTestSuite${dirname.capitalize()}")
}

tasks.getByPath(":pdf-as-lib:test").dependsOn test

test {
	include '**/DummyTest.class'

	beforeTest { TestDescriptor descriptor ->
		logger.quiet("------------------");
		logger.quiet("Running test: " + descriptor.getName())
	}

	afterTest { TestDescriptor descriptor, TestResult result ->
		logger.quiet("Ending test: " + descriptor.getName() + " result " + result)
	}
	
}