diff -r fd16c54261b3 -r 90ce3da70b43 jdk/test/java/util/Formattable/StockName.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/util/Formattable/StockName.java Sat Dec 01 00:00:00 2007 +0000 @@ -0,0 +1,117 @@ +/* + * Copyright 2004 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 4965770 4992540 5030716 + * @compile -source 1.5 StockName.java + * @run main StockName + */ + +import java.nio.CharBuffer; +import java.util.Formatter; +import java.util.Formattable; +import java.util.Locale; +import static java.util.FormattableFlags.*; + +public class StockName implements Formattable { + private String symbol, companyName, frenchCompanyName; + + public StockName(String symbol, String companyName, + String frenchCompanyName) + { + this.symbol = symbol; + this.companyName = companyName; + this.frenchCompanyName = frenchCompanyName; + } + + public void formatTo(Formatter fmt, int f, int width, int precision) { + StringBuilder sb = new StringBuilder(); + + // decide form of name + String name = companyName; + if (fmt.locale().equals(Locale.FRANCE)) + name = frenchCompanyName; + boolean alternate = (f & ALTERNATE) == ALTERNATE; + boolean usesymbol = alternate || (precision != -1 && precision < 10); + String out = (usesymbol ? symbol : name); + + // apply precision + if (precision == -1 || out.length() < precision) { + // write it all + sb.append(out); + } else { + sb.append(out.substring(0, precision - 1)).append('*'); + } + + // apply width and justification + int len = sb.length(); + if (len < width) + for (int i = 0; i < width - len; i++) + if ((f & LEFT_JUSTIFY) == LEFT_JUSTIFY) + sb.append(' '); + else + sb.insert(0, ' '); + + fmt.format(sb.toString()); + } + + public String toString() { + return String.format("%s - %s", symbol, companyName); + } + + public static void main(String [] args) { + StockName sn = new StockName("HUGE", "Huge Fruit, Inc.", + "Fruit Titanesque, Inc."); + CharBuffer cb = CharBuffer.allocate(128); + Formatter fmt = new Formatter(cb); + + fmt.format("%s", sn); // -> "Huge Fruit, Inc." + test(cb, "Huge Fruit, Inc."); + + fmt.format("%s", sn.toString()); // -> "HUGE - Huge Fruit, Inc." + test(cb, "HUGE - Huge Fruit, Inc."); + + fmt.format("%#s", sn); // -> "HUGE" + test(cb, "HUGE"); + + fmt.format("%-10.8s", sn); // -> "HUGE " + test(cb, "HUGE "); + + fmt.format("%.12s", sn); // -> "Huge Fruit,*" + test(cb, "Huge Fruit,*"); + + fmt.format(Locale.FRANCE, "%25s", sn); + // -> " Fruit Titanesque, Inc." + test(cb, " Fruit Titanesque, Inc."); + } + + private static void test(CharBuffer cb, String exp) { + cb.limit(cb.position()); + cb.rewind(); + if (!cb.toString().equals(exp)) + throw new RuntimeException("expect: '" + exp + "'; got: '" + + cb.toString() + "'"); + cb.clear(); + } +}