3789983e89
Reviewed-by: darcy, ihse
361 lines
12 KiB
Java
361 lines
12 KiB
Java
/*
|
|
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/* @test
|
|
@bug 6462562
|
|
@summary Tests text input into JFormattedTextField
|
|
with an InternationalFormatter
|
|
@author Peter Zhelezniakov
|
|
@run main Test6462562
|
|
*/
|
|
|
|
import java.awt.event.ActionEvent;
|
|
import java.text.DateFormat;
|
|
import java.text.NumberFormat;
|
|
import java.text.ParseException;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Date;
|
|
import java.util.Locale;
|
|
import javax.swing.Action;
|
|
import javax.swing.JFormattedTextField;
|
|
import javax.swing.SwingUtilities;
|
|
import javax.swing.text.Caret;
|
|
import javax.swing.text.DateFormatter;
|
|
import javax.swing.text.DefaultEditorKit;
|
|
import javax.swing.text.InternationalFormatter;
|
|
import javax.swing.text.NumberFormatter;
|
|
|
|
|
|
public class Test6462562
|
|
{
|
|
static final String BACKSPACE = new String("backspace");
|
|
static final String DELETE = new String("delete");
|
|
|
|
boolean failed = false;
|
|
|
|
void test() {
|
|
testPercentFormat();
|
|
testCurrencyFormat();
|
|
testIntegerFormat();
|
|
testDateFormat();
|
|
|
|
if (failed) {
|
|
throw new RuntimeException("Some testcases failed, see output above");
|
|
}
|
|
System.err.println("(-; All testcases passed ;-)");
|
|
}
|
|
|
|
TestFormattedTextField create(NumberFormat format) {
|
|
format.setMaximumFractionDigits(0);
|
|
NumberFormatter fmt = new NumberFormatter(format);
|
|
return new TestFormattedTextField(fmt);
|
|
}
|
|
|
|
TestFormattedTextField create(DateFormat format) {
|
|
DateFormatter fmt = new DateFormatter(format);
|
|
return new TestFormattedTextField(fmt);
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
SwingUtilities.invokeAndWait(new Runnable() {
|
|
public void run() {
|
|
new Test6462562().test();
|
|
}
|
|
});
|
|
}
|
|
|
|
class TestFormattedTextField extends JFormattedTextField
|
|
{
|
|
final Action backspace;
|
|
final Action delete;
|
|
final Action insert;
|
|
|
|
final ActionEvent dummyEvent;
|
|
|
|
public TestFormattedTextField(InternationalFormatter fmt) {
|
|
super(fmt);
|
|
fmt.setAllowsInvalid(false);
|
|
fmt.setOverwriteMode(true);
|
|
|
|
backspace = getActionMap().get(DefaultEditorKit.deletePrevCharAction);
|
|
delete = getActionMap().get(DefaultEditorKit.deleteNextCharAction);
|
|
insert = getActionMap().get(DefaultEditorKit.insertContentAction);
|
|
dummyEvent = new ActionEvent(this, 0, null);
|
|
}
|
|
|
|
public boolean test(int pos, int selectionLength, String todo, Object expectedResult) {
|
|
Object v0 = getValue();
|
|
|
|
Caret caret = getCaret();
|
|
caret.setDot(pos);
|
|
if (selectionLength > 0) {
|
|
caret.moveDot(pos + selectionLength);
|
|
}
|
|
|
|
String desc = todo;
|
|
if (todo == BACKSPACE) {
|
|
backspace.actionPerformed(dummyEvent);
|
|
} else if (todo == DELETE) {
|
|
delete.actionPerformed(dummyEvent);
|
|
} else {
|
|
desc = "insert('" + todo + "')";
|
|
insert.actionPerformed(new ActionEvent(this, 0, todo));
|
|
}
|
|
|
|
try {
|
|
commitEdit();
|
|
} catch (ParseException e) {
|
|
e.printStackTrace();
|
|
failed = true;
|
|
return false;
|
|
}
|
|
|
|
Object v1 = getValue();
|
|
if (! v1.equals(expectedResult)) {
|
|
System.err.printf("Failure: value='%s', mark=%d, dot=%d, action=%s\n",
|
|
v0, pos, pos + selectionLength, desc);
|
|
System.err.printf(" Result: '%s', expected: '%s'\n", v1, expectedResult);
|
|
failed = true;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
void testPercentFormat() {
|
|
NumberFormat format = NumberFormat.getPercentInstance(Locale.US);
|
|
TestFormattedTextField ftf = create(format);
|
|
ftf.setValue(.34);
|
|
|
|
System.err.println("Testing NumberFormat.getPercentInstance(Locale.US)");
|
|
|
|
// test inserting individual characters
|
|
ftf.test(0, 0, "1", .14);
|
|
ftf.test(2, 0, "2", 1.42);
|
|
ftf.test(1, 0, "0", 1.02);
|
|
|
|
// test inserting several characters at once - e.g. from clipboard
|
|
ftf.test(0, 0, "1024", 10.24);
|
|
ftf.test(3, 0, "333", 103.33);
|
|
ftf.test(6, 0, "77", 10333.77);
|
|
ftf.test(4, 0, "99", 10399.77);
|
|
ftf.test(6, 0, "00", 10390.07);
|
|
|
|
// test inserting strings that contain some formatting
|
|
ftf.test(0, 0, "2,2", 2290.07);
|
|
ftf.test(2, 0, "2,2", 222.27);
|
|
ftf.test(4, 0, "2,2", 222.22);
|
|
ftf.test(6, 0, "33,33", 2222233.33);
|
|
|
|
// test delete
|
|
ftf.test(0, 0, DELETE, 222233.33);
|
|
ftf.test(10, 0, DELETE, 222233.33);
|
|
ftf.test(5, 0, DELETE, 22223.33);
|
|
ftf.test(6, 0, DELETE, 2222.33);
|
|
|
|
// test backspace
|
|
ftf.test(0, 0, BACKSPACE, 2222.33);
|
|
ftf.test(7, 0, BACKSPACE, 222.23);
|
|
ftf.test(4, 0, BACKSPACE, 22.23);
|
|
ftf.test(2, 0, BACKSPACE, 2.23);
|
|
|
|
// test replacing selection
|
|
ftf.test(0, 1, "555", 555.23);
|
|
ftf.test(4, 2, "555", 5555.55);
|
|
ftf.test(2, 3, "1", 551.55);
|
|
ftf.test(3, 2, "6", 55.65);
|
|
ftf.test(4, 2, "12", 556.12);
|
|
ftf.test(3, 4, "0", 5.5);
|
|
ftf.test(0, 3, "111222333444555", 1112223334445.55);
|
|
|
|
// test deleting selection
|
|
ftf.test(0, 2, DELETE, 12223334445.55);
|
|
ftf.test(0, 3, BACKSPACE, 223334445.55);
|
|
ftf.test(12, 2, DELETE, 2233344.45);
|
|
ftf.test(9, 2, BACKSPACE, 22333.44);
|
|
ftf.test(4, 3, DELETE, 223.44);
|
|
ftf.test(1, 2, BACKSPACE, 23.44);
|
|
ftf.test(3, 3, DELETE, .23);
|
|
ftf.test(1, 2, BACKSPACE, .02);
|
|
}
|
|
|
|
void testCurrencyFormat() {
|
|
NumberFormat format = NumberFormat.getCurrencyInstance(Locale.US);
|
|
TestFormattedTextField ftf = create(format);
|
|
ftf.setValue(56L);
|
|
|
|
System.err.println("Testing NumberFormat.getCurrencyInstance(Locale.US)");
|
|
|
|
// test inserting individual characters
|
|
ftf.test(1, 0, "1", 16L);
|
|
ftf.test(3, 0, "2", 162L);
|
|
ftf.test(2, 0, "0", 102L);
|
|
|
|
// test inserting several characters at once - e.g. from clipboard
|
|
ftf.test(1, 0, "1024", 1024L);
|
|
ftf.test(4, 0, "333", 10333L);
|
|
ftf.test(7, 0, "77", 1033377L);
|
|
ftf.test(5, 0, "99", 1039977L);
|
|
ftf.test(7, 0, "00", 1039007L);
|
|
|
|
// test inserting strings that contain some formatting
|
|
ftf.test(1, 0, "2,2", 229007L);
|
|
ftf.test(3, 0, "2,2", 22227L);
|
|
ftf.test(4, 0, "2,2", 2222L);
|
|
ftf.test(6, 0, "33,33", 22223333L);
|
|
|
|
// test delete
|
|
ftf.test(1, 0, DELETE, 2223333L);
|
|
ftf.test(10, 0, DELETE, 2223333L);
|
|
ftf.test(5, 0, DELETE, 222333L);
|
|
ftf.test(5, 0, DELETE, 22233L);
|
|
|
|
// test backspace
|
|
ftf.test(1, 0, BACKSPACE, 22233L);
|
|
ftf.test(7, 0, BACKSPACE, 2223L);
|
|
ftf.test(4, 0, BACKSPACE, 223L);
|
|
ftf.test(2, 0, BACKSPACE, 23L);
|
|
|
|
// test replacing selection
|
|
ftf.test(1, 1, "555", 5553L);
|
|
ftf.test(4, 2, "555", 55555L);
|
|
ftf.test(2, 3, "1", 5155L);
|
|
ftf.test(3, 2, "6", 565L);
|
|
ftf.test(1, 3, "111222333444555", 111222333444555L);
|
|
|
|
// test deleting selection
|
|
ftf.test(1, 2, DELETE, 1222333444555L);
|
|
ftf.test(1, 3, BACKSPACE, 22333444555L);
|
|
ftf.test(13, 2, DELETE, 223334445L);
|
|
ftf.test(10, 2, BACKSPACE, 2233344L);
|
|
ftf.test(4, 4, DELETE, 2244L);
|
|
ftf.test(1, 4, BACKSPACE, 4L);
|
|
}
|
|
|
|
void testIntegerFormat() {
|
|
NumberFormat format = NumberFormat.getIntegerInstance(Locale.US);
|
|
TestFormattedTextField ftf = create(format);
|
|
ftf.setValue(56L);
|
|
|
|
System.err.println("Testing NumberFormat.getIntegerInstance(Locale.US)");
|
|
|
|
// test inserting individual characters
|
|
ftf.test(0, 0, "1", 16L);
|
|
ftf.test(2, 0, "2", 162L);
|
|
ftf.test(1, 0, "0", 102L);
|
|
|
|
// test inserting several characters at once - e.g. from clipboard
|
|
ftf.test(0, 0, "1024", 1024L);
|
|
ftf.test(3, 0, "333", 10333L);
|
|
ftf.test(6, 0, "77", 1033377L);
|
|
ftf.test(4, 0, "99", 1039977L);
|
|
ftf.test(6, 0, "00", 1039007L);
|
|
|
|
// test inserting strings that contain some formatting
|
|
ftf.test(0, 0, "2,2", 229007L);
|
|
ftf.test(2, 0, "2,2", 22227L);
|
|
ftf.test(3, 0, "2,2", 2222L);
|
|
ftf.test(5, 0, "33,33", 22223333L);
|
|
|
|
// test delete
|
|
ftf.test(0, 0, DELETE, 2223333L);
|
|
ftf.test(9, 0, DELETE, 2223333L);
|
|
ftf.test(4, 0, DELETE, 222333L);
|
|
ftf.test(4, 0, DELETE, 22233L);
|
|
|
|
// test backspace
|
|
ftf.test(0, 0, BACKSPACE, 22233L);
|
|
ftf.test(6, 0, BACKSPACE, 2223L);
|
|
ftf.test(2, 0, BACKSPACE, 223L);
|
|
ftf.test(2, 0, BACKSPACE, 23L);
|
|
|
|
// test replacing selection
|
|
ftf.test(0, 1, "555", 5553L);
|
|
ftf.test(3, 2, "555", 55555L);
|
|
ftf.test(1, 3, "1", 5155L);
|
|
ftf.test(2, 2, "6", 565L);
|
|
ftf.test(0, 3, "111222333444555", 111222333444555L);
|
|
|
|
// test deleting selection
|
|
ftf.test(0, 2, DELETE, 1222333444555L);
|
|
ftf.test(0, 3, BACKSPACE, 22333444555L);
|
|
ftf.test(12, 2, DELETE, 223334445L);
|
|
ftf.test(9, 2, BACKSPACE, 2233344L);
|
|
ftf.test(3, 4, DELETE, 2244L);
|
|
ftf.test(0, 4, BACKSPACE, 4L);
|
|
}
|
|
|
|
Date date(DateFormat format, String spec) {
|
|
try {
|
|
return format.parse(spec);
|
|
} catch (ParseException e) {
|
|
throw new Error("Error in test");
|
|
}
|
|
}
|
|
|
|
void testDateFormat() {
|
|
DateFormat format = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
|
|
TestFormattedTextField ftf = create(format);
|
|
ftf.setValue(date(format, "12/05/2005"));
|
|
|
|
System.err.println("Testing SimpleDateFormat(\"MM/dd/yyyy\", Locale.US)");
|
|
|
|
// test inserting individual characters
|
|
ftf.test(0, 0, "0", date(format, "02/05/2005"));
|
|
ftf.test(4, 0, "4", date(format, "02/04/2005"));
|
|
ftf.test(6, 0, "1", date(format, "02/04/1005"));
|
|
ftf.test(9, 0, "9", date(format, "02/04/1009"));
|
|
|
|
// test inserting several characters at once - e.g. from clipboard
|
|
ftf.test(0, 0, "11", date(format, "11/04/1009"));
|
|
ftf.test(3, 0, "23", date(format, "11/23/1009"));
|
|
ftf.test(6, 0, "191", date(format, "11/23/1919"));
|
|
|
|
// test delete
|
|
ftf.test(0, 0, DELETE, date(format, "01/23/1919"));
|
|
ftf.test(3, 0, DELETE, date(format, "01/03/1919"));
|
|
ftf.test(10, 0, DELETE, date(format, "01/03/1919"));
|
|
ftf.test(1, 0, DELETE, date(format, "12/03/1918"));
|
|
ftf.test(4, 0, DELETE, date(format, "11/30/1918"));
|
|
|
|
// test backspace
|
|
ftf.test(0, 0, BACKSPACE, date(format, "11/30/1918"));
|
|
ftf.test(1, 0, BACKSPACE, date(format, "01/30/1918"));
|
|
ftf.test(4, 0, BACKSPACE, date(format, "12/31/1917"));
|
|
ftf.test(10, 0, BACKSPACE, date(format, "12/31/0191"));
|
|
ftf.test(3, 0, BACKSPACE, date(format, "01/31/0191"));
|
|
ftf.test(5, 0, BACKSPACE, date(format, "01/03/0191"));
|
|
|
|
// test replacing selection
|
|
ftf.test(0, 1, "1", date(format, "11/03/0191"));
|
|
ftf.test(3, 1, "2", date(format, "11/23/0191"));
|
|
ftf.test(6, 2, "20", date(format, "11/23/2091"));
|
|
|
|
// test deleting selection
|
|
ftf.test(0, 1, BACKSPACE, date(format, "01/23/2091"));
|
|
ftf.test(3, 1, DELETE, date(format, "01/03/2091"));
|
|
ftf.test(6, 2, BACKSPACE, date(format, "01/03/0091"));
|
|
ftf.test(8, 1, DELETE, date(format, "01/03/0001"));
|
|
}
|
|
}
|