3b7385f00aa5d9690cb40044e1a15d589e893f94
[debian/openrocket] / test / net / sf / openrocket / util / TextUtilTest.java
1 package net.sf.openrocket.util;
2
3 import static java.lang.Math.PI;
4 import static org.junit.Assert.assertEquals;
5
6 import java.util.Random;
7
8 import org.junit.Test;
9
10 public class TextUtilTest {
11         
12         @Test
13         public void textHexString() {
14                 assertEquals("", TextUtil.hexString(new byte[0]));
15                 assertEquals("00", TextUtil.hexString(new byte[] { 0x00 }));
16                 assertEquals("ff", TextUtil.hexString(new byte[] { (byte) 0xff }));
17
18                 for (int i=0; i <= 0xff; i++) {
19                         assertEquals(String.format("%02x", i), TextUtil.hexString(new byte[] { (byte) i }));
20                 }
21                 
22                 assertEquals("0f1e2d3c4b5a6978", TextUtil.hexString(new byte[] { 
23                                 0x0f, 0x1e, 0x2d, 0x3c, 0x4b, 0x5a, 0x69, 0x78
24                 }));
25                 
26                 Random rnd = new Random();
27                 for (int count=0; count<10; count++) {
28                         int n = rnd.nextInt(100);
29                         byte[] bytes = new byte[n];
30                         rnd.nextBytes(bytes);
31                         StringBuilder sb = new StringBuilder();
32                         for (byte b: bytes) {
33                                 sb.append(String.format("%02x", b & 0xFF));
34                         }
35                         assertEquals(sb.toString(), TextUtil.hexString(bytes));
36                 }
37         }
38
39         @Test
40         public void specialCaseTest() {
41                 assertEquals("NaN",TextUtil.doubleToString(Double.NaN));
42                 assertEquals("Inf",TextUtil.doubleToString(Double.POSITIVE_INFINITY));
43                 assertEquals("-Inf",TextUtil.doubleToString(Double.NEGATIVE_INFINITY));
44                 assertEquals("0",TextUtil.doubleToString(0.0));
45                 assertEquals("0",TextUtil.doubleToString(MathUtil.EPSILON/3));
46                 assertEquals("0",TextUtil.doubleToString(-MathUtil.EPSILON/3));
47         }
48         
49         @Test
50         public void longTest() {
51                 
52                 assertEquals("3.1416e-5", TextUtil.doubleToString(PI*1e-5));
53                 assertEquals("3.1416e-4", TextUtil.doubleToString(PI*1e-4));
54                 assertEquals("0.0031416", TextUtil.doubleToString(PI*1e-3));
55                 assertEquals("0.031416",  TextUtil.doubleToString(PI*1e-2));
56                 assertEquals("0.31416",   TextUtil.doubleToString(PI*1e-1));
57                 assertEquals("3.1416",    TextUtil.doubleToString(PI));
58                 assertEquals("31.416",    TextUtil.doubleToString(PI*1e1));
59                 assertEquals("314.16",    TextUtil.doubleToString(PI*1e2));
60                 assertEquals("3141.6",    TextUtil.doubleToString(PI*1e3));
61                 assertEquals("31416",     TextUtil.doubleToString(PI*1e4));
62                 assertEquals("314159",    TextUtil.doubleToString(PI*1e5));
63                 assertEquals("3141593",   TextUtil.doubleToString(PI*1e6));
64                 assertEquals("31415927",  TextUtil.doubleToString(PI*1e7));
65                 assertEquals("3.1416e8",  TextUtil.doubleToString(PI*1e8));
66                 assertEquals("3.1416e9",  TextUtil.doubleToString(PI*1e9));
67                 assertEquals("3.1416e10", TextUtil.doubleToString(PI*1e10));
68
69                 assertEquals("-3.1416e-5", TextUtil.doubleToString(-PI*1e-5));
70                 assertEquals("-3.1416e-4", TextUtil.doubleToString(-PI*1e-4));
71                 assertEquals("-0.0031416", TextUtil.doubleToString(-PI*1e-3));
72                 assertEquals("-0.031416",  TextUtil.doubleToString(-PI*1e-2));
73                 assertEquals("-0.31416",   TextUtil.doubleToString(-PI*1e-1));
74                 assertEquals("-3.1416",    TextUtil.doubleToString(-PI));
75                 assertEquals("-31.416",    TextUtil.doubleToString(-PI*1e1));
76                 assertEquals("-314.16",    TextUtil.doubleToString(-PI*1e2));
77                 assertEquals("-3141.6",    TextUtil.doubleToString(-PI*1e3));
78                 assertEquals("-31416",     TextUtil.doubleToString(-PI*1e4));
79                 assertEquals("-314159",    TextUtil.doubleToString(-PI*1e5));
80                 assertEquals("-3141593",   TextUtil.doubleToString(-PI*1e6));
81                 assertEquals("-31415927",  TextUtil.doubleToString(-PI*1e7));
82                 assertEquals("-3.1416e8",  TextUtil.doubleToString(-PI*1e8));
83                 assertEquals("-3.1416e9",  TextUtil.doubleToString(-PI*1e9));
84                 assertEquals("-3.1416e10", TextUtil.doubleToString(-PI*1e10));
85
86         }
87         
88         @Test
89         public void shortTest() {
90                 double p = 3.1;
91                 assertEquals("3.1e-5", TextUtil.doubleToString(p*1e-5));
92                 assertEquals("3.1e-4", TextUtil.doubleToString(p*1e-4));
93                 assertEquals("0.0031", TextUtil.doubleToString(p*1e-3));
94                 assertEquals("0.031",  TextUtil.doubleToString(p*1e-2));
95                 assertEquals("0.31",   TextUtil.doubleToString(p*1e-1));
96                 assertEquals("3.1",    TextUtil.doubleToString(p));
97                 assertEquals("31",     TextUtil.doubleToString(p*1e1));
98                 assertEquals("310",    TextUtil.doubleToString(p*1e2));
99                 assertEquals("3100",   TextUtil.doubleToString(p*1e3));
100                 assertEquals("31000",  TextUtil.doubleToString(p*1e4));
101                 assertEquals("3.1e5",  TextUtil.doubleToString(p*1e5));
102                 assertEquals("3.1e6",  TextUtil.doubleToString(p*1e6));
103                 assertEquals("3.1e7",  TextUtil.doubleToString(p*1e7));
104                 assertEquals("3.1e8",  TextUtil.doubleToString(p*1e8));
105                 assertEquals("3.1e9",  TextUtil.doubleToString(p*1e9));
106                 assertEquals("3.1e10", TextUtil.doubleToString(p*1e10));
107
108                 assertEquals("-3.1e-5", TextUtil.doubleToString(-p*1e-5));
109                 assertEquals("-3.1e-4", TextUtil.doubleToString(-p*1e-4));
110                 assertEquals("-0.0031", TextUtil.doubleToString(-p*1e-3));
111                 assertEquals("-0.031",  TextUtil.doubleToString(-p*1e-2));
112                 assertEquals("-0.31",   TextUtil.doubleToString(-p*1e-1));
113                 assertEquals("-3.1",    TextUtil.doubleToString(-p));
114                 assertEquals("-31",     TextUtil.doubleToString(-p*1e1));
115                 assertEquals("-310",    TextUtil.doubleToString(-p*1e2));
116                 assertEquals("-3100",   TextUtil.doubleToString(-p*1e3));
117                 assertEquals("-31000",  TextUtil.doubleToString(-p*1e4));
118                 assertEquals("-3.1e5",  TextUtil.doubleToString(-p*1e5));
119                 assertEquals("-3.1e6",  TextUtil.doubleToString(-p*1e6));
120                 assertEquals("-3.1e7",  TextUtil.doubleToString(-p*1e7));
121                 assertEquals("-3.1e8",  TextUtil.doubleToString(-p*1e8));
122                 assertEquals("-3.1e9",  TextUtil.doubleToString(-p*1e9));
123                 assertEquals("-3.1e10", TextUtil.doubleToString(-p*1e10));
124
125                 p = 3;
126                 assertEquals("3e-5", TextUtil.doubleToString(p*1e-5));
127                 assertEquals("3e-4", TextUtil.doubleToString(p*1e-4));
128                 assertEquals("3e-3", TextUtil.doubleToString(p*1e-3));
129                 assertEquals("0.03", TextUtil.doubleToString(p*1e-2));
130                 assertEquals("0.3",  TextUtil.doubleToString(p*1e-1));
131                 assertEquals("3",    TextUtil.doubleToString(p));
132                 assertEquals("30",   TextUtil.doubleToString(p*1e1));
133                 assertEquals("300",  TextUtil.doubleToString(p*1e2));
134                 assertEquals("3e3",  TextUtil.doubleToString(p*1e3));
135                 assertEquals("3e4",  TextUtil.doubleToString(p*1e4));
136                 assertEquals("3e5",  TextUtil.doubleToString(p*1e5));
137                 assertEquals("3e6",  TextUtil.doubleToString(p*1e6));
138                 assertEquals("3e7",  TextUtil.doubleToString(p*1e7));
139                 assertEquals("3e8",  TextUtil.doubleToString(p*1e8));
140                 assertEquals("3e9",  TextUtil.doubleToString(p*1e9));
141                 assertEquals("3e10", TextUtil.doubleToString(p*1e10));
142
143                 assertEquals("-3e-5", TextUtil.doubleToString(-p*1e-5));
144                 assertEquals("-3e-4", TextUtil.doubleToString(-p*1e-4));
145                 assertEquals("-3e-3", TextUtil.doubleToString(-p*1e-3));
146                 assertEquals("-0.03", TextUtil.doubleToString(-p*1e-2));
147                 assertEquals("-0.3",  TextUtil.doubleToString(-p*1e-1));
148                 assertEquals("-3",    TextUtil.doubleToString(-p));
149                 assertEquals("-30",   TextUtil.doubleToString(-p*1e1));
150                 assertEquals("-300",  TextUtil.doubleToString(-p*1e2));
151                 assertEquals("-3e3",  TextUtil.doubleToString(-p*1e3));
152                 assertEquals("-3e4",  TextUtil.doubleToString(-p*1e4));
153                 assertEquals("-3e5",  TextUtil.doubleToString(-p*1e5));
154                 assertEquals("-3e6",  TextUtil.doubleToString(-p*1e6));
155                 assertEquals("-3e7",  TextUtil.doubleToString(-p*1e7));
156                 assertEquals("-3e8",  TextUtil.doubleToString(-p*1e8));
157                 assertEquals("-3e9",  TextUtil.doubleToString(-p*1e9));
158                 assertEquals("-3e10", TextUtil.doubleToString(-p*1e10));
159
160         }
161         
162         @Test
163         public void roundingTest() {
164                 
165                 assertEquals("1.001", TextUtil.doubleToString(1.00096));
166                 
167                 
168                 /*
169                  * Not testing with 1.00015 because it might be changed during number formatting
170                  * calculations.  Its rounding is basically arbitrary anyway.
171                  */
172                 
173                 assertEquals("1.0002e-5", TextUtil.doubleToString(1.0001500001e-5));
174                 assertEquals("1.0001e-5", TextUtil.doubleToString(1.0001499999e-5));
175                 assertEquals("1.0002e-4", TextUtil.doubleToString(1.0001500001e-4));
176                 assertEquals("1.0001e-4", TextUtil.doubleToString(1.0001499999e-4));
177                 assertEquals("0.0010002", TextUtil.doubleToString(1.0001500001e-3));
178                 assertEquals("0.0010001", TextUtil.doubleToString(1.0001499999e-3));
179                 assertEquals("0.010002",  TextUtil.doubleToString(1.0001500001e-2));
180                 assertEquals("0.010001",  TextUtil.doubleToString(1.0001499999e-2));
181                 assertEquals("0.10002",   TextUtil.doubleToString(1.0001500001e-1));
182                 assertEquals("0.10001",   TextUtil.doubleToString(1.0001499999e-1));
183                 assertEquals("1.0002",    TextUtil.doubleToString(1.0001500001));
184                 assertEquals("1.0001",    TextUtil.doubleToString(1.0001499999));
185                 assertEquals("10.002",    TextUtil.doubleToString(1.0001500001e1));
186                 assertEquals("10.001",    TextUtil.doubleToString(1.0001499999e1));
187                 assertEquals("100.02",    TextUtil.doubleToString(1.0001500001e2));
188                 assertEquals("100.01",    TextUtil.doubleToString(1.0001499999e2));
189                 assertEquals("1000.2",    TextUtil.doubleToString(1.0001500001e3));
190                 assertEquals("1000.1",    TextUtil.doubleToString(1.0001499999e3));
191                 assertEquals("10002",     TextUtil.doubleToString(1.0001500001e4));
192                 assertEquals("10001",     TextUtil.doubleToString(1.0001499999e4));
193                 assertEquals("100012",    TextUtil.doubleToString(1.00011500001e5));
194                 assertEquals("100011",    TextUtil.doubleToString(1.00011499999e5));
195                 assertEquals("1000112",   TextUtil.doubleToString(1.000111500001e6));
196                 assertEquals("1000111",   TextUtil.doubleToString(1.000111499999e6));
197                 assertEquals("10001112",  TextUtil.doubleToString(1.0001111500001e7));
198                 assertEquals("10001111",  TextUtil.doubleToString(1.0001111499999e7));
199                 assertEquals("1.0002e8",  TextUtil.doubleToString(1.0001500001e8));
200                 assertEquals("1.0001e8",  TextUtil.doubleToString(1.0001499999e8));
201                 assertEquals("1.0002e9",  TextUtil.doubleToString(1.0001500001e9));
202                 assertEquals("1.0001e9",  TextUtil.doubleToString(1.0001499999e9));
203                 assertEquals("1.0002e10", TextUtil.doubleToString(1.0001500001e10));
204                 assertEquals("1.0001e10", TextUtil.doubleToString(1.0001499999e10));
205                 
206
207                 assertEquals("-1.0002e-5", TextUtil.doubleToString(-1.0001500001e-5));
208                 assertEquals("-1.0001e-5", TextUtil.doubleToString(-1.0001499999e-5));
209                 assertEquals("-1.0002e-4", TextUtil.doubleToString(-1.0001500001e-4));
210                 assertEquals("-1.0001e-4", TextUtil.doubleToString(-1.0001499999e-4));
211                 assertEquals("-0.0010002", TextUtil.doubleToString(-1.0001500001e-3));
212                 assertEquals("-0.0010001", TextUtil.doubleToString(-1.0001499999e-3));
213                 assertEquals("-0.010002",  TextUtil.doubleToString(-1.0001500001e-2));
214                 assertEquals("-0.010001",  TextUtil.doubleToString(-1.0001499999e-2));
215                 assertEquals("-0.10002",   TextUtil.doubleToString(-1.0001500001e-1));
216                 assertEquals("-0.10001",   TextUtil.doubleToString(-1.0001499999e-1));
217                 assertEquals("-1.0002",    TextUtil.doubleToString(-1.0001500001));
218                 assertEquals("-1.0001",    TextUtil.doubleToString(-1.0001499999));
219                 assertEquals("-10.002",    TextUtil.doubleToString(-1.0001500001e1));
220                 assertEquals("-10.001",    TextUtil.doubleToString(-1.0001499999e1));
221                 assertEquals("-100.02",    TextUtil.doubleToString(-1.0001500001e2));
222                 assertEquals("-100.01",    TextUtil.doubleToString(-1.0001499999e2));
223                 assertEquals("-1000.2",    TextUtil.doubleToString(-1.0001500001e3));
224                 assertEquals("-1000.1",    TextUtil.doubleToString(-1.0001499999e3));
225                 assertEquals("-10002",     TextUtil.doubleToString(-1.0001500001e4));
226                 assertEquals("-10001",     TextUtil.doubleToString(-1.0001499999e4));
227                 assertEquals("-100012",    TextUtil.doubleToString(-1.00011500001e5));
228                 assertEquals("-100011",    TextUtil.doubleToString(-1.00011499999e5));
229                 assertEquals("-1000112",   TextUtil.doubleToString(-1.000111500001e6));
230                 assertEquals("-1000111",   TextUtil.doubleToString(-1.000111499999e6));
231                 assertEquals("-10001112",  TextUtil.doubleToString(-1.0001111500001e7));
232                 assertEquals("-10001111",  TextUtil.doubleToString(-1.0001111499999e7));
233                 assertEquals("-1.0002e8",  TextUtil.doubleToString(-1.0001500001e8));
234                 assertEquals("-1.0001e8",  TextUtil.doubleToString(-1.0001499999e8));
235                 assertEquals("-1.0002e9",  TextUtil.doubleToString(-1.0001500001e9));
236                 assertEquals("-1.0001e9",  TextUtil.doubleToString(-1.0001499999e9));
237                 assertEquals("-1.0002e10", TextUtil.doubleToString(-1.0001500001e10));
238                 assertEquals("-1.0001e10", TextUtil.doubleToString(-1.0001499999e10));
239                 
240         }
241         
242         
243         @Test
244         public void randomTest() {
245                 for (int i=0; i<10000; i++) {
246                         double orig = Math.random();
247                         double result;
248                         double expected = Math.rint(orig*100000) / 100000.0;
249                         
250                         if (orig < 0.1)
251                                 continue;
252                         String s = TextUtil.doubleToString(orig);
253                         result = Double.parseDouble(s);
254                         assertEquals(expected, result, 0.00000001);
255                 }
256         }
257         
258 }