f58104fb37e2f80ebcfb1bac66d819e2b6ec47f7
[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     Task task = StudyUtils.getTask(location.getProject(), taskDir);
81     if (task == null) {
82       return null;
83     }
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;
91   }
92
93   @Override
94   public boolean isConfigurationFromContext(PyCCRunTestConfiguration configuration, ConfigurationContext context) {
95     String path = getTestPath(context);
96     if (path == null) {
97       return false;
98     }
99     return path.equals(configuration.getPathToTest());
100   }
101 }