1 package com.jetbrains.edu.coursecreator.run;
3 import com.intellij.execution.Location;
4 import com.intellij.execution.actions.ConfigurationContext;
5 import com.intellij.execution.actions.RunConfigurationProducer;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.util.Ref;
8 import com.intellij.openapi.util.io.FileUtil;
9 import com.intellij.openapi.vfs.LocalFileSystem;
10 import com.intellij.openapi.vfs.VirtualFile;
11 import com.intellij.psi.PsiElement;
12 import com.jetbrains.edu.coursecreator.CCUtils;
13 import com.jetbrains.edu.learning.StudyUtils;
14 import com.jetbrains.edu.learning.core.EduNames;
15 import com.jetbrains.edu.learning.courseFormat.Task;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
19 public class PyCCRunTestsConfigurationProducer extends RunConfigurationProducer<PyCCRunTestConfiguration> {
20 protected PyCCRunTestsConfigurationProducer() {
21 super(PyCCRunTestsConfigurationType.getInstance());
25 protected boolean setupConfigurationFromContext(PyCCRunTestConfiguration configuration,
26 ConfigurationContext context,
27 Ref<PsiElement> sourceElement) {
28 Project project = context.getProject();
29 if (!CCUtils.isCourseCreator(project)) {
33 String testsPath = getTestPath(context);
34 if (testsPath == null) {
37 VirtualFile testsFile = LocalFileSystem.getInstance().findFileByPath(testsPath);
38 if (testsFile == null) {
42 String generatedName = generateName(testsFile, project);
43 if (generatedName == null) {
47 configuration.setPathToTest(testsPath);
48 configuration.setName(generatedName);
53 private static String generateName(@NotNull VirtualFile testsFile, @NotNull Project project) {
54 VirtualFile taskDir = StudyUtils.getTaskDir(testsFile);
55 if (taskDir == null) {
58 Task task = StudyUtils.getTask(project, taskDir);
62 return task.getLesson().getName() + "/" + task.getName();
66 private static String getTestPath(@NotNull ConfigurationContext context) {
67 Location location = context.getLocation();
68 if (location == null) {
71 VirtualFile file = location.getVirtualFile();
75 VirtualFile taskDir = StudyUtils.getTaskDir(file);
76 if (taskDir == null) {
80 Task task = StudyUtils.getTask(location.getProject(), taskDir);
84 String testsFileName = EduNames.TESTS_FILE;
85 String taskDirPath = FileUtil.toSystemDependentName(taskDir.getPath());
86 String testsPath = taskDir.findChild(EduNames.SRC) != null ?
87 FileUtil.join(taskDirPath, EduNames.SRC, testsFileName) :
88 FileUtil.join(taskDirPath, testsFileName);
89 String filePath = FileUtil.toSystemDependentName(file.getPath());
90 return filePath.equals(testsPath) ? testsPath : null;
94 public boolean isConfigurationFromContext(PyCCRunTestConfiguration configuration, ConfigurationContext context) {
95 String path = getTestPath(context);
99 return path.equals(configuration.getPathToTest());