Fixes issue #591 (http://code.google.com/p/google-web-toolkit/issues/detail?id=591) and adds a regression test to StringBufferTest. Also contains some formatting and cleanup.

Patch by: tobyr
Review by: me


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@816 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/lang/StringBuffer.java b/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
index f07b78f..42bc3c3 100644
--- a/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
+++ b/user/super/com/google/gwt/emul/java/lang/StringBuffer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2006 Google Inc.
+ * Copyright 2007 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -73,14 +73,17 @@
   }
 
   public native StringBuffer append(String toAppend) /*-{
-    var last = this.js.length-1;
-    var lastLength=this.js[last].length;
-    if(this.length > lastLength*lastLength) {
-      this.js[last]=this.js[last]+toAppend; 
+    if ( toAppend === null ) {
+      toAppend = 'null';
+    }
+    var last = this.js.length - 1;
+    var lastLength = this.js[last].length;
+    if(this.length > lastLength * lastLength) {
+      this.js[last] = this.js[last] + toAppend;
     } else {
       this.js.push(toAppend);
     }
-    this.length+=toAppend.length;
+    this.length += toAppend.length;
     return this;
   }-*/;
 
@@ -171,7 +174,7 @@
     start = Math.max(Math.min(this.length,start),0);
     end = Math.max(Math.min(this.length,end),0);
     this.length = this.length - end + start + toInsert.length;
