< prev index next >

test/jdk/java/text/Format/ChoiceFormat/Bug8001209.java

Print this page
*** 1,7 ***
  /*
!  * Copyright (c) 2012, 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.
--- 1,7 ---
  /*
!  * Copyright (c) 2012, 2023, 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.

*** 19,72 ***
   * 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 8001209
   * @summary Confirm that the values set by setChoices() are not mutable.
   */
! import java.text.*;
  
  public class Bug8001209 {
  
!     public static void main(String[] args) throws Exception {
!         boolean err = false;
  
!         // Borrow an example in API doc
!         double[] limits = {1,2,3,4,5,6,7};
!         String[] dayOfWeekNames = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
!         ChoiceFormat form = new ChoiceFormat(limits, dayOfWeekNames);
!         ParsePosition status = new ParsePosition(0);
  
          StringBuilder before = new StringBuilder();
          for (double i = 1.0; i <= 7.0; ++i) {
              status.setIndex(0);
!             String s = form.format(i);
              before.append(" ");
              before.append(s);
!             before.append(form.parse(form.format(i),status));
          }
!         String original = before.toString();
  
!         double[] newLimits = form.getLimits();
!         String[] newFormats = (String[])form.getFormats();
          newFormats[6] = "Doyoubi";
          StringBuilder after = new StringBuilder();
          for (double i = 1.0; i <= 7.0; ++i) {
              status.setIndex(0);
!             String s = form.format(i);
              after.append(" ");
              after.append(s);
!             after.append(form.parse(form.format(i),status));
-         }
-         if (!original.equals(after.toString())) {
-             err = true;
-             System.err.println("  Expected:" + before
-                                + "\n  Got:     " + after);
          }
  
!         dayOfWeekNames[6] = "Saturday";
!         after = new StringBuilder();
          for (double i = 1.0; i <= 7.0; ++i) {
              status.setIndex(0);
!             String s = form.format(i);
              after.append(" ");
              after.append(s);
!             after.append(form.parse(form.format(i),status));
-         }
-         if (!original.equals(after.toString())) {
-             err = true;
-             System.err.println("  Expected:" + before
-                                + "\n  Got:     " + after);
-         }
- 
-         if (err) {
-             throw new RuntimeException("Failed.");
-         } else {
-             System.out.println("Passed.");
          }
      }
  }
--- 19,92 ---
   * 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 8001209
   * @summary Confirm that the values set by setChoices() are not mutable.
+  * @run junit Bug8001209
   */
! 
+ import java.text.ChoiceFormat;
+ import java.text.ParsePosition;
+ 
+ import org.junit.jupiter.api.BeforeAll;
+ import org.junit.jupiter.api.Test;
+ 
+ import static org.junit.jupiter.api.Assertions.assertEquals;
  
  public class Bug8001209 {
  
!     // Represents the expected output of formatting the ChoiceFormat
!     private static String expectedFormattedOutput;
+     private static ChoiceFormat cFmt;
+     private static ParsePosition status;
+     private static String[] originalSetterArray;
  
!     // Build the original ChoiceFormat to test if it can be mutated
!     @BeforeAll
!     static void setUpChoiceFormatAndOutput() {
!         double[] limits = {1, 2, 3, 4, 5, 6, 7};
!         originalSetterArray = new String[]{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
+         // Constructor calls setChoices
+         cFmt = new ChoiceFormat(limits, originalSetterArray);
+         status = new ParsePosition(0);
  
+         // Build the expected results of formatting with the original ChoiceFormat
          StringBuilder before = new StringBuilder();
          for (double i = 1.0; i <= 7.0; ++i) {
              status.setIndex(0);
!             String s = cFmt.format(i);
              before.append(" ");
              before.append(s);
!             before.append(cFmt.parse(cFmt.format(i), status));
          }
!         expectedFormattedOutput = before.toString();
+     }
  
!     /*
!      * Ensure that mutating the arrays returned by getChoices and getLimits does
+      * not affect the internal representation of the ChoiceFormat.
+      */
+     @Test
+     public void immutableArraysFromGetters() {
+         // Modify the array returned by getFormats() -> newFormats
+         String[] newFormats = (String[]) cFmt.getFormats();
          newFormats[6] = "Doyoubi";
          StringBuilder after = new StringBuilder();
          for (double i = 1.0; i <= 7.0; ++i) {
              status.setIndex(0);
!             String s = cFmt.format(i);
              after.append(" ");
              after.append(s);
!             after.append(cFmt.parse(cFmt.format(i), status));
          }
+         // Compare the expected results with the new formatted results
+         assertEquals(after.toString(), expectedFormattedOutput,
+                 "Mutating array returned from getter changed internals of ChoiceFormat");
+     }
  
!     /*
!      * Ensure that mutating the arrays passed to setChoices/constructor does
+      * not affect the internal representation of the ChoiceFormat.
+      */
+     @Test
+     public void immutableArraysFromSetter() {
+         // Modify the array passed to setFormats() -> dayOfWeekNames
+         originalSetterArray[6] = "Saturday";
+         StringBuilder after = new StringBuilder();
          for (double i = 1.0; i <= 7.0; ++i) {
              status.setIndex(0);
!             String s = cFmt.format(i);
              after.append(" ");
              after.append(s);
!             after.append(cFmt.parse(cFmt.format(i), status));
          }
+         // Compare the expected results with the new formatted results
+         assertEquals(after.toString(), expectedFormattedOutput,
+                 "Mutating array passed to setter changed internals of ChoiceFormat");
      }
  }
< prev index next >