# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

JAVA_PKG_IUSE="doc source test"
JAVA_TESTING_FRAMEWORKS="testng"

inherit java-pkg-2 java-pkg-simple

# Presently we install the binary version of jquery since it is not packaged in ::gentoo.
JQV="3.7.1" # jquery
# These are used only for tests, we don't install them.
AGV="5.0.2" # groovyc compiler
GAV="3.0.22" # groovy
JCV="3.0.1" # jlibs-core, to be packaged
KCV="2.2.0" # kotlin-compiler

DESCRIPTION="Testing framework inspired by JUnit and NUnit with new features"
HOMEPAGE="https://testng.org/"
SRC_URI="https://github.com/testng-team/${PN}/archive/${PV}.tar.gz -> ${P}.tar.gz
	https://repo1.maven.org/maven2/org/webjars/jquery/${JQV}/jquery-${JQV}.jar
	test? (
		mirror://apache/groovy/${AGV}/distribution/apache-groovy-binary-${AGV}.zip
		https://github.com/JetBrains/kotlin/releases/download/v${KCV}/kotlin-compiler-${KCV}.zip
		https://repo1.maven.org/maven2/in/jlibs/jlibs-core/${JCV}/jlibs-core-${JCV}.jar
		https://repo1.maven.org/maven2/org/codehaus/groovy/groovy/${GAV}/groovy-${GAV}.jar
	)"
S="${WORKDIR}/${P}"

LICENSE="Apache-2.0"
SLOT="0"
KEYWORDS="~amd64"

BDEPEND="app-arch/unzip"

CP_DEPEND="
	>=dev-java/guice-7.0.0:0
	>=dev-java/jcommander-1.83:0
	dev-java/slf4j-api:0
	>=dev-java/snakeyaml-2.5:0
"

DEPEND="
	${CP_DEPEND}
	>=virtual/jdk-11:*
	test? (
		>=dev-java/assertj-core-3.27.6:0
		>=dev-java/bsh-2.1.1-r2:0
		>=dev-java/commons-io-2.20.0:0
		>=dev-java/guava-33.5.0:0
		>=dev-java/javax-inject-1-r4:0
		>=dev-java/jetbrains-annotations-26.0.2:0
		dev-java/junit:4
		>=dev-java/mockito-5.20.0:0
		>=dev-java/shrinkwrap-api-1.2.6:0
		>=dev-java/shrinkwrap-impl-base-1.2.6:0
		>=dev-java/slf4j-simple-2.0.3:0
		>=dev-java/xmlunit-core-2.11.0:0
	)
"

# reason: '<>' with anonymous inner classes is not supported in -source 8
#   (use -source 9 or higher to enable '<>' with anonymous inner classes)
RDEPEND="
	${CP_DEPEND}
	>=virtual/jre-11:*
	dev-java/jsr305:0
"

DOCS=( README.md {ANNOUNCEMENT,CHANGES}.txt )
PATCHES=(
	"${FILESDIR}/testng-7.11.0-skipDynamicDataProviderLoadingTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-ClassHelperTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-FailedInvocationCountTest.patch"	# needs network
	"${FILESDIR}/testng-7.11.0-SkipFrom-FailedReporterTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-GroovyTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-GuiceTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-HookableTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-JitBindingTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-ScriptTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-XmlSuiteTest.patch"
	"${FILESDIR}/testng-7.11.0-SkipFrom-YamlTest.patch"
)

JAVA_AUTOMATIC_MODULE_NAME="org.testng"
JAVA_MAIN_CLASS="org.testng.TestNG"
JAVA_RESOURCE_DIRS="testng-core/src/main/resources"
JAVA_SRC_DIR=(
	testng-asserts/src/main/java
	testng-collections/src/main/java
	testng-core-api/src/main/java
	testng-core/src/main/java
	testng-reflection-utils/src/main/java
	testng-runner-api/src/main/java
)

JAVA_TEST_EXTRA_ARGS=( -Dtest.resources.dir=src/test/resources )
JAVA_TEST_GENTOO_CLASSPATH="assertj-core bsh commons-io guice javax-inject jetbrains-annotations junit-4 mockito shrinkwrap-api shrinkwrap-impl-base slf4j-simple xmlunit-core"
JAVA_TEST_RESOURCE_DIRS="src/test/resources"
JAVA_TEST_RUN_ONLY="testng-core/src/test/resources/testng.xml"
JAVA_TEST_SRC_DIR=(
	testng-core/src/test
	testng-asserts/src/test
	testng-test-kit/src/main/java
#	testng-test-osgi/src/test/java # error: package org.ops4j.pax.exam does not exist
)

