console: fix blank console bug caused by invoking "clear(); print();" while previous...
[idea/community.git] / platform / platform-tests / testSrc / com / intellij / execution / impl / ConsoleViewImplTest.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.execution.impl;
17
18 import com.intellij.execution.process.ProcessHandler;
19 import com.intellij.execution.ui.ConsoleViewContentType;
20 import com.intellij.ide.DataManager;
21 import com.intellij.openapi.actionSystem.DataContext;
22 import com.intellij.openapi.editor.Editor;
23 import com.intellij.openapi.editor.actionSystem.EditorActionManager;
24 import com.intellij.openapi.editor.actionSystem.TypedAction;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.openapi.util.Disposer;
27 import com.intellij.psi.search.GlobalSearchScope;
28 import com.intellij.testFramework.LightPlatformTestCase;
29 import com.intellij.testFramework.TestDataProvider;
30 import com.intellij.util.Alarm;
31 import com.intellij.util.TimeoutUtil;
32 import com.intellij.util.ui.UIUtil;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35
36 import java.io.OutputStream;
37 import java.util.concurrent.CountDownLatch;
38
39 public class ConsoleViewImplTest extends LightPlatformTestCase {
40
41   private ConsoleViewImpl myConsole;
42
43   @Override
44   public void setUp() throws Exception {
45     super.setUp();
46     myConsole = createConsole();
47   }
48
49   @Override
50   public void tearDown() throws Exception {
51     try {
52       Disposer.dispose(myConsole);
53     }
54     finally {
55       super.tearDown();
56     }
57   }
58
59   public void testTypeText() throws Exception {
60     ConsoleViewImpl console = myConsole;
61     console.print("Initial", ConsoleViewContentType.NORMAL_OUTPUT);
62     console.flushDeferredText();
63     console.clear();
64     console.print("Hi", ConsoleViewContentType.NORMAL_OUTPUT);
65     assertEquals(2, console.getContentSize());
66   }
67
68   public void testConsolePrintsSomethingAfterDoubleClear() throws Exception {
69     ConsoleViewImpl console = myConsole;
70     Alarm alarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD);
71     CountDownLatch latch = new CountDownLatch(1);
72     alarm.addRequest(() -> {
73       console.clear();
74       console.clear();
75       console.print("Test", ConsoleViewContentType.NORMAL_OUTPUT);
76       latch.countDown();
77     }, 0);
78     latch.await();
79     while (console.hasDeferredOutput()) {
80       UIUtil.dispatchAllInvocationEvents();
81       TimeoutUtil.sleep(5);
82     }
83     assertEquals("Test", console.getText());
84   }
85
86   public void testClearAndPrintWhileAnotherClearExecution() throws Exception {
87     ConsoleViewImpl console = myConsole;
88     Alarm alarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD);
89     for (int i = 0; i < 100; i++) {
90       // To speed up test execution, set -Dconsole.flush.delay.ms=5 to reduce ConsoleViewImpl.DEFAULT_FLUSH_DELAY
91       System.out.println("Attempt #" + i);
92       console.clear(); // 1-st clear
93       CountDownLatch latch = new CountDownLatch(1);
94       alarm.addRequest(() -> {
95         console.clear(); // 2-nd clear
96         console.print("Test", ConsoleViewContentType.NORMAL_OUTPUT);
97         latch.countDown();
98       }, 0);
99       UIUtil.dispatchAllInvocationEvents(); // flush 1-st clear request
100       latch.await();
101       UIUtil.dispatchAllInvocationEvents(); // flush 2-nd clear request
102       while (console.hasDeferredOutput()) {
103         UIUtil.dispatchAllInvocationEvents();
104         TimeoutUtil.sleep(5);
105       }
106       assertEquals("Test", console.getText());
107     }
108   }
109
110   public void testTypeInEmptyConsole() throws Exception {
111     ConsoleViewImpl console = myConsole;
112     console.clear();
113     EditorActionManager actionManager = EditorActionManager.getInstance();
114     DataContext dataContext = DataManager.getInstance().getDataContext(console.getComponent());
115     TypedAction action = actionManager.getTypedAction();
116     action.actionPerformed(console.getEditor(), 'h', dataContext);
117     assertEquals(1, console.getContentSize());
118   }
119
120   public void testTypingAfterMultipleCR() throws Exception {
121     final EditorActionManager actionManager = EditorActionManager.getInstance();
122     final TypedAction typedAction = actionManager.getTypedAction();
123     final TestDataProvider dataContext = new TestDataProvider(getProject());
124
125     final ConsoleViewImpl console = myConsole;
126     final Editor editor = console.getEditor();
127     console.print("System output\n", ConsoleViewContentType.SYSTEM_OUTPUT);
128     console.print("\r\r\r\r\r\r\r", ConsoleViewContentType.NORMAL_OUTPUT);
129     console.flushDeferredText();
130
131     typedAction.actionPerformed(editor, '1', dataContext);
132     typedAction.actionPerformed(editor, '2', dataContext);
133
134     assertEquals("System output\n12", editor.getDocument().getText());
135   }
136
137   @NotNull
138   private static ConsoleViewImpl createConsole() {
139     Project project = getProject();
140     ConsoleViewImpl console = new ConsoleViewImpl(project,
141                                                   GlobalSearchScope.allScope(project),
142                                                   false,
143                                                   false);
144     console.getComponent();
145     ProcessHandler processHandler = new MyProcessHandler();
146     processHandler.startNotify();
147     console.attachToProcess(processHandler);
148     return console;
149   }
150
151   private static class MyProcessHandler extends ProcessHandler {
152     @Override
153     protected void destroyProcessImpl() {
154       notifyProcessTerminated(0);
155     }
156
157     @Override
158     protected void detachProcessImpl() {
159     }
160
161     @Override
162     public boolean detachIsDefault() {
163       return false;
164     }
165
166     @Nullable
167     @Override
168     public OutputStream getProcessInput() {
169       return null;
170     }
171   }
172 }