/* * 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")); } }