jdk/test/java/util/Formatter/Constructors.java
author naoto
Tue, 31 Aug 2010 11:27:10 -0700
changeset 6489 9e7015635425
parent 5506 202f599c92aa
child 7668 d4a77089c587
permissions -rw-r--r--
4700857: RFE: separating user locale and user interface locale Reviewed-by: okutsu

/*
 * Copyright (c) 2004, 2006, 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 4981811 4984465 5064492 6240171
 * @summary Unit test for all constructors introduced by the formatter feature
 */

import java.io.*;
import java.util.*;
import java.nio.charset.Charset;

public class Constructors {

    private static int fail = 0;
    private static int pass = 0;

    private static Throwable first;

    static void pass() {
        pass++;
    }

    static void fail(String fs) {
        String s = "'" + fs + "': exception not thrown";
        if (first == null)
            first = new RuntimeException(s);
        System.err.println("FAILED: " + s);
        fail++;
    }

    static void fail(String fs, Throwable ex) {
        String s = "'" + fs + "': " + ex.getClass().getName() + " thrown";
        if (first == null)
            first = ex;
        System.err.println("FAILED: " + s);
        fail++;
    }

    static void locale(Formatter f) {
        locale(f, Locale.getDefault(Locale.Category.FORMAT));
    }

    static void locale(Formatter f, Locale l) {
        try {
            if ((l != null && !l.equals(f.locale()))
                || (l == null && f.locale() != null))
                    throw new RuntimeException(f.locale() + " != " + l);
            pass();
        } catch (RuntimeException x) {
            fail(x.getMessage());
        }
    }

    static void out(Formatter f, Class c) {
        try {
            Appendable a = f.out();
            if (!c.isInstance(a))
                throw new RuntimeException(a.getClass().getName()
                                           + " != " + c.getName());
            pass();
        } catch (RuntimeException x) {
            fail(x.getMessage());
        }
    }

