blob: e16a971b1c9554d49a82b47eb74901d6054eab20 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.openide.text;
import java.awt.Dialog;
import java.beans.PropertyChangeListener;
import java.beans.VetoableChangeListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import javax.swing.JEditorPane;
import javax.swing.SwingUtilities;
import org.netbeans.junit.NbTestCase;
import org.netbeans.junit.RandomlyFails;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.UserQuestionException;
import org.openide.util.test.MockLookup;
import org.openide.windows.CloneableOpenSupport;
import org.openide.windows.CloneableTopComponent;
/**
* Testing usage of UserQuestionException in CES when CES.open loads
* document asynchronously
*
* @author Marek Slama
*/
@RandomlyFails
public class CloneableEditorUserQuestionAsync2Test extends NbTestCase
implements CloneableEditorSupport.Env {
static {
System.setProperty("org.openide.windows.DummyWindowManager.VISIBLE", "false");
}
/** the support to work with */
private CES support;
// Env variables
private String content = "";
private boolean valid = true;
private boolean modified = false;
/** if not null contains message why this document cannot be modified */
private String cannotBeModified;
private Date date = new Date();
private VetoableChangeListener vetoL;
private IOException toThrow;
public CloneableEditorUserQuestionAsync2Test(String testName) {
super(testName);
}
@Override
protected void setUp() {
MockLookup.setInstances(new DD());
support = new CES(this, Lookup.EMPTY);
}
public void testExceptionThrownWhenDocumentIsBeingReadAWTYes () throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
MyEx my = new MyEx();
toThrow = my;
DD.options = null;
DD.toReturn = NotifyDescriptor.YES_OPTION;
support.open();
JEditorPane [] panes = support.getOpenedPanes();
assertNotNull(panes);
assertEquals(panes.length, 1);
assertNotNull(panes[0]);
}
});
}
public void testExceptionThrownWhenDocumentIsBeingReadAWTNo () throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
MyEx my = new MyEx();
toThrow = my;
DD.options = null;
DD.toReturn = NotifyDescriptor.NO_OPTION;
support.open();
JEditorPane [] panes = support.getOpenedPanes();
assertNull(panes);
}
});
}
public void testExceptionThrownWhenDocumentIsBeingReadYes () throws Exception {
MyEx my = new MyEx();
toThrow = my;
DD.options = null;
DD.toReturn = NotifyDescriptor.YES_OPTION;
support.open ();
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JEditorPane[] panes = support.getOpenedPanes();
assertNotNull(panes);
assertEquals(panes.length, 1);
assertNotNull(panes[0]);
CloneableEditor ce = (CloneableEditor) support.getRef().getArbitraryComponent();
assertNotNull(ce);
}
});
CloneableEditor ce = (CloneableEditor) support.getRef().getArbitraryComponent();
while (ce == null) {
Thread.sleep(100);
ce = (CloneableEditor) support.getRef().getArbitraryComponent();
}
assertNotNull(ce);
while (!ce.isEditorPaneReadyTest()) {
Thread.sleep(100);
}
assertTrue(ce.isEditorPaneReadyTest());
}
public void testExceptionThrownWhenDocumentIsBeingReadNo () throws Exception {
MyEx my = new MyEx();
toThrow = my;
DD.options = null;
DD.toReturn = NotifyDescriptor.NO_OPTION;
support.open ();
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JEditorPane[] panes = support.getOpenedPanes();
assertNull(panes);
}
});
}
private class MyEx extends UserQuestionException {
private int confirmed;
public @Override String getLocalizedMessage() {
return "locmsg";
}
public @Override String getMessage() {
return "msg";
}
public void confirmed () {
confirmed++;
toThrow = null;
}
}
//
// Implementation of the CloneableEditorSupport.Env
//
public void addPropertyChangeListener(PropertyChangeListener l) {}
public void removePropertyChangeListener(PropertyChangeListener l) {}
public synchronized void addVetoableChangeListener(VetoableChangeListener l) {
assertNull ("This is the first veto listener", vetoL);
vetoL = l;
}
public void removeVetoableChangeListener(VetoableChangeListener l) {
assertEquals ("Removing the right veto one", vetoL, l);
vetoL = null;
}
public CloneableOpenSupport findCloneableOpenSupport() {
return support;
}
public String getMimeType() {
return "text/plain";
}
public Date getTime() {
return date;
}
public InputStream inputStream() throws IOException {
//Wait here so there is enough time for AWT to get into CE.getEditorPane
//so we can test behavior when AWT is blocked in initVisual
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
}
if (toThrow != null) {
throw toThrow;
}
return new ByteArrayInputStream(content.getBytes());
}
public OutputStream outputStream() throws IOException {
class ContentStream extends ByteArrayOutputStream {
public @Override void close() throws IOException {
super.close ();
content = new String (toByteArray ());
}
}
return new ContentStream ();
}
public boolean isValid() {
return valid;
}
public boolean isModified() {
return modified;
}
public void markModified() throws IOException {
if (cannotBeModified != null) {
final String notify = cannotBeModified;
IOException e = new IOException () {
public @Override String getLocalizedMessage() {
return notify;
}
};
Exceptions.attachLocalizedMessage(e, cannotBeModified);
throw e;
}
modified = true;
}
public void unmarkModified() {
modified = false;
}
/** Implementation of the CES */
private static final class CES extends CloneableEditorSupport {
public CES (Env env, Lookup l) {
super (env, l);
}
public CloneableTopComponent.Ref getRef () {
return allEditors;
}
@Override
protected boolean asynchronousOpen() {
return true;
}
protected String messageName() {
return "Name";
}
protected String messageOpened() {
return "Opened";
}
protected String messageOpening() {
return "Opening";
}
protected String messageSave() {
return "Save";
}
protected String messageToolTip() {
return "ToolTip";
}
} // end of CES
/** Our own dialog displayer.
*/
private static final class DD extends DialogDisplayer {
public static Object[] options;
public static Object toReturn;
public Dialog createDialog(DialogDescriptor descriptor) {
throw new IllegalStateException ("Not implemented");
}
public Object notify(NotifyDescriptor descriptor) {
assertNull (options);
assertNotNull (toReturn);
options = descriptor.getOptions();
Object r = toReturn;
toReturn = null;
return r;
}
} // end of DD
}