KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > poi > hssf > record > TestSSTRecordSizeCalculator


1
2 /* ====================================================================
3    Copyright 2002-2004 Apache Software Foundation
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9        http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16 ==================================================================== */

17         
18
19 package org.apache.poi.hssf.record;
20
21 import junit.framework.TestCase;
22
23 import java.util.List JavaDoc;
24 import java.util.ArrayList JavaDoc;
25
26 import org.apache.poi.util.BinaryTree;
27 import org.apache.poi.util.LittleEndian;
28 import org.apache.poi.util.LittleEndianConsts;
29
30 /**
31  * Tests that records size calculates correctly.
32  *
33  * @author Glen Stampoultzis (glens at apache.org)
34  */

35 public class TestSSTRecordSizeCalculator
36         extends TestCase
37 {
38     private static final String JavaDoc SMALL_STRING = "Small string";
39     private static final int COMPRESSED_PLAIN_STRING_OVERHEAD = 3;
40 // private List recordLengths;
41
private BinaryTree strings;
42     private static final int OPTION_FIELD_SIZE = 1;
43
44     public TestSSTRecordSizeCalculator( String JavaDoc s )
45     {
46         super( s );
47     }
48
49     public void testBasic()
50             throws Exception JavaDoc
51     {
52         strings.put(new Integer JavaDoc(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 JavaDoc
60     {
61         String JavaDoc bigString = new String JavaDoc(new char[SSTRecord.MAX_DATA_SPACE + 100]);
62         strings.put(new Integer JavaDoc(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 JavaDoc
76     {
77         String JavaDoc perfectFit = new String JavaDoc(new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD]);
78         strings.put(new Integer JavaDoc(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 JavaDoc
88     {
89         String JavaDoc tooBig = new String JavaDoc(new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD + 1]);
90         strings.put(new Integer JavaDoc(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                 // continue record
96
+ SSTRecord.STD_RECORD_OVERHEAD
97                 + OPTION_FIELD_SIZE
98                 + 1,
99                 calculator.getRecordSize());
100
101     }
102
103     public void testSecondStringStartsOnNewContinuation()
104             throws Exception JavaDoc
105     {
106         String JavaDoc perfectFit = new String JavaDoc(new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD]);
107         strings.put(new Integer JavaDoc(0), makeUnicodeString(perfectFit));
108         strings.put(new Integer JavaDoc(1), makeUnicodeString(SMALL_STRING));
109         SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings);
110         assertEquals(SSTRecord.SST_RECORD_OVERHEAD
111                 + SSTRecord.MAX_DATA_SPACE
112                 // second string
113
+ 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 JavaDoc
121     {
122         String JavaDoc almostPerfectFit = new String JavaDoc(new char[SSTRecord.MAX_DATA_SPACE - COMPRESSED_PLAIN_STRING_OVERHEAD - 2]);
123         strings.put(new Integer JavaDoc(0), makeUnicodeString(almostPerfectFit));
124         String JavaDoc oneCharString = new String JavaDoc(new char[1]);
125         strings.put(new Integer JavaDoc(1), makeUnicodeString(oneCharString));
126         SSTRecordSizeCalculator calculator = new SSTRecordSizeCalculator(strings);
127         assertEquals(SSTRecord.SST_RECORD_OVERHEAD
128                 + COMPRESSED_PLAIN_STRING_OVERHEAD
129                 + almostPerfectFit.length()
130                 // second string
131
+ 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 JavaDoc 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