mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-06 16:08:05 +00:00
Merge pull request #1805 from a-rookie-of-C-language/fix/gradle-all-tests-cwd
fix(run): run Gradle module tests from the build root
This commit is contained in:
@@ -813,6 +813,15 @@ describe("project producers", () => {
|
||||
expect(
|
||||
produceDirectory({ path: `${ROOT}/src/test/java/com/acme`, root: ROOT, configs: gradle })!.config!.args,
|
||||
).toEqual(["test", "--tests", "com.acme.*"]);
|
||||
// A module's tests run from the build root so `./gradlew` resolves,
|
||||
// qualified by the module's Gradle path.
|
||||
const dir = produceDirectory({ path: `${ROOT}/services/api/src/test/java`, root: ROOT, configs: gradle })!;
|
||||
expect(dir.config).toMatchObject({ cwd: null });
|
||||
expect(dir.config!.args).toEqual([":services:api:test"]);
|
||||
expect(
|
||||
produceDirectory({ path: `${ROOT}/services/api/src/test/java/com/acme`, root: ROOT, configs: gradle })!.config!
|
||||
.args,
|
||||
).toEqual([":services:api:test", "--tests", "com.acme.*"]);
|
||||
expect(produceDirectory({ path: `${ROOT}/src/main`, root: ROOT, configs })).toBeNull();
|
||||
expect(produceDirectory({ path: ROOT, root: ROOT, configs })).toBeNull();
|
||||
});
|
||||
|
||||
@@ -14,6 +14,7 @@ import { ipcPath, isSameOrInside } from "@/platform/paths";
|
||||
import { isTestPath } from "@/platform/languageSettings";
|
||||
import { currentRoots } from "@/platform/projectRoots";
|
||||
import { applicationConfig, jvmModuleDir } from "./application";
|
||||
import { useBuildModel } from "@/platform/buildModel";
|
||||
import { formatArgs } from "./configs";
|
||||
import { goGenerateConfig } from "./goGenerate";
|
||||
import { goTestParts } from "./goArguments";
|
||||
@@ -1146,6 +1147,27 @@ function rubyDirectory(
|
||||
return make(minitest, label, [...args, relToCwd(minitest)]);
|
||||
}
|
||||
|
||||
/**
|
||||
* The Gradle build and project path a module directory belongs to, so a module
|
||||
* test run can stay in the build root (where `./gradlew` resolves) and qualify
|
||||
* its task (`:services:api:test`). `null` for non-Gradle bases and modules the
|
||||
* base configuration already runs. Without a loaded model, the Gradle path is
|
||||
* guessed from the directory's segments — right for the standard layout the
|
||||
* wrapper itself implies.
|
||||
*/
|
||||
function gradleOwnerFor(module: string, base: RunConfig): { dir: string | null; path: string } | null {
|
||||
if (base.kind !== "gradle" || !module || module === base.cwd) return null;
|
||||
const dir = module.replace(/\\/g, "/");
|
||||
const gradle = useBuildModel
|
||||
.getState()
|
||||
.model?.gradle?.find((g) => g.projects.some((p) => p.dir.replace(/\\/g, "/") === dir));
|
||||
const project = gradle?.projects.find((p) => p.dir.replace(/\\/g, "/") === dir);
|
||||
return {
|
||||
dir: gradle?.dir ?? base.cwd,
|
||||
path: project?.path ?? `:${module.split("/").join(":")}`,
|
||||
};
|
||||
}
|
||||
|
||||
export function produceDirectory(input: ContextInput): Produced | null {
|
||||
input = scopedInput(input);
|
||||
const { root } = input;
|
||||
@@ -1181,11 +1203,20 @@ export function produceDirectory(input: ContextInput): Produced | null {
|
||||
const base = closest(["gradle", "maven"]);
|
||||
if (base) {
|
||||
const module = jvmModuleDir(rel + "/x.java", input.configs);
|
||||
const moduleBase = { ...base, cwd: module || base.cwd };
|
||||
if (!jvmPackage) return make(moduleBase, "All Tests", [...base.args]);
|
||||
// Gradle in a multi-module project: run from the build root so the
|
||||
// wrapper (`./gradlew`) resolves, qualifying the task with the module's
|
||||
// Gradle path (`services/api` → `:services:api:test`). Other builds run
|
||||
// in the module directory as before.
|
||||
const owner = gradleOwnerFor(module, base);
|
||||
const moduleBase = { ...base, cwd: owner ? owner.dir : module || base.cwd };
|
||||
const moduleArgs = (base: RunConfig): string[] => {
|
||||
if (!owner) return [...base.args];
|
||||
return base.args.map((a) => (a === "test" ? `${owner.path}:test` : a));
|
||||
};
|
||||
if (!jvmPackage) return make(moduleBase, "All Tests", moduleArgs(base));
|
||||
const pkg = jvmPackage[2]!.replace(/\//g, ".");
|
||||
return base.kind === "gradle"
|
||||
? make(moduleBase, `Tests in '${pkg}'`, [...base.args, "--tests", `${pkg}.*`])
|
||||
? make(moduleBase, `Tests in '${pkg}'`, [...moduleArgs(base), "--tests", `${pkg}.*`])
|
||||
: make(moduleBase, `Tests in '${pkg}'`, [
|
||||
...base.args,
|
||||
`-Dtest=${pkg}.**.*`,
|
||||
|
||||
Reference in New Issue
Block a user