]> source.dussan.org Git - poi.git/commitdiff
FindBugs fix
authorAndreas Beeker <kiwiwings@apache.org>
Sun, 9 Feb 2014 21:19:20 +0000 (21:19 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sun, 9 Feb 2014 21:19:20 +0000 (21:19 +0000)
- fixed "Class defines equals() and uses Object.hashCode()"
- see http://findbugs.sourceforge.net/bugDescriptions.html#HE_EQUALS_USE_HASHCODE
- implemented UnicodeString.ExtRst.hashCode() + junit-test

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1566427 13f79535-47bb-0310-9956-ffa450edef68

27 files changed:
build.xml
src/java/org/apache/poi/hssf/record/HyperlinkRecord.java
src/java/org/apache/poi/hssf/record/common/UnicodeString.java
src/java/org/apache/poi/hssf/usermodel/HSSFChildAnchor.java
src/java/org/apache/poi/hssf/usermodel/HSSFClientAnchor.java
src/java/org/apache/poi/hssf/usermodel/HSSFRichTextString.java
src/java/org/apache/poi/hssf/usermodel/HSSFRow.java
src/java/org/apache/poi/ss/util/CellReference.java
src/java/org/apache/poi/ss/util/Region.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
src/scratchpad/src/org/apache/poi/hwpf/model/Ffn.java
src/scratchpad/src/org/apache/poi/hwpf/model/FontTable.java
src/scratchpad/src/org/apache/poi/hwpf/model/ListLevel.java
src/scratchpad/src/org/apache/poi/hwpf/model/PAPX.java
src/scratchpad/src/org/apache/poi/hwpf/model/ParagraphHeight.java
src/scratchpad/src/org/apache/poi/hwpf/model/SEPX.java
src/scratchpad/src/org/apache/poi/hwpf/model/SectionDescriptor.java
src/scratchpad/src/org/apache/poi/hwpf/model/StyleSheet.java
src/scratchpad/src/org/apache/poi/hwpf/model/TextPiece.java
src/scratchpad/src/org/apache/poi/hwpf/model/UPX.java
src/scratchpad/src/org/apache/poi/hwpf/sprm/SprmBuffer.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/BorderCode.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/DateAndTime.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/LineSpacingDescriptor.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/SectionProperties.java
src/testcases/org/apache/poi/hssf/record/AllRecordTests.java
src/testcases/org/apache/poi/hssf/record/common/TestUnicodeString.java

index 1c7a10319a530229bcd625d12f7afa19eb3464b2..51bdf764fa34711741d85a2ca54fc3858a118a8b 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -884,7 +884,7 @@ under the License.
                   <classpath refid="@{classpath}"/>
                   <syspropertyset refid="junit.properties"/>
                   <jvmarg value="${poi.test.locale}"/>
-    <!--              <jvmarg value="-ea"/> -->
+                  <jvmarg value="-ea"/>
                   <formatter type="plain"/>
                   <formatter type="xml"/>
                   <batchtest todir="${ooxml.reports.test}">
index f13d7f0eb434a4ec71b0ef51aa8717793b9da202..026f99754be83409cc7e8853ca8773b54e9210ed 100644 (file)
@@ -90,7 +90,13 @@ public final class HyperlinkRecord extends StandardRecord {
                            && _d3 == other._d3 && _d4 == other._d4;
                }
 
-               public int getD1() {
+       @Override
+       public int hashCode() {
+           assert false : "hashCode not designed";
+           return 42; // any arbitrary constant will do
+       }
+
+       public int getD1() {
                        return _d1;
                }
 
index 9e9ca039251027ff5ecb419bd4a053cab9f274c0..a9ba7b5ea42634925a03d0dd3d9e2ca07c4967dd 100644 (file)
 package org.apache.poi.hssf.record.common;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.poi.hssf.record.cont.ContinuableRecordInput;
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.record.cont.ContinuableRecordInput;
 import org.apache.poi.hssf.record.cont.ContinuableRecordOutput;
-import org.apache.poi.util.*;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.LittleEndianInput;
+import org.apache.poi.util.LittleEndianOutput;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.StringUtil;
 
 /**
  * Title: Unicode String<p/>
@@ -88,6 +95,12 @@ public class UnicodeString implements Comparable<UnicodeString> { // TODO - make
             return _character - r._character;
         }
 
+        @Override
+        public int hashCode() {
+            assert false : "hashCode not designed";
+            return 42; // any arbitrary constant will do
+        }
+
         public String toString() {
             return "character="+_character+",fontIndex="+_fontIndex;
         }
@@ -248,17 +261,33 @@ public class UnicodeString implements Comparable<UnicodeString> { // TODO - make
              if(result != 0) return result;
              result = phRuns[i].realTextFirstCharacterOffset - o.phRuns[i].realTextFirstCharacterOffset;
              if(result != 0) return result;
-             result = phRuns[i].realTextFirstCharacterOffset - o.phRuns[i].realTextLength;
+             result = phRuns[i].realTextLength - o.phRuns[i].realTextLength;
              if(result != 0) return result;
           }
           
-          result = extraData.length - o.extraData.length;
-          if(result != 0) return result;
+          result = Arrays.hashCode(extraData)-Arrays.hashCode(o.extraData);
           
-          // If we get here, it's the same
-          return 0;
+          return result;
        }
-       
+
+       @Override
+       public int hashCode() {
+           int hash = reserved;
+           hash = 31*hash+formattingFontIndex;
+           hash = 31*hash+formattingOptions;
+           hash = 31*hash+numberOfRuns;
+           hash = 31*hash+phoneticText.hashCode();
+
+           if (phRuns != null) {
+               for (PhRun ph : phRuns) {
+                   hash = 31*hash+ph.phoneticTextFirstCharacterOffset;
+                   hash = 31*hash+ph.realTextFirstCharacterOffset;
+                   hash = 31*hash+ph.realTextLength;
+               }
+           }
+           return hash;
+       }
+
        protected ExtRst clone() {
           ExtRst ext = new ExtRst();
           ext.reserved = reserved;
index be69c2a98dce5aadcf6eb705af0eb744c5f0abd8..a7a88c6b6b125055949cf39ce6ce00ca5c40ce38 100644 (file)
@@ -140,4 +140,10 @@ public final class HSSFChildAnchor extends HSSFAnchor {
         return anchor.getDx1() == getDx1() && anchor.getDx2() == getDx2() && anchor.getDy1() == getDy1()
                 && anchor.getDy2() == getDy2();
     }
+
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
 }
index b1df28f22144fe61f8f6f1dce3ba0c336a3db164..0a65bbd8ffe4b0c7358783f57cb1b085938399b7 100644 (file)
@@ -274,6 +274,12 @@ public final class HSSFClientAnchor extends HSSFAnchor implements ClientAnchor {
                 && anchor.getRow1() == getRow1() && anchor.getRow2() == getRow2() && anchor.getAnchorType() == getAnchorType();
     }
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+      }
+
     @Override
     public int getDx1() {
         return _escherClientAnchor.getDx1();
index 434b7eff3498220b43d7d21ec45273ce2f370974..76572de746256407216774e2905eea22329e2759 100644 (file)
@@ -301,6 +301,7 @@ public final class HSSFRichTextString implements Comparable<HSSFRichTextString>,
        return _string.compareTo(r._string);
     }
 
+    @Override
     public boolean equals(Object o) {
       if (o instanceof HSSFRichTextString) {
         return _string.equals(((HSSFRichTextString)o)._string);
@@ -309,6 +310,13 @@ public final class HSSFRichTextString implements Comparable<HSSFRichTextString>,
 
     }
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
+
+    
     /**
      * @return  the plain text representation of this string.
      */
index 6f6340afa30910717010ea17e8f95d841fb25fbb..1ef2acfc7431aedfc55264fb4f8ed0af215401ea 100644 (file)
@@ -23,10 +23,10 @@ import java.util.NoSuchElementException;
 import org.apache.poi.hssf.record.CellValueRecordInterface;
 import org.apache.poi.hssf.record.ExtendedFormatRecord;
 import org.apache.poi.hssf.record.RowRecord;
+import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.SpreadsheetVersion;
 import org.apache.poi.util.Configurator;
 
 /**
@@ -684,6 +684,7 @@ public final class HSSFRow implements Row {
         return -1;
     }
 
+    @Override
     public boolean equals(Object obj)
     {
         if (!(obj instanceof HSSFRow))
@@ -698,4 +699,10 @@ public final class HSSFRow implements Row {
         }
         return false;
     }
+
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
 }
index b43eb1bfc663ed1c25f804a363b8f5f641511d3e..0b063ec8b12d1e5dc6d6784759faef56c0a8fe02 100644 (file)
@@ -517,4 +517,10 @@ public class CellReference {
                        && _isRowAbs == cr._isColAbs
                        && _isColAbs == cr._isColAbs;
        }
+
+       @Override
+       public int hashCode() {
+           assert false : "hashCode not designed";
+           return 42; // any arbitrary constant will do
+       }
 }
index d0c373838c2b23979faab81f961afb4e63793bfc..b39681917ab5871c211e0a89bd368d3b9268c3fc 100644 (file)
@@ -164,6 +164,14 @@ public class Region implements Comparable<Region> {
                return (compareTo(r) == 0);
        }
 
+
+       @Override
+       public int hashCode() {
+           assert false : "hashCode not designed";
+           return 42; // any arbitrary constant will do
+       }
+
+       
        /**
         * Compares that the given region is the same less than or greater than this
         * region.  If any regional coordiant passed in is less than this regions
index d1c7035160a1a153cc7cfada6871149940d44fd5..14dbaff14d5516c57ffcb9224b981d7bf849b70f 100644 (file)
@@ -172,6 +172,12 @@ public final class XSSFClientAnchor extends XSSFAnchor implements ClientAnchor {
 
     }
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
+
     @Override
     public String toString(){
         return "from : " + cell1.toString()  + "; to: " + cell2.toString();
index e4b4e61f4d36669958517964028e6f6d396a4431..6c8666f7aa50eee0457eff5db946f883ff293ac6 100644 (file)
@@ -181,7 +181,8 @@ public final class Ffn
 
   }
 
-    public boolean equals(Object o)
+  @Override
+  public boolean equals(Object o)
     {
     boolean retVal = true;
 
@@ -227,6 +228,11 @@ public final class Ffn
   }
 
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
 }
 
 
index 55bad615a063df3150dd4a97f543a973a61285dd..0abd236a0766ff8b3ee7f1d68f64864304b91625 100644 (file)
@@ -137,6 +137,7 @@ public final class FontTable
 
   }
 
+  @Override
   public boolean equals(Object o)
   {
        boolean retVal = true;
@@ -162,8 +163,10 @@ public final class FontTable
          return retVal;
   }
 
-
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
 
 }
-
-
index 7bdd1fcd9a40366316ecc5250653a0d378c3ec3c..3de08d8d433276a445c72c223cd0a393ac8c2657 100644 (file)
@@ -101,6 +101,7 @@ public final class ListLevel
         _xst = new Xst(numberText);
     }
 
+    @Override
     public boolean equals( Object obj )
     {
         if ( obj == null )
@@ -113,6 +114,12 @@ public final class ListLevel
                 && lvl._xst.equals( this._xst );
     }
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+      }
+
     /**
      * "Alignment (left, right, or centered) of the paragraph number."
      */
index bfaa8a9e3180bcfcee1aefd5544f93ca0a6ba242..837b83b97fc743d70aebe31ac3502579130117cb 100644 (file)
@@ -155,6 +155,7 @@ public final class PAPX extends BytePropertyNode<PAPX> {
     return props;
   }
 
+  @Override
   public boolean equals(Object o)
   {
     if (super.equals(o))
@@ -164,6 +165,12 @@ public final class PAPX extends BytePropertyNode<PAPX> {
     return false;
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+
     public String toString()
     {
         return "PAPX from " + getStart() + " to " + getEnd() + " (in bytes "
index 993f1a21b6bc29eb80bfc4d61a1716e36ddd5881..8cff9a5c6437a654dc35a247d186e502c0be6c6f 100644 (file)
@@ -81,4 +81,11 @@ public final class ParagraphHeight
     return infoField == ph.infoField && reserved == ph.reserved &&
            dxaCol == ph.dxaCol && dymLineOrHeight == ph.dymLineOrHeight;
   }
+
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+
 }
index 4e1c0ce73f07d6d2561a0cd1c337c419a90e1136..ccf56cfe053ba98a7e5cf50b5823f121843e42f1 100644 (file)
@@ -64,6 +64,7 @@ public final class SEPX extends PropertyNode<SEPX>
         return sectionProperties;
     }
 
+    @Override
     public boolean equals( Object o )
     {
         SEPX sepx = (SEPX) o;
@@ -74,6 +75,12 @@ public final class SEPX extends PropertyNode<SEPX>
         return false;
     }
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
+
     public String toString()
     {
         return "SEPX from " + getStart() + " to " + getEnd();
index 0486fa8517c013d62e346cdaa59787439762e209..bdddac7f3e6cadefa60ec586fb874591b1a6ebd1 100644 (file)
@@ -77,12 +77,19 @@ public final class SectionDescriptor
     this.fcSepx = fc;
   }
 
+  @Override
   public boolean equals(Object o)
   {
     SectionDescriptor sed = (SectionDescriptor)o;
     return sed.fn == fn && sed.fnMpr == fnMpr;
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+  
   public byte[] toByteArray()
   {
     int offset = 0;
index c6891a7e3d40087945bb0e6cf67142e360b1f365..98df05f956c92346c6ce859a45a950a7c3cbb88d 100644 (file)
@@ -174,6 +174,8 @@ public final class StyleSheet implements HDFType {
       }
     }
   }
+
+  @Override
   public boolean equals(Object o)
   {
     StyleSheet ss = (StyleSheet)o;
@@ -199,6 +201,13 @@ public final class StyleSheet implements HDFType {
     }
     return false;
   }
+
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+
   /**
    * Creates a PartagraphProperties object from a papx stored in the
    * StyleDescription at the index istd in the StyleDescription array. The PAP
index 42e4b3793d7bf562cc6a36a4dec69b50569f0c4a..0c3e8c37252b214daf287c7cdfb22b8eccf5e338 100644 (file)
@@ -201,6 +201,7 @@ public class TextPiece extends PropertyNode<TextPiece>
           return (getEnd() - getStart()) * (_usesUnicode ? 2 : 1);
    }
 
+   @Override
    public boolean equals(Object o)
    {
      if (limitsAreEqual(o))
@@ -212,6 +213,12 @@ public class TextPiece extends PropertyNode<TextPiece>
      return false;
    }
 
+   @Override
+   public int hashCode() {
+       assert false : "hashCode not designed";
+       return 42; // any arbitrary constant will do
+   }
+
 
    /**
     * Returns the character position we start at.
index 69214348c628add71f0c74a11520bf08fdeb624a..95dd00bc30281f31ab0b697dd20b64813d3ffc8f 100644 (file)
@@ -40,12 +40,19 @@ public final class UPX
     return _upx.length;
   }
 
+  @Override
   public boolean equals(Object o)
   {
     UPX upx = (UPX)o;
     return Arrays.equals(_upx, upx._upx);
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+
     @Override
     public String toString()
     {
index a41b525a2c82904761f7c6d998dad51360869560..440c666403e79ae416318adf3179d54617dfeed1 100644 (file)
@@ -150,12 +150,20 @@ public final class SprmBuffer implements Cloneable
         _buf = newBuf;
     }
 }
+
+  @Override
   public boolean equals(Object obj)
   {
     SprmBuffer sprmBuf = (SprmBuffer)obj;
     return (Arrays.equals(_buf, sprmBuf._buf));
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+
   public SprmOperation findSprm( short opcode )
 {
     int operation = SprmOperation.getOperationFromOpcode( opcode );
index 4526c052fa609e8d1f1e92ac875347ebd1870728..47e3b352f9d4de3d4bb3e6a2a62525114a9bff8b 100644 (file)
@@ -68,12 +68,19 @@ public final class BorderCode implements Cloneable {
     return _info == 0 && _info2 == 0 || _info == -1;
   }
 
+  @Override
   public boolean equals(Object o)
   {
     BorderCode brc = (BorderCode)o;
     return _info == brc._info && _info2 == brc._info2;
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+  
   public Object clone()
     throws CloneNotSupportedException
   {
index be988043b307c6f0cf7fd30fe87b8d69461094b6..9000cc1ec839a62aec78ba48d845eda47b9e74f0 100644 (file)
@@ -72,12 +72,19 @@ public final class DateAndTime
     LittleEndian.putShort(buf, offset + LittleEndian.SHORT_SIZE, _info2);
   }
 
+  @Override
   public boolean equals(Object o)
   {
     DateAndTime dttm = (DateAndTime)o;
     return _info == dttm._info && _info2 == dttm._info2;
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+  
   public Object clone()
     throws CloneNotSupportedException
   {
index 94c8f0eb1673216a9143c6835d002c741203fb1f..e327f039ce8863311ff03c9e3da570a6328485df 100644 (file)
@@ -71,6 +71,8 @@ public final class LineSpacingDescriptor
   {
     _dyaLine = dyaLine;
   }
+  
+  @Override
   public boolean equals(Object o)
   {
     LineSpacingDescriptor lspd = (LineSpacingDescriptor)o;
@@ -78,6 +80,12 @@ public final class LineSpacingDescriptor
     return _dyaLine == lspd._dyaLine && _fMultiLinespace == lspd._fMultiLinespace;
   }
 
+  @Override
+  public int hashCode() {
+      assert false : "hashCode not designed";
+      return 42; // any arbitrary constant will do
+  }
+  
     public boolean isEmpty()
     {
         return _dyaLine == 0 && _fMultiLinespace == 0;
index 776015cc7fa0ec621cf66e6b3cba37307e6d0356..8205e6be5dc7eeabb724425d82ea03cd734e0c11 100644 (file)
@@ -45,7 +45,8 @@ public final class SectionProperties extends SEPAbstractType
 
         return copy;
     }
-
+    
+    @Override
     public boolean equals( Object obj )
     {
         Field[] fields = SectionProperties.class.getSuperclass()
@@ -74,4 +75,9 @@ public final class SectionProperties extends SEPAbstractType
         }
     }
 
+    @Override
+    public int hashCode() {
+        assert false : "hashCode not designed";
+        return 42; // any arbitrary constant will do
+    }
 }
index 8a3c92ba777665e41e7e1e8f003df56f9f24de65..cbf90186473a6a9739d29be6645ef821172acc81 100644 (file)
 
 package org.apache.poi.hssf.record;
 
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
 import org.apache.poi.hssf.record.aggregates.AllRecordAggregateTests;
 import org.apache.poi.hssf.record.cf.TestCellRange;
 import org.apache.poi.hssf.record.chart.AllChartRecordTests;
 import org.apache.poi.hssf.record.common.TestUnicodeString;
-import org.apache.poi.ss.formula.constant.TestConstantValueParser;
 import org.apache.poi.hssf.record.crypto.AllHSSFEncryptionTests;
-import org.apache.poi.ss.formula.ptg.AllFormulaTests;
 import org.apache.poi.hssf.record.pivot.AllPivotRecordTests;
+import org.apache.poi.ss.formula.constant.TestConstantValueParser;
+import org.apache.poi.ss.formula.ptg.AllFormulaTests;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
 
 /**
  * Collects all tests for package <tt>org.apache.poi.hssf.record</tt> and sub-packages.
- *
- * @author Josh Micich
  */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+    AllChartRecordTests.class,
+    AllHSSFEncryptionTests.class,
+    AllFormulaTests.class,
+    AllPivotRecordTests.class,
+    AllRecordAggregateTests.class,
+    TestArrayRecord.class,
+    TestBOFRecord.class,
+    TestBoolErrRecord.class,
+    TestBoundSheetRecord.class,
+    TestCellRange.class,
+    TestCFHeaderRecord.class,
+    TestCFRuleRecord.class,
+    TestColumnInfoRecord.class,
+    TestCommonObjectDataSubRecord.class,
+    TestConstantValueParser.class,
+    TestDVALRecord.class,
+    TestDrawingGroupRecord.class,
+    TestDrawingRecord.class,
+    TestEmbeddedObjectRefSubRecord.class,
+    TestEndSubRecord.class,
+    TestEscherAggregate.class,
+    TestExtendedFormatRecord.class,
+    TestExternalNameRecord.class,
+    TestFeatRecord.class,
+    TestFontRecord.class,
+    TestFormulaRecord.class,
+    TestHyperlinkRecord.class,
+    TestInterfaceEndRecord.class,
+    TestLabelRecord.class,
+    TestLbsDataSubRecord.class,
+    TestMergeCellsRecord.class,
+    TestNameRecord.class,
+    TestNoteRecord.class,
+    TestNoteStructureSubRecord.class,
+    TestObjRecord.class,
+    TestPaletteRecord.class,
+    TestPaneRecord.class,
+    TestPLVRecord.class,
+    TestRecalcIdRecord.class,
+    TestRecordFactory.class,
+    TestRecordFactoryInputStream.class,
+    TestRecordInputStream.class,
+    TestSCLRecord.class,
+    TestSSTDeserializer.class,
+    TestSSTRecord.class,
+    TestSSTRecordSizeCalculator.class,
+    TestSharedFormulaRecord.class,
+    TestStringRecord.class,
+    TestStyleRecord.class,
+    TestSubRecord.class,
+    TestSupBookRecord.class,
+    TestTableRecord.class,
+    TestTextObjectBaseRecord.class,
+    TestTextObjectRecord.class,
+    TestUnicodeNameRecord.class,
+    TestUnicodeString.class,
+    TestWriteAccessRecord.class,
+    TestDConRefRecord.class
+})
 public final class AllRecordTests {
-
-       public static Test suite() {
-               TestSuite result = new TestSuite(AllRecordTests.class.getName());
-
-               result.addTest(AllChartRecordTests.suite());
-               result.addTest(AllHSSFEncryptionTests.suite());
-               result.addTest(AllFormulaTests.suite());
-               result.addTest(AllPivotRecordTests.suite());
-               result.addTest(AllRecordAggregateTests.suite());
-
-               result.addTestSuite(TestArrayRecord.class);
-               result.addTestSuite(TestBOFRecord.class);
-               result.addTestSuite(TestBoolErrRecord.class);
-               result.addTestSuite(TestBoundSheetRecord.class);
-               result.addTestSuite(TestCellRange.class);
-               result.addTestSuite(TestCFHeaderRecord.class);
-               result.addTestSuite(TestCFRuleRecord.class);
-               result.addTestSuite(TestColumnInfoRecord.class);
-               result.addTestSuite(TestCommonObjectDataSubRecord.class);
-               result.addTestSuite(TestConstantValueParser.class);
-               result.addTestSuite(TestDVALRecord.class);
-               result.addTestSuite(TestDrawingGroupRecord.class);
-               result.addTestSuite(TestDrawingRecord.class);
-               result.addTestSuite(TestEmbeddedObjectRefSubRecord.class);
-               result.addTestSuite(TestEndSubRecord.class);
-               result.addTestSuite(TestEscherAggregate.class);
-               result.addTestSuite(TestExtendedFormatRecord.class);
-               result.addTestSuite(TestExternalNameRecord.class);
-               result.addTestSuite(TestFeatRecord.class);
-               result.addTestSuite(TestFontRecord.class);
-               result.addTestSuite(TestFormulaRecord.class);
-               result.addTestSuite(TestHyperlinkRecord.class);
-               result.addTestSuite(TestInterfaceEndRecord.class);
-               result.addTestSuite(TestLabelRecord.class);
-               result.addTestSuite(TestLbsDataSubRecord.class);
-               result.addTestSuite(TestMergeCellsRecord.class);
-               result.addTestSuite(TestNameRecord.class);
-               result.addTestSuite(TestNoteRecord.class);
-               result.addTestSuite(TestNoteStructureSubRecord.class);
-               result.addTestSuite(TestObjRecord.class);
-               result.addTestSuite(TestPaletteRecord.class);
-               result.addTestSuite(TestPaneRecord.class);
-               result.addTestSuite(TestPLVRecord.class);
-               result.addTestSuite(TestRecalcIdRecord.class);
-               result.addTestSuite(TestRecordFactory.class);
-               result.addTestSuite(TestRecordFactoryInputStream.class);
-               result.addTestSuite(TestRecordInputStream.class);
-               result.addTestSuite(TestSCLRecord.class);
-               result.addTestSuite(TestSSTDeserializer.class);
-               result.addTestSuite(TestSSTRecord.class);
-               result.addTestSuite(TestSSTRecordSizeCalculator.class);
-               result.addTestSuite(TestSharedFormulaRecord.class);
-               result.addTestSuite(TestStringRecord.class);
-               result.addTestSuite(TestStyleRecord.class);
-               result.addTestSuite(TestSubRecord.class);
-               result.addTestSuite(TestSupBookRecord.class);
-               result.addTestSuite(TestTableRecord.class);
-               result.addTestSuite(TestTextObjectBaseRecord.class);
-               result.addTestSuite(TestTextObjectRecord.class);
-               result.addTestSuite(TestUnicodeNameRecord.class);
-               result.addTestSuite(TestUnicodeString.class);
-               result.addTestSuite(TestWriteAccessRecord.class);
-                result.addTestSuite(TestDConRefRecord.class);
-               return result;
-       }
 }
