1 /*
   2  * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /* @test
  25  * @bug 4981811 4984465 5064492 6240171 7000511
  26  * @summary Unit test for all constructors introduced by the formatter feature
  27  */
  28 
  29 import java.io.*;
  30 import java.util.*;
  31 import java.nio.charset.Charset;
  32 
  33 public class Constructors {
  34 
  35     private static int fail = 0;
  36     private static int pass = 0;
  37 
  38     private static Throwable first;
  39 
  40     static void pass() {
  41         pass++;
  42     }
  43 
  44     static void fail(String fs) {
  45         String s = "'" + fs + "': exception not thrown";
  46         if (first == null)
  47             first = new RuntimeException(s);
  48         System.err.println("FAILED: " + s);
  49         fail++;
  50     }
  51 
  52     static void fail(String fs, Throwable ex) {
  53         String s = "'" + fs + "': " + ex.getClass().getName() + " thrown";
  54         if (first == null)
  55             first = ex;
  56         System.err.println("FAILED: " + s);
  57         fail++;
  58     }
  59 
  60     static void locale(Formatter f) {
  61         locale(f, Locale.getDefault(Locale.Category.FORMAT));
  62     }
  63 
  64     static void locale(Formatter f, Locale l) {
  65         try {
  66             if ((l != null && !l.equals(f.locale()))
  67                 || (l == null && f.locale() != null))
  68                     throw new RuntimeException(f.locale() + " != " + l);
  69             pass();
  70         } catch (RuntimeException x) {
  71             fail(x.getMessage());
  72         }
  73     }
  74 
  75     static void out(Formatter f, Class c) {
  76         try {
  77             Appendable a = f.out();
  78             if (!c.isInstance(a))
  79                 throw new RuntimeException(a.getClass().getName()
  80                                            + " != " + c.getName());
  81             pass();
  82         } catch (RuntimeException x) {
  83             fail(x.getMessage());
  84         }
  85     }
  86 
  87     public static void main(String [] args) {
  88         // Formatter()
  89         try (Formatter f = new Formatter()) {
  90             pass();
  91             out(f, StringBuilder.class);
  92             locale(f);
  93         } catch (Exception x) {
  94             fail("new Formatter()", x);
  95         }
  96 
  97         // Formatter(Appendable a)
  98         try (Formatter f = new Formatter((Appendable) null)) {
  99             pass();
 100             out(f, StringBuilder.class);
 101             locale(f);
 102         } catch (Exception x) {
 103             fail("new Formatter((Appendable)null)", x);
 104         }
 105 
 106         // Formatter(Locale l)
 107         try (Formatter f = new Formatter((Locale) null)) {
 108             pass();
 109             out(f, StringBuilder.class);
 110             locale(f, null);
 111         } catch (Exception x) {
 112             fail("new Formatter((Locale)null)", x);
 113         }
 114 
 115         // Formatter(Appendable a, Locale l)
 116         try (Formatter f = new Formatter((Appendable) null, (Locale) null)) {
 117             pass();
 118             out(f, StringBuilder.class);
 119             locale(f, null);
 120         } catch (Exception x) {
 121             fail("new Formatter((Appendable) null, (Locale) null)", x);
 122         }
 123 
 124         // Formatter(String fileName)
 125         try (Formatter f = new Formatter("foo")) {
 126             pass();
 127             out(f, BufferedWriter.class);
 128             locale(f);
 129         } catch (Exception x) {
 130             fail("new Formatter(\"foo\")", x);
 131         }
 132 
 133         try {
 134             new Formatter((String)null);
 135             fail("new Formatter((String)null)");
 136         } catch (NullPointerException x) {
 137             pass();
 138         } catch (Exception x) {
 139             fail("new Formatter((String)null)", x);
 140         }
 141 
 142         // Formatter(String fileName, String csn)
 143         try (Formatter f = new Formatter("foo", "UTF-8")) {
 144             pass();
 145             out(f, BufferedWriter.class);
 146             locale(f);
 147         } catch (Exception x) {
 148             fail("new Formatter(\"foo\", \"UTF-8\")", x);
 149         }
 150 
 151         try {
 152             new Formatter("foo", "bar");
 153             fail("new Formatter(\"foo\", \"bar\")");
 154         } catch (UnsupportedEncodingException x) {
 155             pass();
 156         } catch (Exception x) {
 157             fail("new Formatter(\"foo\", \"bar\")", x);
 158         }
 159 
 160         try {
 161             new Formatter(".", "bar");
 162             fail("new Formatter(\".\", \"bar\")");
 163         } catch (FileNotFoundException|UnsupportedEncodingException x) {
 164             pass();
 165         } catch (Exception x) {
 166             fail("new Formatter(\".\", \"bar\")", x);
 167         }
 168 
 169         // Formatter(String fileName, String csn, Locale l)
 170         try (Formatter f = new Formatter("foo", "ISO-8859-1", Locale.GERMANY)) {
 171             pass();
 172             out(f, BufferedWriter.class);
 173             locale(f, Locale.GERMANY);
 174         } catch (Exception x) {
 175             fail("new Formatter(\"foo\", \"ISO-8859-1\", Locale.GERMANY)", x);
 176         }
 177 
 178         try (Formatter f = new Formatter("foo", "ISO-8859-1", null)) {
 179             pass();
 180             locale(f, null);
 181             out(f, BufferedWriter.class);
 182         } catch (Exception x) {
 183             fail("new Formatter(\"foo\", \"ISO-8859-1\", null)", x);
 184         }
 185 
 186         // Formatter(File)
 187         try (Formatter f = new Formatter(new File("foo"))) {
 188             pass();
 189             locale(f);
 190             out(f, BufferedWriter.class);
 191         } catch (Exception x) {
 192             fail("new Formatter(new File(\"foo\")", x);
 193         }
 194 
 195         try {
 196             new Formatter((File)null);
 197             fail("new Formatter((File)null)");
 198         } catch (NullPointerException x) {
 199             pass();
 200         } catch (Exception x) {
 201             fail("new Formatter((File)null)", x);
 202         }
 203 
 204         // Formatter(PrintStream ps)
 205         try {
 206             // ambiguity detected at compile-time
 207             Formatter f = new Formatter(System.out);
 208             pass();
 209             out(f, PrintStream.class);
 210             locale(f);
 211         } catch (Exception x) {
 212             fail("new Formatter(System.out)", x);
 213         }
 214 
 215         try {
 216             new Formatter((PrintStream) null);
 217             fail("new Formatter((PrintStream) null)");
 218         } catch (NullPointerException x) {
 219             pass();
 220         } catch (Exception x) {
 221             fail("new Formatter((PrintStream) null)", x);
 222         }
 223 
 224         try (Formatter f = new Formatter(new PrintStream("foo"))) {
 225             pass();
 226             locale(f);
 227             out(f, PrintStream.class);
 228         } catch (FileNotFoundException x) {
 229             fail("new Formatter(new PrintStream(\"foo\")", x);
 230         } catch (Exception x) {
 231             fail("new Formatter(new PrintStream(\"foo\")", x);
 232         }
 233 
 234         try (Formatter f = new Formatter(new PrintStream("foo"),
 235                                          Locale.JAPANESE)) {
 236             pass();
 237             locale(f, Locale.JAPANESE);
 238             out(f, PrintStream.class);
 239         } catch (FileNotFoundException x) {
 240             fail("new Formatter(new PrintStream(\"foo\")", x);
 241         } catch (Exception x) {
 242             fail("new Formatter(new PrintStream(\"foo\")", x);
 243         }
 244 
 245         try (PrintStream ps = new PrintStream("foo")) {
 246             // The cast here is necessary to avoid an ambiguity error
 247             // between Formatter(Appendable a, Locale l)
 248             // and Formatter(OutputStream os, String csn)
 249             new Formatter(ps, (String)null);
 250             fail("new Formatter(new PrintStream(\"foo\"), (String)null)");
 251         } catch (FileNotFoundException x) {
 252             fail("new Formatter(new PrintStream(\"foo\"), (String)null)", x);
 253         } catch (NullPointerException x) {
 254             pass();
 255         } catch (UnsupportedEncodingException x) {
 256             fail("new Formatter(new PrintStream(\"foo\"), (String)null)", x);
 257         } catch (Exception x) {
 258             fail("new Formatter(new PrintStream(\"foo\"), (String)null)", x);
 259         }
 260 
 261         // The cast here is necessary to avoid an ambiguity error
 262         // between Formatter(Appendable a, Locale l)
 263         // and  Formatter(OutputStream os, String csn)
 264         try (Formatter f = new Formatter(new PrintStream("foo"),
 265                                          (Locale)null)) {
 266             pass();
 267             locale(f, null);
 268             out(f, PrintStream.class);
 269         } catch (FileNotFoundException x) {
 270             fail("new Formatter(new PrintStream(\"foo\"), (Locale)null)", x);
 271         } catch (Exception x) {
 272             fail("new Formatter(new PrintStream(\"foo\"), (Locale)null)", x);
 273         }
 274 
 275         try (Formatter f = new Formatter(new PrintStream("foo"),
 276                                          Locale.KOREAN)) {
 277             pass();
 278             locale(f, Locale.KOREAN);
 279             out(f, PrintStream.class);
 280         } catch (FileNotFoundException x) {
 281             fail("new Formatter(new PrintStream(\"foo\"), Locale.KOREAN)", x);
 282         } catch (Exception x) {
 283             fail("new Formatter(new PrintStream(\"foo\"), Locale.KOREAN)", x);
 284         }
 285 
 286         try (Formatter f = new Formatter(new PrintStream("foo"),
 287                                          "UTF-16BE", null)) {
 288             pass();
 289             locale(f, null);
 290             out(f, BufferedWriter.class);
 291         } catch (FileNotFoundException x) {
 292             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", null");
 293         } catch (UnsupportedEncodingException x) {
 294             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", null");
 295         } catch (Exception x) {
 296             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", null");
 297         }
 298 
 299         try (Formatter f = new Formatter(new PrintStream("foo"),
 300                                          "UTF-16BE", Locale.ITALIAN)) {
 301             pass();
 302             locale(f, Locale.ITALIAN);
 303             out(f, BufferedWriter.class);
 304         } catch (FileNotFoundException x) {
 305             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", Locale.ITALIAN");
 306         } catch (UnsupportedEncodingException x) {
 307             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", Locale.ITALIAN");
 308         } catch (Exception x) {
 309             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-16BE\", Locale.ITALIAN");
 310         }
 311 
 312         String csn = Charset.defaultCharset().newEncoder().canEncode('\u00a3') ?
 313             "ASCII" : "ISO-8859-1";
 314         try {
 315             ByteArrayOutputStream bs[] = { new ByteArrayOutputStream(),
 316                                            new ByteArrayOutputStream(),
 317                                            new ByteArrayOutputStream()
 318             };
 319             new Formatter((Appendable)  new PrintStream(bs[0], true, csn)).format("\u00a3");
 320             new Formatter((OutputStream)new PrintStream(bs[1], true, csn)).format("\u00a3");
 321             new Formatter(              new PrintStream(bs[2], true, csn)).format("\u00a3");
 322             if (Arrays.equals(bs[0].toByteArray(), bs[1].toByteArray())) {
 323                 fail("arrays shouldn't match: " + bs[0].toByteArray());
 324             } else {
 325                 pass();
 326             }
 327             if (! Arrays.equals(bs[0].toByteArray(), bs[2].toByteArray())) {
 328                 fail("arrays should match: " + bs[0].toByteArray() + " != "
 329                      + bs[2].toByteArray());
 330             } else {
 331                 pass();
 332             }
 333         } catch (UnsupportedEncodingException x) {
 334             fail("new PrintStream(newByteArrayOutputStream, true, " + csn + ")", x);
 335         }
 336 
 337         // Formatter(OutputStream os)
 338         try {
 339             new Formatter((OutputStream) null);
 340             fail("new Formatter((OutputStream) null)");
 341         } catch (NullPointerException x) {
 342             pass();
 343         } catch (Exception x) {
 344             fail("new Formatter((OutputStream) null)", x);
 345         }
 346 
 347         try (Formatter f = new Formatter((OutputStream) new PrintStream("foo"))) {
 348             pass();
 349             locale(f);
 350             out(f, BufferedWriter.class);
 351         } catch (Exception x) {
 352             fail("new Formatter((OutputStream) new PrintStream(\"foo\")", x);
 353         }
 354 
 355         // Formatter(OutputStream os, String csn)
 356         try {
 357             new Formatter((OutputStream) null, "ISO-8859-1");
 358             fail("new Formatter((OutputStream) null, \"ISO-8859-1\")");
 359         } catch (NullPointerException x) {
 360             pass();
 361         } catch (Exception x) {
 362             fail("new Formatter((OutputStream) null, \"ISO-8859-1\")", x);
 363         }
 364 
 365         try (PrintStream ps = new PrintStream("foo")) {
 366             new Formatter((OutputStream) ps, null);
 367             fail("new Formatter((OutputStream) new PrintStream(\"foo\"), null");
 368         } catch (NullPointerException x) {
 369             pass();
 370         } catch (Exception x) {
 371             fail("new Formatter((OutputStream) new PrintStream(\"foo\"), null",
 372                  x);
 373         }
 374 
 375         try (PrintStream ps = new PrintStream("foo")) {
 376             new Formatter(ps, "bar");
 377             fail("new Formatter(new PrintStream(\"foo\"), \"bar\")");
 378         } catch (UnsupportedEncodingException x) {
 379             pass();
 380         } catch (Exception x) {
 381             fail("new Formatter(new PrintStream(\"foo\"), \"bar\")", x);
 382         }
 383 
 384         try (Formatter f = new Formatter(new PrintStream("foo"), "UTF-8")) {
 385             pass();
 386             locale(f);
 387             out(f, BufferedWriter.class);
 388         } catch (Exception x) {
 389             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-8\")", x);
 390         }
 391 
 392         // Formatter(OutputStream os, String csn, Locale l)
 393         try {
 394             new Formatter((OutputStream) null, "ISO-8859-1", Locale.UK);
 395             fail("new Formatter((OutputStream) null, \"ISO-8859-1\", Locale.UK)");
 396         } catch (NullPointerException x) {
 397             pass();
 398         } catch (Exception x) {
 399             fail("new Formatter((OutputStream) null, \"ISO-8859-1\", Locale.UK)",
 400                  x);
 401         }
 402 
 403         try (PrintStream ps = new PrintStream("foo")) {
 404             new Formatter(ps, null, Locale.UK);
 405             fail("new Formatter(new PrintStream(\"foo\"), null, Locale.UK)");
 406         } catch (NullPointerException x) {
 407             pass();
 408         } catch (Exception x) {
 409             fail("new Formatter(new PrintStream(\"foo\"), null, Locale.UK)",
 410                  x);
 411         }
 412 
 413         try (PrintStream ps = new PrintStream("foo")) {
 414             new Formatter(ps, "bar", Locale.UK);
 415             fail("new Formatter(new PrintStream(\"foo\"), \"bar\", Locale.UK)");
 416         } catch (UnsupportedEncodingException x) {
 417             pass();
 418         } catch (Exception x) {
 419             fail("new Formatter(new PrintStream(\"foo\"), \"bar\", Locale.UK)",
 420                  x);
 421         }
 422 
 423         try (Formatter f = new Formatter(new PrintStream("foo"), "UTF-8", Locale.UK)) {
 424             pass();
 425             out(f, BufferedWriter.class);
 426             locale(f, Locale.UK);
 427         } catch (Exception x) {
 428             fail("new Formatter(new PrintStream(\"foo\"), \"UTF-8\"), Locale.UK",
 429                  x);
 430         }
 431 
 432         // PrintStream(String fileName)
 433         try (PrintStream ps = new PrintStream("foo")) {
 434             pass();
 435         } catch (Exception x) {
 436             fail("new PrintStream(\"foo\")", x);
 437         }
 438 
 439         // PrintStream(String fileName, String csn)
 440         try {
 441             new PrintStream("foo", null);
 442             fail("new PrintStream(\"foo\", null)");
 443         } catch (NullPointerException x) {
 444             pass();
 445         } catch (Exception x) {
 446             fail("new PrintStream(\"foo\", null)", x);
 447         }
 448 
 449         // PrintStream(File file)
 450         try (PrintStream ps = new PrintStream(new File("foo"))) {
 451             pass();
 452         } catch (Exception x) {
 453             fail("new PrintStream(new File(\"foo\"))", x);
 454         }
 455 
 456         // PrintStream(File file, String csn)
 457         try {
 458             new PrintStream(new File("foo"), null);
 459             fail("new PrintStream(new File(\"foo\"), null)");
 460         } catch (NullPointerException x) {
 461             pass();
 462         } catch (Exception x) {
 463             fail("new PrintStream(new File(\"foo\"), null)", x);
 464         }
 465 
 466         // PrintWriter(String fileName)
 467         try (PrintWriter pw = new PrintWriter("foo")) {
 468             pass();
 469         } catch (Exception x) {
 470             fail("new PrintWriter(\"foo\")", x);
 471         }
 472 
 473         // PrintWriter(String fileName, String csn)
 474         try {
 475             new PrintWriter("foo", null);
 476             fail("new PrintWriter(\"foo\"), null");
 477         } catch (NullPointerException x) {
 478             pass();
 479         } catch (Exception x) {
 480             fail("new PrintWriter(\"foo\"), null", x);
 481         }
 482 
 483         // PrintWriter(File file)
 484         try (PrintWriter pw = new PrintWriter(new File("foo"))) {
 485             pass();
 486         } catch (Exception x) {
 487             fail("new PrintWriter(new File(\"foo\"))", x);
 488         }
 489 
 490         // PrintWriter(File file, String csn)
 491         try {
 492             new PrintWriter(new File("foo"), null);
 493             fail("new PrintWriter(new File(\"foo\")), null");
 494         } catch (NullPointerException x) {
 495             pass();
 496         } catch (Exception x) {
 497             fail("new PrintWriter(new File(\"foo\")), null", x);
 498         }
 499 
 500         if (fail != 0)
 501             throw new RuntimeException((fail + pass) + " tests: "
 502                                        + fail + " failure(s), first", first);
 503         else
 504             System.out.println("all " + (fail + pass) + " tests passed");
 505     }
 506 }