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.coursecreator.PyCCLanguageManager;
14 import com.jetbrains.edu.learning.StudyUtils;
15 import com.jetbrains.edu.learning.core.EduNames;
16 import com.jetbrains.edu.learning.courseFormat.Task;
17 import org.jetbrains.annotations.NotNull;
18 import org.jetbrains.annotations.Nullable;
20 public class PyCCRunTestsConfigurationProducer extends RunConfigurationProducer<PyCCRunTestConfiguration> {
21 protected PyCCRunTestsConfigurationProducer() {
22 super(PyCCRunTestsConfigurationType.getInstance());
26 protected boolean setupConfigurationFromContext(PyCCRunTestConfiguration configuration,
27 ConfigurationContext context,
28 Ref<PsiElement> sourceElement) {
29 Project project = context.getProject();
30 if (!CCUtils.isCourseCreator(project)) {
34 String testsPath = getTestPath(context);
35 if (testsPath == null) {
38 VirtualFile testsFile = LocalFileSystem.getInstance().findFileByPath(testsPath);
39 if (testsFile == null) {
43 String generatedName = generateName(testsFile, project);
44 if (generatedName == null) {
48 configuration.setPathToTest(testsPath);
49 configuration.setName(generatedName);
54 private static String generateName(@NotNull VirtualFile testsFile, @NotNull Project project) {
55 VirtualFile taskDir = StudyUtils.getTaskDir(testsFile);
56 if (taskDir == null) {
59 Task task = StudyUtils.getTask(project, taskDir);
63 String generatedName = task.getLesson().getName() + "/" + task.getName();
64 if (task.hasSubtasks()) {
65 int index = task.getActiveSubtaskIndex() + 1;
66 generatedName += " " + index;
72 private static String getTestPath(@NotNull ConfigurationContext context) {
73 Location location = context.getLocation();
74 if (location == null) {
77 VirtualFile file = location.getVirtualFile();
81 VirtualFile taskDir = StudyUtils.getTaskDir(file);
82 if (taskDir == null) {
86 Task task = StudyUtils.getTask(location.getProject(), taskDir);
90 String testsFileName = PyCCLanguageManager.getSubtaskTestsFileName(task.getActiveSubtaskIndex());
91 String taskDirPath = FileUtil.toSystemDependentName(taskDir.getPath());
92 String testsPath = taskDir.findChild(EduNames.SRC) != null ?
93 FileUtil.join(taskDirPath, EduNames.SRC, testsFileName) :
94 FileUtil.join(taskDirPath, testsFileName);
95 String filePath = FileUtil.toSystemDependentName(file.getPath());
96 return filePath.equals(testsPath) ? testsPath : null;
100 public boolean isConfigurationFromContext(PyCCRunTestConfiguration configuration, ConfigurationContext context) {
101 String path = getTestPath(context);
105 return path.equals(configuration.getPathToTest());