index 591042d7eb35b4e8dd9d99abead81b3ca63c4a4f..c1c585db4e7dd65d30cc335335334605445fadfd 100644 (file)
 
 package org.apache.poi.hssf.record.common;
 
+import static org.junit.Assert.assertEquals;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 
-import junit.framework.TestCase;
-
 import org.apache.poi.hssf.record.ContinueRecord;
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.SSTRecord;
 import org.apache.poi.hssf.record.common.UnicodeString.ExtRst;
 import org.apache.poi.hssf.record.common.UnicodeString.FormatRun;
 import org.apache.poi.hssf.record.cont.ContinuableRecordOutput;
+import org.apache.poi.util.LittleEndianByteArrayInputStream;
+import org.apache.poi.util.LittleEndianByteArrayOutputStream;
+import org.apache.poi.util.LittleEndianConsts;
+import org.apache.poi.util.LittleEndianInput;
 import org.apache.poi.util.LittleEndianInputStream;
 import org.apache.poi.util.LittleEndianOutputStream;
+import org.apache.poi.util.StringUtil;
+import org.junit.Test;
 
 /**
  * Tests that {@link UnicodeString} record size calculates correctly.  The record size
@@ -37,7 +43,7 @@ import org.apache.poi.util.LittleEndianOutputStream;
  *
  * @author Jason Height (jheight at apache.org)
  */
