c105652d44e1d4a7734fb6fc03508d2b1913a243
[idea/community.git] / python / educational-core / course-creator / testSrc / com / jetbrains / edu / coursecreator / actions / CCShowPreviewTest.java
1 package com.jetbrains.edu.coursecreator.actions;
2
3 import com.intellij.openapi.actionSystem.AnAction;
4 import com.intellij.openapi.actionSystem.CommonDataKeys;
5 import com.intellij.openapi.actionSystem.LangDataKeys;
6 import com.intellij.openapi.editor.Document;
7 import com.intellij.openapi.editor.Editor;
8 import com.intellij.openapi.editor.EditorFactory;
9 import com.intellij.openapi.editor.markup.MarkupModel;
10 import com.intellij.openapi.editor.markup.RangeHighlighter;
11 import com.intellij.openapi.util.Pair;
12 import com.intellij.openapi.vfs.VirtualFile;
13 import com.intellij.psi.PsiFile;
14 import com.intellij.testFramework.MapDataContext;
15 import com.intellij.testFramework.TestActionEvent;
16 import com.jetbrains.edu.coursecreator.CCTestCase;
17 import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder;
18 import org.jetbrains.annotations.Nullable;
19
20 import java.util.List;
21
22 public class CCShowPreviewTest extends CCTestCase {
23
24   public void testPreviewUnavailable() {
25     VirtualFile file = configureByTaskFile("noplaceholders.txt");
26     CCShowPreview action = new CCShowPreview();
27     TestActionEvent e = getActionEvent(action, getPsiManager().findFile(file));
28     action.beforeActionPerformedUpdate(e);
29     assertTrue(e.getPresentation().isEnabled() && e.getPresentation().isVisible());
30     try {
31       action.actionPerformed(e);
32       assertTrue("No message shown", false);
33     } catch (RuntimeException ex) {
34       assertEquals(CCShowPreview.NO_PREVIEW_MESSAGE, ex.getMessage());
35     }
36   }
37
38   public void testOnePlaceholder() {
39     doTest("test_before.txt", "test_after.txt");
40   }
41
42   public void testSeveralPlaceholders() {
43     doTest("several_before.txt", "several_after.txt");
44   }
45
46   private void doTest(String beforeName, String afterName) {
47     VirtualFile file = configureByTaskFile(beforeName);
48     CCShowPreview action = new CCShowPreview();
49     TestActionEvent e = getActionEvent(action, getPsiManager().findFile(file));
50     action.beforeActionPerformedUpdate(e);
51     assertTrue(e.getPresentation().isEnabled() && e.getPresentation().isVisible());
52     action.actionPerformed(e);
53     Editor editor = EditorFactory.getInstance().getAllEditors()[1];
54     Pair<Document, List<AnswerPlaceholder>> pair = getPlaceholders(afterName);
55     assertEquals("Files don't match", editor.getDocument().getText(), pair.getFirst().getText());
56     for (AnswerPlaceholder placeholder : pair.getSecond()) {
57       assertNotNull("No highlighter for placeholder", getHighlighter(editor.getMarkupModel(), placeholder));
58     }
59     EditorFactory.getInstance().releaseEditor(editor);
60   }
61
62   @Nullable
63   private static RangeHighlighter getHighlighter(MarkupModel model, AnswerPlaceholder placeholder) {
64     for (RangeHighlighter highlighter : model.getAllHighlighters()) {
65       int endOffset = placeholder.getOffset() + placeholder.getRealLength();
66       if (highlighter.getStartOffset() == placeholder.getOffset() && highlighter.getEndOffset() == endOffset) {
67         return highlighter;
68       }
69     }
70     return null;
71   }
72
73   @Override
74   protected String getTestDataPath() {
75     return super.getTestDataPath() + "/actions/preview";
76   }
77
78   @Override
79   protected boolean shouldContainTempFiles() {
80     return false;
81   }
82
83   TestActionEvent getActionEvent(AnAction action, PsiFile psiFile) {
84     MapDataContext context = new MapDataContext();
85     context.put(CommonDataKeys.PSI_FILE, psiFile);
86     context.put(CommonDataKeys.PROJECT, getProject());
87     context.put(LangDataKeys.MODULE, myFixture.getModule());
88     return new TestActionEvent(context, action);
89   }
90 }