-    var i=0;
+    var i = 0;
     // Searching for the start
     var len = this.js[i].length;
     while(i < this.js.length && len < start) {
@@ -199,7 +202,7 @@
 
     // making sure that end falls between two chunks
     if(end > 0) {
-      this.js[startOfDelete]=this.js[startOfDelete].substring(end);
+      this.js[startOfDelete] = this.js[startOfDelete].substring(end);
     }
 
     this.js.splice(startOfDelete,0,toInsert);
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java b/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
index e5c26c0..a8c86c0 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringBufferTest.java
@@ -22,128 +22,14 @@
  */
 public class StringBufferTest extends GWTTestCase {
 
-  public StringBufferTest() {
-    testAppend();
-  }
-
   /**
-   * This method does interleaved inserts and deletes.
+   * This method gets the module name.
+   *
+   * @return the module name.
+   * @see com.google.gwt.junit.client.GWTTestCase#getModuleName()
    */
-  public void testInterleavedInsertAndDelete() {
-    StringBuffer x = new StringBuffer();
-    for (int i = 0; i < 9; i++) {
-      x.append("1234567890");
-    }
-    for (int i = 0; i < 10; i++) {
-      x.delete(5, 15);
-    }
-    assertEquals(x.toString(), "12345");
-  }
-
-
-  /**
-   * Tests correctness under repeated insertion and append.
-   */
-  public void testRepeatedAppendsAndInserts() {
-    StringBuffer x = new StringBuffer();
-    final int SIZE = 1000;
-    for (int i = 0; i < SIZE; i++) {
-      x.append("" + i % 10);
-    }
-    assertTrue("endwith1", x.toString().endsWith("0123456789"));
-    assertTrue("startswith1", x.toString().startsWith("0123456789"));
-    assertEquals(x.length(), SIZE);
-    x = new StringBuffer();
-    for (int i = 0; i < SIZE * 4; i++) {
-      x.append("" + i % 10);
-    }
-    assertTrue("endswith2", x.toString().endsWith("0123456789"));
-    assertTrue("startswith2", x.toString().startsWith("0123456789"));
-    assertEquals("length2", x.length(), SIZE * 4);
-    x = new StringBuffer();
-    for (int i = 0; i < SIZE; i++) {
-      x.insert(0, "" + i % 10);
-    }
-    assertTrue("endswith3", x.toString().endsWith("9876543210"));
-    assertTrue("startswith3", x.toString().startsWith("9876543210"));
-    assertEquals("length3", x.length(), SIZE);
-    x = new StringBuffer();
-    for (int i = 0; i < SIZE * 4; i++) {
-      x.insert(0, "" + i % 10);
-    }
-    assertTrue("endswith4", x.toString().endsWith("9876543210"));
-    assertTrue("startswith4", x.toString().startsWith("9876543210"));
-    assertEquals("size4", x.length(), SIZE * 4);
-  }
-
-  /**
-   * This method tests string creation and equality.
-   */
-  public void testContructor() {
-    String constant = "abcdef";
-    assertEquals(new StringBuffer(constant).toString(), constant);
-    assertEquals(new StringBuffer().toString(), "");
-  }
-
-  /**
-   * This method tests <code>ubstring</code>.
-   */
-  public void testSubstring() {
-    StringBuffer haystack = new StringBuffer("abcdefghi");
-    assertEquals("cd", haystack.substring(2, 4));
-    assertEquals("bc", "abcdef".substring(1, 3));
-    assertEquals("bcdef", "abcdef".substring(1));
-  }
-
-  /**
-   * This method tests <code>delete</code>.
-   */
-  public void testDelete() {
-    StringBuffer haystack = new StringBuffer("abcdefghi");
-    haystack.delete(2, 4);
-    assertEquals(haystack.toString(), "abefghi");
-    haystack.deleteCharAt(0);
-    assertEquals(haystack.toString(), "befghi");
-    haystack.deleteCharAt(1);
-    assertEquals(haystack.toString(), "bfghi");
-  }
-
-  /**
-   * This method tests <code>length</code>, and tests moderately long
-   * StringBuffers.
-   */
-  public void testLength() {
-    assertEquals(3, new StringBuffer("abc").length());
-    StringBuffer str = new StringBuffer("x");
-    for (int i = 0; i < 16; i++) {
-      str.append(str);
-    }
-    assertEquals(1 << 16, str.length());
-  }
-
-  /**
-   * This method tests <code>startsWith</code>.
-   */
-  public void testStartsWith() {
-    String haystack = "abcdefghi";
-    assertTrue(haystack.startsWith("abc"));
-    assertTrue(haystack.startsWith("bc", 1));
-    assertTrue(haystack.startsWith(haystack));
-    assertFalse(haystack.startsWith(haystack + "j"));
-  }
-
-  /**
-   * This method tests <code>indexOf</code>.
-   */
-  public void testIndexOf() {
-    String haystack = "abcdefghi";
-    assertEquals(haystack.indexOf("q"), -1);
-    assertEquals(haystack.indexOf('q'), -1);
-    assertEquals(haystack.indexOf("a"), 0);
-    assertEquals(haystack.indexOf('a'), 0);
-    assertEquals(haystack.indexOf('a', 1), -1);
-    assertEquals(haystack.indexOf("bc"), 1);
-    assertEquals(haystack.indexOf(""), 0);
+  public String getModuleName() {
+    return "com.google.gwt.emultest.EmulSuite";
   }
 
   /**
@@ -177,8 +63,66 @@
     x = new StringBuffer();
     x.append(C.TRUE_VALUE);
     assertEquals(C.TRUE_STRING, x.toString());
+    x = new StringBuffer();
+    x.append((String) null);
+    assertEquals("null", x.toString());
   }
 
+  /**
+   * This method tests <code>charAt</code>.
+   */
+  public void testCharAt() {
+    assertEquals(new StringBuffer("abc").charAt(1), 'b');
+  }
+
+  /**
+   * This method tests string creation and equality.
+   */
+  public void testContructor() {
+    String constant = "abcdef";
+    assertEquals(new StringBuffer(constant).toString(), constant);
+    assertEquals(new StringBuffer().toString(), "");
+  }
+
+  /**
+   * This method tests <code>delete</code>.
+   */
+  public void testDelete() {
+    StringBuffer haystack = new StringBuffer("abcdefghi");
+    haystack.delete(2, 4);
+    assertEquals(haystack.toString(), "abefghi");
+    haystack.deleteCharAt(0);
+    assertEquals(haystack.toString(), "befghi");
+    haystack.deleteCharAt(1);
+    assertEquals(haystack.toString(), "bfghi");
+  }
+
+  /**
+   * Tests toCharArray.
+   */
+  public void testGetChars() {
+    StringBuffer x = new StringBuffer("ABCDEFGHIJ");
+    char[] a1 = "abcdefghij".toCharArray();
+    char[] desired = "abcDEFghij".toCharArray();
+    x.getChars(3, 6, a1, 3);
+    for (int i = 0; i < a1.length; i++) {
+      assertEquals(a1[i], desired[i]);
+    }
+  }
+
+  /**
+   * This method tests <code>indexOf</code>.
+   */
+  public void testIndexOf() {
+    String haystack = "abcdefghi";
+    assertEquals(haystack.indexOf("q"), -1);
+    assertEquals(haystack.indexOf('q'), -1);
+    assertEquals(haystack.indexOf("a"), 0);
+    assertEquals(haystack.indexOf('a'), 0);
+    assertEquals(haystack.indexOf('a', 1), -1);
+    assertEquals(haystack.indexOf("bc"), 1);
+    assertEquals(haystack.indexOf(""), 0);
+  }
 
   /**
    * This method tests <code>insert</code>.
@@ -214,12 +158,17 @@
   }
 
   /**
-   * This method tests <code>toLowerCase</code>.
+   * This method does interleaved inserts and deletes.
    */
-  public void testLowerCase() {
-    assertEquals("abc", "AbC".toLowerCase());
-    assertEquals("abc", "abc".toLowerCase());
-    assertEquals("", "".toLowerCase());
+  public void testInterleavedInsertAndDelete() {
+    StringBuffer x = new StringBuffer();
+    for (int i = 0; i < 9; i++) {
+      x.append("1234567890");
+    }
+    for (int i = 0; i < 10; i++) {
+      x.delete(5, 15);
+    }
+    assertEquals(x.toString(), "12345");
   }
 
   /**
@@ -232,6 +181,62 @@
     assertEquals(-1, x.lastIndexOf("f", 1));
   }
 
+  /**
+   * This method tests <code>length</code>, and tests moderately long
+   * StringBuffers.
+   */
+  public void testLength() {
+    assertEquals(3, new StringBuffer("abc").length());
+    StringBuffer str = new StringBuffer("x");
+    for (int i = 0; i < 16; i++) {
+      str.append(str);
+    }
+    assertEquals(1 << 16, str.length());
+  }
+
+  /**
+   * This method tests <code>toLowerCase</code>.
+   */
+  public void testLowerCase() {
+    assertEquals("abc", "AbC".toLowerCase());
+    assertEquals("abc", "abc".toLowerCase());
+    assertEquals("", "".toLowerCase());
+  }
+
+  /**
+   * Tests correctness under repeated insertion and append.
+   */
+  public void testRepeatedAppendsAndInserts() {
+    StringBuffer x = new StringBuffer();
+    final int size = 1000;
+    for (int i = 0; i < size; i++) {
+      x.append("" + i % 10);
+    }
+    assertTrue("endwith1", x.toString().endsWith("0123456789"));
+    assertTrue("startswith1", x.toString().startsWith("0123456789"));
+    assertEquals(x.length(), size);
+    x = new StringBuffer();
+    for (int i = 0; i < size * 4; i++) {
+      x.append("" + i % 10);
+    }
+    assertTrue("endswith2", x.toString().endsWith("0123456789"));
+    assertTrue("startswith2", x.toString().startsWith("0123456789"));
+    assertEquals("length2", x.length(), size * 4);
+    x = new StringBuffer();
+    for (int i = 0; i < size; i++) {
+      x.insert(0, "" + i % 10);
+    }
+    assertTrue("endswith3", x.toString().endsWith("9876543210"));
+    assertTrue("startswith3", x.toString().startsWith("9876543210"));
+    assertEquals("length3", x.length(), size);
+    x = new StringBuffer();
+    for (int i = 0; i < size * 4; i++) {
+      x.insert(0, "" + i % 10);
+    }
+    assertTrue("endswith4", x.toString().endsWith("9876543210"));
+    assertTrue("startswith4", x.toString().startsWith("9876543210"));
+    assertEquals("size4", x.length(), size * 4);
+  }
 
   /**
    * This method tests <code>replace</code>.
@@ -243,24 +248,6 @@
   }
 
   /**
-   * This method tests <code>charAt</code>.
-   */
-  public void testCharAt() {
-    assertEquals(new StringBuffer("abc").charAt(1), 'b');
-  }
-
-  /** tests toCharArray */
-  public void testGetChars() {
-    StringBuffer x = new StringBuffer("ABCDEFGHIJ");
-    char[] a1 = "abcdefghij".toCharArray();
-    char[] desired = "abcDEFghij".toCharArray();
-    x.getChars(3, 6, a1, 3);
-    for (int i = 0; i < a1.length; i++) {
-      assertEquals(a1[i], desired[i]);
-    }
-  }
-
-  /**
    * This method tests <code>setLength</code>.
    */
   public void testSetLength() {
@@ -273,16 +260,24 @@
     assertEquals(x.toString(), "abcde");
   }
 
-
   /**
-   * This method gets the module name.
-   * 
-   * @return the module name.
-   * @see com.google.gwt.junit.client.GWTTestCase#getModuleName()
+   * This method tests <code>startsWith</code>.
    */
-  public String getModuleName() {
-    return "com.google.gwt.emultest.EmulSuite";
+  public void testStartsWith() {
+    String haystack = "abcdefghi";
+    assertTrue(haystack.startsWith("abc"));
+    assertTrue(haystack.startsWith("bc", 1));
+    assertTrue(haystack.startsWith(haystack));
+    assertFalse(haystack.startsWith(haystack + "j"));
   }
 
-
-}
\ No newline at end of file
+  /**
+   * This method tests <code>ubstring</code>.
+   */
+  public void testSubstring() {
+    StringBuffer haystack = new StringBuffer("abcdefghi");
+    assertEquals("cd", haystack.substring(2, 4));
+    assertEquals("bc", "abcdef".substring(1, 3));
+    assertEquals("bcdef", "abcdef".substring(1));
+  }
+}