-public final class TestUnicodeString extends TestCase {
+public final class TestUnicodeString {
     private static final int MAX_DATA_SIZE = RecordInputStream.MAX_RECORD_DATA_SIZE;
 
     /** a 4 character string requiring 16 bit encoding */
@@ -65,7 +71,8 @@ public final class TestUnicodeString extends TestCase {
         assertEquals(expectedSize, actualSize);
     }
 
-    public void testSmallStringSize() {
+    @Test
+    public void smallStringSize() {
         //Test a basic string
         UnicodeString s = makeUnicodeString("Test");
         confirmSize(7, s);
@@ -111,7 +118,8 @@ public final class TestUnicodeString extends TestCase {
         confirmSize(21, s);
     }
 
-    public void testPerfectStringSize() {
+    @Test
+    public void perfectStringSize() {
       //Test a basic string
       UnicodeString s = makeUnicodeString(MAX_DATA_SIZE-2-1);
       confirmSize(MAX_DATA_SIZE, s);
@@ -124,7 +132,8 @@ public final class TestUnicodeString extends TestCase {
       confirmSize(MAX_DATA_SIZE-1, s);
     }
 
-    public void testPerfectRichStringSize() {
+    @Test
+    public void perfectRichStringSize() {
       //Test a rich text string
       UnicodeString s = makeUnicodeString(MAX_DATA_SIZE-2-1-8-2);
       s.addFormatRun(new UnicodeString.FormatRun((short)1,(short)0));
@@ -142,14 +151,16 @@ public final class TestUnicodeString extends TestCase {
       confirmSize(MAX_DATA_SIZE-1, s);
     }
 
-    public void testContinuedStringSize() {
+    @Test
+    public void continuedStringSize() {
       //Test a basic string
       UnicodeString s = makeUnicodeString(MAX_DATA_SIZE-2-1+20);
       confirmSize(MAX_DATA_SIZE+4+1+20, s);
     }
 
     /** Tests that a string size calculation that fits neatly in two records, the second being a continue*/
-    public void testPerfectContinuedStringSize() {
+    @Test
+    public void perfectContinuedStringSize() {
       //Test a basic string
       int strSize = MAX_DATA_SIZE*2;
       //String overhead
@@ -162,7 +173,8 @@ public final class TestUnicodeString extends TestCase {
       confirmSize(MAX_DATA_SIZE*2, s);
     }
     
-    public void testFormatRun() throws Exception {
+    @Test
+    public void formatRun() throws Exception {
        FormatRun fr = new FormatRun((short)4, (short)0x15c);
        assertEquals(4, fr.getCharacterPos());
        assertEquals(0x15c, fr.getFontIndex());
@@ -187,7 +199,8 @@ public final class TestUnicodeString extends TestCase {
        assertEquals(0x15c, fr.getFontIndex());
     }
     
-    public void testExtRstFromEmpty() throws Exception {
+    @Test
+    public void extRstFromEmpty() throws Exception {
        ExtRst ext = new ExtRst();
        
        assertEquals(0, ext.getNumberOfRuns());
@@ -253,7 +266,8 @@ public final class TestUnicodeString extends TestCase {
        assertEquals(0, ext.getPhRuns().length);
     }
     
-    public void testExtRstFromData() throws Exception {
+    @Test
+    public void extRstFromData() throws Exception {
        byte[] data = new byte[] {
              01, 00, 0x0C, 00, 
              00, 00, 0x37, 00, 
@@ -276,7 +290,8 @@ public final class TestUnicodeString extends TestCase {
        assertEquals(0, ext.getPhRuns().length);
     }
     
-    public void testCorruptExtRstDetection() throws Exception {
+    @Test
+    public void corruptExtRstDetection() throws Exception {
        byte[] data = new byte[] {
              0x79, 0x79, 0x11, 0x11, 
              0x22, 0x22, 0x33, 0x33, 
@@ -302,6 +317,32 @@ public final class TestUnicodeString extends TestCase {
        assertEquals(0, ext.getPhRuns().length);
     }
 
+    @Test
+    public void extRstEqualsAndHashCode() {
+        byte buf[] = new byte[200];
+        LittleEndianByteArrayOutputStream bos = new LittleEndianByteArrayOutputStream(buf, 0);
+        String str = "\u1d02\u1d12\u1d22";
+        bos.writeShort(1);
+        bos.writeShort(5*LittleEndianConsts.SHORT_SIZE+str.length()*2+3*LittleEndianConsts.SHORT_SIZE+2); // data size
+        bos.writeShort(0x4711);
+        bos.writeShort(0x0815);
+        bos.writeShort(1);
+        bos.writeShort(str.length());
+        bos.writeShort(str.length());
+        StringUtil.putUnicodeLE(str, bos);
+        bos.writeShort(1);
+        bos.writeShort(1);
+        bos.writeShort(3);
+        bos.writeShort(42);
+        
+        LittleEndianInput in = new LittleEndianByteArrayInputStream(buf, 0, bos.getWriteIndex());
+        UnicodeString.ExtRst extRst1 = new UnicodeString.ExtRst(in, bos.getWriteIndex());
+        in = new LittleEndianByteArrayInputStream(buf, 0, bos.getWriteIndex());
+        UnicodeString.ExtRst extRst2 = new UnicodeString.ExtRst(in, bos.getWriteIndex());
+        
+        assertEquals(extRst1, extRst2);
+        assertEquals(extRst1.hashCode(), extRst2.hashCode());
+    }
 
     private static UnicodeString makeUnicodeString(String s) {
       UnicodeString st = new UnicodeString(s);