blob: 7043eb1a1c102e0104ada2f367136acaf8f925e1 [file] [log] [blame]
/*
* (C) Copyright IBM Corp. 1998-2004. All Rights Reserved.
*
* The program is provided "as is" without any warranty express or
* implied, including the warranty of non-infringement and the implied
* warranties of merchantibility and fitness for a particular purpose.
* IBM will not be liable for any damages suffered by you as a result
* of using the Program. In no event will IBM be liable for any
* special, indirect or consequential damages or lost profits even if
* IBM has been advised of the possibility of their occurrence. IBM
* will not be liable for any third party claims against you.
*/
package com.ibm.richtext.test;
import java.awt.Button;
import java.awt.GridLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.PrintWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;
import com.ibm.richtext.textpanel.KeyEventForwarder;
import com.ibm.richtext.textpanel.TextPanel;
import com.ibm.richtext.awtui.TextFrame;
import com.ibm.richtext.styledtext.MConstText;
import com.ibm.richtext.demo.EditDemo;
import com.ibm.richtext.demo.TextDocument;
public class TypingPerfTest implements ActionListener {
static final String COPYRIGHT =
"(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";
private TextFrame fTextFrame;
private KeyEventForwarder fKeyEventForwarder;
private PrintWriter fOut;
private static final String fgAtStartCommand = "Insert at start";
private static final String fgAtEndCommand = "Insert at end";
private static final String fgFwdDelete = "Forward delete";
private static final String fgBackspace = "Backspace";
private static final String fgAtCurrentPosCommand = "Insert at current position";
private static final String fgLotsOfTextCommand = "Insert a lot of text";
private static final String USAGE = "Usage: java com.ibm.richtext.test.TypingPerfTest [file] [-insertionText text]";
private char[] fInsText;
public static void main(String[] args) throws IOException {
// not used OutputStream outStream = null;
PrintWriter writer = new PrintWriter(System.out);
MConstText text = Declaration.fgDeclaration;
char[] insText = "The quick brown fox jumps over the lazy dog. The end. ".toCharArray();
int index = 0;
while (index < args.length) {
if (args[index].equals("-insertionText")) {
if (args.length == ++index) {
throw new Error(USAGE);
}
insText = args[index++].toCharArray();
}
else {
// This will try MConstText first, then plain text.
TextDocument doc = EditDemo.getDocumentFromFile(new File(args[index++]));
if (doc == null) {
throw new Error("Couldn't open file "+args[index-1]);
}
text = doc.getText();
}
}
if (index != args.length) {
throw new Error(USAGE);
}
new TypingPerfTest(writer, text, insText);
}
public TypingPerfTest(PrintWriter out, MConstText text, char[] insText) throws IOException {
fInsText = insText;
fTextFrame = new TextFrame(text, "", null);
TextPanel textPanel = (TextPanel) fTextFrame.getTextPanel();
fKeyEventForwarder = new KeyEventForwarder(textPanel);
fOut = out;
DateFormat df = DateFormat.getDateTimeInstance();
out.println("Test date: " + df.format(new Date()));
fTextFrame.setSize(500, 700);
fTextFrame.show();
Frame f = new Frame("Typing Perf Test");
f.setLayout(new GridLayout(0, 1));
Button b;
/*
b = new Button(fgAtStartCmd);
b.addActionListener(this);
f.add(b);
b = new Button(fgAtEndCmd);
b.addActionListener(this);
f.add(b);
*/
b = new Button(fgAtCurrentPosCommand);
b.addActionListener(this);
f.add(b);
b = new Button(fgLotsOfTextCommand);
b.addActionListener(this);
f.add(b);
b = new Button(fgFwdDelete);
b.addActionListener(this);
f.add(b);
b = new Button(fgBackspace);
b.addActionListener(this);
f.add(b);
f.doLayout();
WindowAdapter closer = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
fOut.close();
System.exit(0);
}
};
f.addWindowListener(closer);
fTextFrame.addWindowListener(closer);
f.setSize(200, 80);
f.show();
}
public void actionPerformed(ActionEvent evt) {
try {
if (evt.getActionCommand().equals(fgAtCurrentPosCommand)) {
insertAtCurrentPos(1);
}
else if (evt.getActionCommand().equals(fgLotsOfTextCommand)) {
insertAtCurrentPos(8);
}
else if (evt.getActionCommand().equals(fgFwdDelete)) {
forwardDelete(1);
}
else if (evt.getActionCommand().equals(fgBackspace)) {
backspace(1);
}
}
catch(IOException e) {
System.out.println("Caught exception: " + e);
}
}
private void insertAtCurrentPos(final int times) throws IOException {
fTextFrame.toFront();
System.gc();
long startTime = System.currentTimeMillis();
for (int t=0; t < times; t++) {
for (int i=0; i < fInsText.length; i++) {
KeyEvent event = new KeyEvent(fTextFrame, KeyEvent.KEY_TYPED, 0, 0, 0, fInsText[i]);
fKeyEventForwarder.handleKeyEvent(event);
}
}
long time = System.currentTimeMillis() - startTime;
fOut.println("Total time: " + time);
fOut.println("Millis per character: " + (time / (fInsText.length*times)));
fOut.flush();
}
private void forwardDelete(final int times) throws IOException {
System.gc();
long startTime = System.currentTimeMillis();
for (int t=0; t < times; t++) {
for (int i=0; i < fInsText.length; i++) {
KeyEvent event = new KeyEvent(fTextFrame, 0, 0, 0, KeyEvent.VK_DELETE, '\u00FF');
fKeyEventForwarder.handleKeyEvent(event);
}
}
long time = System.currentTimeMillis() - startTime;
fOut.println("Total time: " + time);
fOut.println("Millis per character: " + (time / (fInsText.length*times)));
fOut.flush();
}
private void backspace(final int times) throws IOException {
System.gc();
long startTime = System.currentTimeMillis();
for (int t=0; t < times; t++) {
for (int i=0; i < fInsText.length; i++) {
KeyEvent event = new KeyEvent(fTextFrame, 0, 0, 0, KeyEvent.VK_BACK_SPACE, '\u0010');
fKeyEventForwarder.handleKeyEvent(event);
}
}
long time = System.currentTimeMillis() - startTime;
fOut.println("Total time: " + time);
fOut.println("Millis per character: " + (time / (fInsText.length*times)));
fOut.flush();
}
}