# Copyright 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="junit-4"

inherit java-pkg-2 java-pkg-simple

MCV="1.10.19"
DESCRIPTION="Property-based testing, JUnit-style"
HOMEPAGE="https://github.com/pholser/junit-quickcheck"
SRC_URI="https://github.com/pholser/junit-quickcheck/archive/${P}.tar.gz
	test? ( https://repo1.maven.org/maven2/org/mockito/mockito-core/${MCV}/mockito-core-${MCV}.jar )"
S="${WORKDIR}/junit-quickcheck-${P}"

LICENSE="MIT"
SLOT="0"
KEYWORDS="~amd64 ~arm64"

CP_DEPEND="
	dev-java/generics-resolver:0
	dev-java/javaruntype:0
	dev-java/junit:4
	dev-java/ognl:0
	dev-java/slf4j-api:0
"

DEPEND="
	${CP_DEPEND}
	>=virtual/jdk-1.8:*
	test? (
		dev-java/antlr-runtime:3.5
		>=dev-java/guava-testlib-33.4.8:0
		>=dev-java/hamcrest-3.0:0
		>=dev-java/javassist-3.30.2:3
		>=dev-java/objenesis-3.4:0
	)
"

RDEPEND="
	${CP_DEPEND}
	>=virtual/jre-1.8:*
"

JAVADOC_SRC_DIRS=( {core,generators}/src/main/java )

src_prepare() {
	java-pkg-2_src_prepare
	local services="generators/src/main/resources/META-INF/services"
	mkdir -p "${services}"
	cat > "${services}/com.pholser.junit.quickcheck.generator.Generator" <<-EOF || die "here doc"
		com.pholser.junit.quickcheck.generator.java.util.ArrayListGenerator
		com.pholser.junit.quickcheck.generator.java.util.HashSetGenerator
		com.pholser.junit.quickcheck.generator.java.util.LocaleGenerator
		com.pholser.junit.quickcheck.generator.java.util.LinkedListGenerator
		com.pholser.junit.quickcheck.generator.java.util.StackGenerator
		com.pholser.junit.quickcheck.generator.java.util.OptionalDoubleGenerator
		com.pholser.junit.quickcheck.generator.java.util.DateGenerator
		com.pholser.junit.quickcheck.generator.java.util.LinkedHashMapGenerator
		com.pholser.junit.quickcheck.generator.java.util.OptionalLongGenerator
		com.pholser.junit.quickcheck.generator.java.util.TimeZoneGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.FunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.UnaryOperatorGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.ToIntBiFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.PredicateGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.BinaryOperatorGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.BiPredicateGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.ToIntFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.ToDoubleFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.ToLongBiFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.BiFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.IntFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.ToLongFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.DoubleFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.SupplierGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.LongFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.function.ToDoubleBiFunctionGenerator
		com.pholser.junit.quickcheck.generator.java.util.BitSetGenerator
		com.pholser.junit.quickcheck.generator.java.util.OptionalIntGenerator
		com.pholser.junit.quickcheck.generator.java.util.HashMapGenerator
		com.pholser.junit.quickcheck.generator.java.util.VectorGenerator
		com.pholser.junit.quickcheck.generator.java.util.PropertiesGenerator
		com.pholser.junit.quickcheck.generator.java.util.OptionalGenerator
		com.pholser.junit.quickcheck.generator.java.util.concurrent.CallableGenerator
		com.pholser.junit.quickcheck.generator.java.util.RFC4122\$Version4
		com.pholser.junit.quickcheck.generator.java.util.HashtableGenerator
		com.pholser.junit.quickcheck.generator.java.util.LinkedHashSetGenerator
		com.pholser.junit.quickcheck.generator.java.util.RFC4122\$Version3
		com.pholser.junit.quickcheck.generator.java.util.RFC4122\$Version5
		com.pholser.junit.quickcheck.generator.java.math.BigDecimalGenerator
		com.pholser.junit.quickcheck.generator.java.math.BigIntegerGenerator
		com.pholser.junit.quickcheck.generator.java.time.ZonedDateTimeGenerator
		com.pholser.junit.quickcheck.generator.java.time.LocalDateGenerator
		com.pholser.junit.quickcheck.generator.java.time.OffsetTimeGenerator
		com.pholser.junit.quickcheck.generator.java.time.ZoneIdGenerator
		com.pholser.junit.quickcheck.generator.java.time.PeriodGenerator
		com.pholser.junit.quickcheck.generator.java.time.YearMonthGenerator
		com.pholser.junit.quickcheck.generator.java.time.InstantGenerator
		com.pholser.junit.quickcheck.generator.java.time.LocalDateTimeGenerator
		com.pholser.junit.quickcheck.generator.java.time.OffsetDateTimeGenerator
		com.pholser.junit.quickcheck.generator.java.time.DurationGenerator
		com.pholser.junit.quickcheck.generator.java.time.YearGenerator
		com.pholser.junit.quickcheck.generator.java.time.ClockGenerator
		com.pholser.junit.quickcheck.generator.java.time.ZoneOffsetGenerator
		com.pholser.junit.quickcheck.generator.java.time.LocalTimeGenerator
		com.pholser.junit.quickcheck.generator.java.time.MonthDayGenerator
		com.pholser.junit.quickcheck.generator.java.lang.ShortGenerator
		com.pholser.junit.quickcheck.generator.java.lang.CharacterGenerator
		com.pholser.junit.quickcheck.generator.java.lang.DoubleGenerator
		com.pholser.junit.quickcheck.generator.java.lang.IntegerGenerator
		com.pholser.junit.quickcheck.generator.java.lang.StringGenerator
		com.pholser.junit.quickcheck.generator.java.lang.LongGenerator
		com.pholser.junit.quickcheck.generator.java.lang.FloatGenerator
		com.pholser.junit.quickcheck.generator.java.lang.ByteGenerator
		com.pholser.junit.quickcheck.generator.java.lang.Encoded
		com.pholser.junit.quickcheck.generator.java.lang.BooleanGenerator
		com.pholser.junit.quickcheck.generator.java.nio.charset.CharsetGenerator
		com.pholser.junit.quickcheck.generator.VoidGenerator
	EOF
}

src_compile() {
	einfo "Compiling core"
	JAVA_JAR_FILENAME="core.jar"
	JAVA_RESOURCE_DIRS="core/src/main/resources"
	JAVA_SRC_DIR="core/src/main/java"
	java-pkg-simple_src_compile
	JAVA_GENTOO_CLASSPATH_EXTRA=":core.jar"
	rm -r target || die "clean core"

	einfo "Compiling generators"
	JAVA_JAR_FILENAME="generators.jar"
	JAVA_RESOURCE_DIRS="generators/src/main/resources"
	JAVA_SRC_DIR="generators/src/main/java"
	java-pkg-simple_src_compile
	JAVA_GENTOO_CLASSPATH_EXTRA+=":generators.jar"
	rm -r target || die "clean generators"

	JAVADOC_CLASSPATH="${JAVA_GENTOO_CLASSPATH}"
	use doc && ejavadoc
}

src_test() {
	# mockito-core-1.10.19 is presently not packaged
	JAVA_GENTOO_CLASSPATH_EXTRA+=":${DISTDIR}/mockito-core-${MCV}.jar"

	local vm_version="$(java-config -g PROVIDES_VERSION)"
	if ver_test "${vm_version}" -ge 17; then
		JAVA_TEST_EXTRA_ARGS+=( --add-opens=java.base/java.lang=ALL-UNNAMED )
	fi

	einfo "Testing core"
	JAVA_TEST_EXCLUDES=(
		# upstream doesn't run these tests
		com.pholser.junit.quickcheck.EqualsHashCodePropertiesTest # 9 of 9 tests fail
		com.pholser.junit.quickcheck.internal.generator.CorePropertyParameterTest # 2 of 2 tests fail
		com.pholser.junit.quickcheck.test.generator.TestGeneratorSource # Invalid test class, no runnable methods
	)
	JAVA_TEST_GENTOO_CLASSPATH="antlr-runtime-3.5 guava-testlib hamcrest javassist-3 junit-4 objenesis ognl"
	JAVA_TEST_RESOURCE_DIRS="core/src/test/resources"
	JAVA_TEST_SRC_DIR="core/src/test/java"
	java-pkg-simple_src_test

	einfo "Creating core-tests.jar"
	jar cvf core-tests.jar -C target/test-classes . || die
	JAVA_GENTOO_CLASSPATH_EXTRA+=":core-tests.jar"
	JAVA_TEST_RUN_ONLY=()

	einfo "Testing generators"
	JAVA_TEST_EXCLUDES=(
		# 2 of 2 tests fail, upstream doesn't run it
		com.pholser.junit.quickcheck.generator.BasicGeneratorPropertyParameterTest
	)
	JAVA_TEST_RESOURCE_DIRS=()
	JAVA_TEST_SRC_DIR="generators/src/test/java"
	java-pkg-simple_src_test
}

src_install() {
	java-pkg_dojar generators.jar
	JAVA_JAR_FILENAME="core.jar"
	java-pkg-simple_src_install
}