1 2 17 18 19 package org.apache.poi.hssf.record; 20 21 import junit.framework.TestCase; 22 23 import java.util.List ; 24 import java.util.ArrayList ; 25 26 import org.apache.poi.util.BinaryTree; 27 import org.apache.poi.util.LittleEndian; 28 import org.apache.poi.util.LittleEndianConsts; 29 30 35 public class TestSSTRecordSizeCalculator 36 extends TestCase 37 { 38 private static final String SMALL_STRING = "Small string"; 39 private static final int COMPRESSED_PLAIN_STRING_OVERHEAD = 3; 40 private BinaryTree strings; 42 private static final int OPTION_FIELD_SIZE = 1; 43 44 public TestSSTRecordSizeCalculator( String s ) 45 { 46 super( s ); 47 } 48 49 public void testBasic() 50 throws Exception 51 { 52 strings.put(new Integer (0), makeUnicodeString(SMALL_STRING)); 53 SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings); 54 assertEquals(SSTRecord.SST_RECORD_OVERHEAD + COMPRESSED_PLAIN_STRING_OVERHEAD + SMALL_STRING.length(), 55 calculator.getRecordSize()); 56 } 57 58 public void testBigStringAcrossUnicode() 59 throws Exception 60 { 61 String bigString = new String (new char[SSTRecord.MAX_DATA_SPACE + 100]); 62 strings.put(new Integer (0), makeUnicodeString(bigString)); 63 SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings); 64 assertEquals(SSTRecord.SST_RECORD_OVERHEAD 65 + COMPRESSED_PLAIN_STRING_OVERHEAD 66 + SSTRecord.MAX_DATA_SPACE 67 + SSTRecord.STD_RECORD_OVERHEAD 68 + OPTION_FIELD_SIZE 69 + 100, 70 calculator.getRecordSize()); 71 72 } 73 74 public void testPerfectFit() 75 throws Exception 76 { 77 String perfectFit = new String (new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD]); 78 strings.put(new Integer (0), makeUnicodeString(perfectFit)); 79 SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings); 80 assertEquals(SSTRecord.SST_RECORD_OVERHEAD 81 + COMPRESSED_PLAIN_STRING_OVERHEAD 82 + perfectFit.length(), 83 calculator.getRecordSize()); 84 } 85 86 public void testJustOversized() 87 throws Exception 88 { 89 String tooBig = new String (new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD + 1]); 90 strings.put(new Integer (0), makeUnicodeString(tooBig)); 91 SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings); 92 assertEquals(SSTRecord.SST_RECORD_OVERHEAD 93 + COMPRESSED_PLAIN_STRING_OVERHEAD 94 + tooBig.length() - 1 95 + SSTRecord.STD_RECORD_OVERHEAD 97 + OPTION_FIELD_SIZE 98 + 1, 99 calculator.getRecordSize()); 100 101 } 102 103 public void testSecondStringStartsOnNewContinuation() 104 throws Exception 105 { 106 String perfectFit = new String (new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD]); 107 strings.put(new Integer (0), makeUnicodeString(perfectFit)); 108 strings.put(new Integer (1), makeUnicodeString(SMALL_STRING)); 109 SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings); 110 assertEquals(SSTRecord.SST_RECORD_OVERHEAD 111 + SSTRecord.MAX_DATA_SPACE 112 + SSTRecord.STD_RECORD_OVERHEAD 114 + COMPRESSED_PLAIN_STRING_OVERHEAD 115 + SMALL_STRING.length(), 116 calculator.getRecordSize()); 117 } 118 119 public void testHeaderCrossesNormalContinuePoint() 120 throws Exception 121 { 122 String almostPerfectFit = new String (new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD - 2]); 123 strings.put(new Integer (0), makeUnicodeString(almostPerfectFit)); 124 String oneCharString = new String (new char[1]); 125 strings.put(new Integer (1), makeUnicodeString(oneCharString)); 126 SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings); 127 assertEquals(SSTRecord.SST_RECORD_OVERHEAD 128 + COMPRESSED_PLAIN_STRING_OVERHEAD 129 + almostPerfectFit.length() 130 + SSTRecord.STD_RECORD_OVERHEAD 132 + COMPRESSED_PLAIN_STRING_OVERHEAD 133 + oneCharString.length(), 134 calculator.getRecordSize()); 135 136 } 137 138 139 public void setUp() 140 { 141 strings = new BinaryTree(); 142 } 143 144 145 private UnicodeString makeUnicodeString( String s ) 146 { 147 int length = SSTRecord.STRING_MINIMAL_OVERHEAD + s.length(); 148 byte[] unicodeStringBuffer = new byte[length]; 149 LittleEndian.putUShort( unicodeStringBuffer, 0, s.length() ); 150 int offset = LittleEndianConsts.SHORT_SIZE; 151 unicodeStringBuffer[offset++] = 0; 152 System.arraycopy( s.getBytes(), 0, unicodeStringBuffer, offset, s.length() ); 153 return new UnicodeString( UnicodeString.sid, (short) unicodeStringBuffer.length, unicodeStringBuffer ); 154 } 155 156 } 157 | Popular Tags |