53ca0c996cc2d2068c3068e7e9a7d263ba1091dd
[idea/community.git] / python / educational-python / course-creator-python / src / com / jetbrains / edu / coursecreator / run / PyCCRunTestsConfigurationProducer.java
1 package com.jetbrains.edu.coursecreator.run;
2
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;
18
19 public class PyCCRunTestsConfigurationProducer extends RunConfigurationProducer<PyCCRunTestConfiguration> {
20   protected PyCCRunTestsConfigurationProducer() {
21     super(PyCCRunTestsConfigurationType.getInstance());
22   }
23
24   @Override
25   protected boolean setupConfigurationFromContext(PyCCRunTestConfiguration configuration,
26                                                   ConfigurationContext context,
27                                                   Ref<PsiElement> sourceElement) {
28     Project project = context.getProject();
29     if (!CCUtils.isCourseCreator(project)) {
30       return false;
31     }
32
33     String testsPath = getTestPath(context);
34     if (testsPath == null) {
35       return false;
36     }
37     VirtualFile testsFile = LocalFileSystem.getInstance().findFileByPath(testsPath);
38     if (testsFile == null) {
39       return false;
40     }
41
42     String generatedName = generateName(testsFile, project);
43     if (generatedName == null) {
44       return false;
45     }
46
47     configuration.setPathToTest(testsPath);
48     configuration.setName(generatedName);
49     return true;
50   }
51
52   @Nullable
53   private static String generateName(@NotNull VirtualFile testsFile, @NotNull Project project) {
54     VirtualFile taskDir = StudyUtils.getTaskDir(testsFile);
55     if (taskDir == null) {
56       return null;
57     }
58     Task task = StudyUtils.getTask(project, taskDir);
59     if (task == null) {
60       return null;
61     }
62     return task.getLesson().getName() + "/" + task.getName();
63   }
64
65   @Nullable
66   private static String getTestPath(@NotNull ConfigurationContext context) {
67     Location location = context.getLocation();
68     if (location == null) {
69       return null;
70     }
71     VirtualFile file = location.getVirtualFile();
72     if (file == null) {
73       return null;
74     }
75     VirtualFile taskDir = StudyUtils.getTaskDir(file);
76     if (taskDir == null) {
77       return null;
78     }
79
80     String testsPath = taskDir.findChild(EduNames.SRC) != null ?
81                FileUtil.join(taskDir.getPath(), EduNames.SRC, EduNames.TESTS_FILE) :
82                FileUtil.join(taskDir.getPath(), EduNames.TESTS_FILE);
83     return file.getPath().equals(testsPath) ? testsPath : null;
84   }
85
86   @Override
87   public boolean isConfigurationFromContext(PyCCRunTestConfiguration configuration, ConfigurationContext context) {
88     String path = getTestPath(context);
89     if (path == null) {
90       return false;
91     }
92     return path.equals(configuration.getPathToTest());
93   }
94 }