src_unpack () {
	# do not unpack anything except testng
	unpack "${P}.tar.gz"
}

src_prepare() {
	default # bug #780585
	java-pkg-2_src_prepare
	java-pkg_clean ! -path "./testng-core/src/test/*"
	mkdir -p src/test || die
	cp -vr testng-core/src/test/resources src/test || die "move test resources"
	mkdir -p build/resources/test || die
	cp {testng-core/src/test/resources,build/resources/test}/2532.xml || die
}

src_test() {
	# import org.netbeans.lib.profiler.heap.HeapFactory2 # error: unresolved reference 'HeapFactory2'
	# Tried with 'org-netbeans-lib-profiler-2.2.0.jar' which contains 'HeapFactory' but not 'HeapFactory2'.
	rm testng-core/src/test/kotlin/org/testng/dataprovider/DynamicDataProviderLoadingTest.kt || die
	# With a patch we also remove it from testng-core/src/test/resources/testng.xml

	# Removing the above file leads to:
	# import org.testng.dataprovider.DynamicDataProviderLoadingTest
	# error: unresolved reference 'DynamicDataProviderLoadingTest'.
	rm testng-core/src/test/kotlin/org/testng/dataprovider/sample/issue2724/SampleDPUnloaded.kt || die

	# Almost all tests want to 'import test.SimpleBaseTest;'. In the past this was
	# built from 'SimpleBaseTest.java' which was changed to 'SimpleBaseTest.kt'.

	# Step 1 creates a list of sources to be processed with 'kotlinc'
	# (the kotlin compiler), then lets it create the classes.
	unzip -q "${DISTDIR}/kotlin-compiler-${KCV}.zip" || die "unzip kotlin"
	local CP="${DISTDIR}/jlibs-core-${JCV}.jar"
	find ${JAVA_TEST_SRC_DIR[@]} \
		-type f \( -name '*.kt' -o -name '*.java' \) \
		> testng_kotlinc_sources || die "find for kotlinc"
	einfo "Running kotlinc"
	kotlinc/bin/kotlinc \
		-cp "${PN}.jar:${CP}:$(java-pkg_getjars --build-only assertj-core)" \
		-d generated-test @testng_kotlinc_sources || die "kotlinc"

	# Step 2 creates a few classes which are needed for processing '*.groovy' sources.
	find ${JAVA_TEST_SRC_DIR[@]} -type f -name 'InvokedMethodNameListener.java' \
		> testng_ejavac_sources || die "find"
	einfo "Running ejavac"
	ejavac \
		-cp "${PN}.jar:generated-test:$(java-pkg_getjars --build-only guava)" \
		-d generated-test @testng_ejavac_sources

	# Step 3 creates a list of '*.groovy' sources and passes it to
	# groovyc (the groovy compiler) for creating the classes.
	unzip -q "${DISTDIR}/apache-groovy-binary-${AGV}.zip" || die
	find ${JAVA_TEST_SRC_DIR[@]} -type f -name '*.groovy' \
		> testng_groovy_sources || die "find"
	einfo "Running groovyc"
	"groovy-${AGV}/bin/groovyc" \
		-cp generated-test:"$(java-pkg_getjars --build-only assertj-core)" \
		-d generated-test @testng_groovy_sources || die

	# Step 4 finally builds all remaining test-classes and runs the tests.
	JAVA_GENTOO_CLASSPATH_EXTRA="${DISTDIR}/groovy-${GAV}.jar"
	JAVA_GENTOO_CLASSPATH_EXTRA+=":kotlinc/lib/kotlin-stdlib.jar"
	JAVA_GENTOO_CLASSPATH_EXTRA+=":kotlinc/lib/kotlin-reflect.jar"
	JAVA_TEST_EXTRA_ARGS=( -Dtest.resources.dir=src/test/resources )
	java-pkg-simple_src_test
}

src_install() {
	java-pkg-simple_src_install

	java-pkg_newjar "${DISTDIR}/jquery-${JQV}.jar" jquery.jar
	java-pkg_regjar "${ED}/usr/share/${PN}/lib/jquery.jar"

	java-pkg_register-dependency jsr305
}