    public static void main(String [] args) {

        // Formatter()
        try {
            Formatter f = new Formatter();
            pass();
            out(f, StringBuilder.class);
            locale(f);
        } catch (Exception x) {
            fail("new Formatter()", x);
        }

        // Formatter(Appendable a)
        try {
            Formatter f = new Formatter((Appendable) null);
            pass();
            out(f, StringBuilder.class);
            locale(f);
        } catch (Exception x) {
            fail("new Formatter((Appendable)null)", x);
        }

        // Formatter(Locale l)
        try {
            Formatter f = new Formatter((Locale) null);
            pass();
            out(f, StringBuilder.class);
            locale(f, null);
        } catch (Exception x) {
            fail("new Formatter((Locale)null)", x);
        }

        // Formatter(Appendable a, Locale l)
        try {
            Formatter f = new Formatter((Appendable) null, (Locale) null);
            pass();
            out(f, StringBuilder.class);
            locale(f, null);
        } catch (Exception x) {
            fail("new Formatter((Appendable) null, (Locale) null)", x);
        }

        // Formatter(String fileName)
        try {
            Formatter f = new Formatter("foo");
            pass();
            out(f, BufferedWriter.class);
            locale(f);
        } catch (Exception x) {
            fail("new Formatter(\"foo\")", x);
        }

        try {
            Formatter f = new Formatter((String)null);
            fail("new Formatter((String)null)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((String)null)", x);
        }

        // Formatter(String fileName, String csn)
        try {
            Formatter f = new Formatter("foo", "UTF-8");
            pass();
            out(f, BufferedWriter.class);
            locale(f);
        } catch (Exception x) {
            fail("new Formatter(\"foo\", \"UTF-8\")", x);
        }

        try {
            new Formatter("foo", "bar");
            fail("new Formatter(\"foo\", \"bar\")");
        } catch (UnsupportedEncodingException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter(\"foo\", \"bar\")", x);
        }

        try {
            new Formatter(".", "bar");
            fail("new Formatter(\".\", \"bar\")");
        } catch (FileNotFoundException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter(\".\", \"bar\")", x);
        }

        // Formatter(String fileName, String csn, Locale l)
        try {
            Formatter f = new Formatter("foo", "ISO-8859-1", Locale.GERMANY);
            pass();
            out(f, BufferedWriter.class);
            locale(f, Locale.GERMANY);
        } catch (Exception x) {
            fail("new Formatter(\"foo\", \"ISO-8859-1\", Locale.GERMANY)", x);
        }

        try {
            Formatter f = new Formatter("foo", "ISO-8859-1", null);
            pass();
            locale(f, null);
            out(f, BufferedWriter.class);
        } catch (Exception x) {
            fail("new Formatter(\"foo\", \"ISO-8859-1\", null)", x);
        }

        // Formatter(File)
        try {
            Formatter f = new Formatter(new File("foo"));
            pass();
            locale(f);
            out(f, BufferedWriter.class);
        } catch (Exception x) {
            fail("new Formatter(new File(\"foo\")", x);
        }

        try {
            Formatter f = new Formatter((File)null);
            fail("new Formatter((File)null)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((File)null)", x);
        }

        // Formatter(PrintStream ps)
        try {
            // ambiguity detected at compile-time
            Formatter f = new Formatter(System.out);
            pass();
            out(f, PrintStream.class);
            locale(f);
        } catch (Exception x) {
            fail("new Formatter(System.out)", x);
        }

        try {
            new Formatter((PrintStream) null);
            fail("new Formatter((PrintStream) null)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((PrintStream) null)", x);
        }

        try {
            Formatter f = new Formatter(new PrintStream("foo"));
            pass();
            locale(f);
            out(f, PrintStream.class);
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\")", x);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\")", x);
        }

        try {
            Formatter f = new Formatter(new PrintStream("foo"),
                                        Locale.JAPANESE);
            pass();
            locale(f, Locale.JAPANESE);
            out(f, PrintStream.class);
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\")", x);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\")", x);
        }

        try {
            // The cast here is necessary to avoid an ambiguity error
            // between Formatter(Appendable a, Locale l)
            // and     Formatter(OutputStream os, String csn)
            Formatter f = new Formatter(new PrintStream("foo"),
                                        (String)null);
            fail("new Formatter(new PrintStream(\"foo\"), (String)null)");
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\"), (String)null)", x);
        } catch (NullPointerException x) {
            pass();
        } catch (UnsupportedEncodingException x) {
            fail("new Formatter(new PrintStream(\"foo\"), (String)null)", x);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), (String)null)", x);
        }

        try {
            // The cast here is necessary to avoid an ambiguity error
            // between Formatter(Appendable a, Locale l)
            // and     Formatter(OutputStream os, String csn)
            Formatter f = new Formatter(new PrintStream("foo"),
                                        (Locale)null);
            pass();
            locale(f, null);
            out(f, PrintStream.class);
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\"), (Locale)null)", x);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), (Locale)null)", x);
        }

        try {
            Formatter f = new Formatter(new PrintStream("foo"),
                                        Locale.KOREAN);
            pass();
            locale(f, Locale.KOREAN);
            out(f, PrintStream.class);
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\"), Locale.KOREAN)", x);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), Locale.KOREAN)", x);
        }

        try {
            Formatter f = new Formatter(new PrintStream("foo"),
                                        "UTF-16BE", null);
            pass();
            locale(f, null);
            out(f, BufferedWriter.class);
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", null");
        } catch (UnsupportedEncodingException x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", null");
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", null");
        }

        try {
            Formatter f = new Formatter(new PrintStream("foo"),
                                        "UTF-16BE", Locale.ITALIAN);
            pass();
            locale(f, Locale.ITALIAN);
            out(f, BufferedWriter.class);
        } catch (FileNotFoundException x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", Locale.ITALIAN");
        } catch (UnsupportedEncodingException x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", Locale.ITALIAN");
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", Locale.ITALIAN");
        }

        String csn = Charset.defaultCharset().newEncoder().canEncode('\u00a3') ?
            "ASCII" : "ISO-8859-1";
        try {
            ByteArrayOutputStream bs[] = { new ByteArrayOutputStream(),
                                           new ByteArrayOutputStream(),
                                           new ByteArrayOutputStream()
            };
            new Formatter((Appendable)  new PrintStream(bs[0], true, csn)).format("\u00a3");
            new Formatter((OutputStream)new PrintStream(bs[1], true, csn)).format("\u00a3");
            new Formatter(              new PrintStream(bs[2], true, csn)).format("\u00a3");
            if (Arrays.equals(bs[0].toByteArray(), bs[1].toByteArray())) {
                fail("arrays shouldn't match: " + bs[0].toByteArray());
            } else {
                pass();
            }
            if (! Arrays.equals(bs[0].toByteArray(), bs[2].toByteArray())) {
                fail("arrays should match: " + bs[0].toByteArray() + " != "
                     + bs[2].toByteArray());
            } else {
                pass();
            }
        } catch (UnsupportedEncodingException x) {
            fail("new PrintStream(newByteArrayOutputStream, true, " + csn + ")", x);
        }

        // Formatter(OutputStream os)
        try {
            new Formatter((OutputStream) null);
            fail("new Formatter((OutputStream) null)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((OutputStream) null)", x);
        }

        try {
            Formatter f = new Formatter((OutputStream) new PrintStream("foo"));
            pass();
            locale(f);
            out(f, BufferedWriter.class);
        } catch (Exception x) {
            fail("new Formatter((OutputStream) new PrintStream(\"foo\")", x);
        }

        // Formatter(OutputStream os, String csn)
        try {
            new Formatter((OutputStream) null, "ISO-8859-1");
            fail("new Formatter((OutputStream) null, \"ISO-8859-1\")");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((OutputStream) null, \"ISO-8859-1\")", x);
        }

        try {
            new Formatter((OutputStream) new PrintStream("foo"), null);
            fail("new Formatter((OutputStream) new PrintStream(\"foo\"), null");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((OutputStream) new PrintStream(\"foo\"), null",
                 x);
        }

        try {
            new Formatter(new PrintStream("foo"), "bar");
            fail("new Formatter(new PrintStream(\"foo\"), \"bar\")");
        } catch (UnsupportedEncodingException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"bar\")", x);
        }

        try {
            Formatter f = new Formatter(new PrintStream("foo"), "UTF-8");
            pass();
            locale(f);
            out(f, BufferedWriter.class);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-8\")", x);
        }

        // Formatter(OutputStream os, String csn, Locale l)
        try {
            new Formatter((OutputStream) null, "ISO-8859-1", Locale.UK);
            fail("new Formatter((OutputStream) null, \"ISO-8859-1\", Locale.UK)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter((OutputStream) null, \"ISO-8859-1\", Locale.UK)",
                 x);
        }

        try {
            new Formatter(new PrintStream("foo"), null, Locale.UK);
            fail("new Formatter(new PrintStream(\"foo\"), null, Locale.UK)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), null, Locale.UK)",
                 x);
        }

        try {
            new Formatter(new PrintStream("foo"), "bar", Locale.UK);
            fail("new Formatter(new PrintStream(\"foo\"), \"bar\", Locale.UK)");
        } catch (UnsupportedEncodingException x) {
            pass();
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"bar\", Locale.UK)",
                 x);
        }

        try {
            Formatter f
                = new Formatter(new PrintStream("foo"), "UTF-8", Locale.UK);
            pass();
            out(f, BufferedWriter.class);
            locale(f, Locale.UK);
        } catch (Exception x) {
            fail("new Formatter(new PrintStream(\"foo\"), \"UTF-8\"), Locale.UK",
                 x);
        }

        // PrintStream(String fileName)
        try {
            new PrintStream("foo");
            pass();
        } catch (Exception x) {
            fail("new PrintStream(\"foo\")", x);
        }

        // PrintStream(String fileName, String csn)
        try {
            new PrintStream("foo", null);
            fail("new PrintStream(\"foo\", null)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new PrintStream(\"foo\", null)", x);
        }

        // PrintStream(File file)
        try {
            new PrintStream(new File("foo"));
            pass();
        } catch (Exception x) {
            fail("new PrintStream(new File(\"foo\"))", x);
        }

        // PrintStream(File file, String csn)
        try {
            new PrintStream(new File("foo"), null);
            fail("new PrintStream(new File(\"foo\"), null)");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new PrintStream(new File(\"foo\"), null)", x);
        }

        // PrintWriter(String fileName)
        try {
            new PrintWriter("foo");
            pass();
        } catch (Exception x) {
            fail("new PrintWriter(\"foo\")", x);
        }

        // PrintWriter(String fileName, String csn)
        try {
            new PrintWriter("foo", null);
            fail("new PrintWriter(\"foo\"), null");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new PrintWriter(\"foo\"), null", x);
        }

        // PrintWriter(File file)
        try {
            new PrintWriter(new File("foo"));
            pass();
        } catch (Exception x) {
            fail("new PrintWriter(new File(\"foo\"))", x);
        }

        // PrintWriter(File file, String csn)
        try {
            new PrintWriter(new File("foo"), null);
            fail("new PrintWriter(new File(\"foo\")), null");
        } catch (NullPointerException x) {
            pass();
        } catch (Exception x) {
            fail("new PrintWriter(new File(\"foo\")), null", x);
        }

        if (fail != 0)
            throw new RuntimeException((fail + pass) + " tests: "
                                       + fail + " failure(s), first", first);
        else
            System.out.println("all " + (fail + pass) + " tests passed");
    }
}