1 /* 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.javafx.sg.prism; 27 28 import org.junit.Test; 29 30 import static org.junit.Assert.assertFalse; 31 import static org.junit.Assert.assertTrue; 32 33 /** 34 */ 35 public class GrowableDataBufferTest { 36 37 public boolean encodableBooleans[] = { 38 false, true 39 }; 40 41 public char encodableChars[] = { 42 ' ', 'A', 'Z', 'a', 'z', '0', '9' 43 }; 44 45 public byte encodableBytes[] = { 46 -1, 0, 1, Byte.MIN_VALUE, Byte.MAX_VALUE 47 }; 48 49 public short encodableShorts[] = { 50 -1, 0, 1, Short.MIN_VALUE, Short.MAX_VALUE 51 }; 52 53 public int encodableInts[] = { 54 -1, 0, 1, Integer.MIN_VALUE, Integer.MAX_VALUE 55 }; 56 57 public long encodableLongs[] = { 58 -1L, 0L, 1L, Long.MIN_VALUE, Long.MAX_VALUE 59 }; 60 61 public float encodableFloats[] = { 62 -1.0f, 0.0f, 1.0f, Float.MIN_VALUE, Float.MAX_VALUE, 63 Float.NEGATIVE_INFINITY, Float.POSITIVE_INFINITY 64 }; 65 66 public double encodableDoubles[] = { 67 -1.0, 0.0, 1.0, Double.MIN_VALUE, Double.MAX_VALUE, 68 Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY 69 }; 70 71 int NUM_VALUES = 72 encodableBooleans.length + 73 encodableChars.length + 74 encodableBytes.length + 75 encodableShorts.length + 76 encodableInts.length + 77 encodableLongs.length + 78 encodableFloats.length + 79 encodableDoubles.length; 80 int NUM_BYTES = 81 encodableBooleans.length + 82 encodableChars.length * 2 + 83 encodableBytes.length + 84 encodableShorts.length * 2 + 85 encodableInts.length * 4 + 86 encodableLongs.length * 8 + 87 encodableFloats.length * 4 + 88 encodableDoubles.length * 8; 89 90 void putBooleans(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 91 for (boolean b : encodableBooleans) { 92 if (putPrim) gdb.putBoolean(b); 93 if (putObj) gdb.putObject(Boolean.valueOf(b)); 94 } 95 } 96 97 void getBooleans(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 98 for (boolean b : encodableBooleans) { 99 if (getPrim) assertTrue(gdb.getBoolean() == b); 100 if (getObj) assertTrue(gdb.getObject().equals(Boolean.valueOf(b))); 101 } 102 } 103 104 void putChars(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 105 for (char c : encodableChars) { 106 if (putPrim) gdb.putChar(c); 107 if (putObj) gdb.putObject(Character.valueOf(c)); 108 } 109 } 110 111 void getChars(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 112 for (char c : encodableChars) { 113 if (getPrim) assertTrue(gdb.getChar() == c); 114 if (getObj) assertTrue(gdb.getObject().equals(Character.valueOf(c))); 115 } 116 } 117 118 void putBytes(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 119 for (byte b : encodableBytes) { 120 if (putPrim) gdb.putByte(b); 121 if (putObj) gdb.putObject(Byte.valueOf(b)); 122 } 123 } 124 125 void getBytes(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 126 for (byte b : encodableBytes) { 127 if (getPrim) assertTrue(gdb.getByte() == b); 128 if (getObj) assertTrue(gdb.getObject().equals(Byte.valueOf(b))); 129 } 130 } 131 132 void putUBytes(GrowableDataBuffer gdb) { 133 for (byte b : encodableBytes) { 134 gdb.putByte(b); 135 } 136 } 137 138 void getUBytes(GrowableDataBuffer gdb) { 139 for (byte b : encodableBytes) { 140 assertTrue(gdb.getUByte() == (b & 0xff)); 141 } 142 } 143 144 void putShorts(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 145 for (short s : encodableShorts) { 146 if (putPrim) gdb.putShort(s); 147 if (putObj) gdb.putObject(Short.valueOf(s)); 148 } 149 } 150 151 void getShorts(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 152 for (short s : encodableShorts) { 153 if (getPrim) assertTrue(gdb.getShort() == s); 154 if (getObj) assertTrue(gdb.getObject().equals(Short.valueOf(s))); 155 } 156 } 157 158 void putInts(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 159 for (int i : encodableInts) { 160 if (putPrim) gdb.putInt(i); 161 if (putObj) gdb.putObject(Integer.valueOf(i)); 162 } 163 } 164 165 void getInts(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 166 for (int i : encodableInts) { 167 if (getPrim) assertTrue(gdb.getInt() == i); 168 if (getObj) assertTrue(gdb.getObject().equals(Integer.valueOf(i))); 169 } 170 } 171 172 void putLongs(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 173 for (long l : encodableLongs) { 174 if (putPrim) gdb.putLong(l); 175 if (putObj) gdb.putObject(Long.valueOf(l)); 176 } 177 } 178 179 void getLongs(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 180 for (long c : encodableLongs) { 181 if (getPrim) assertTrue(gdb.getLong() == c); 182 if (getObj) assertTrue(gdb.getObject().equals(Long.valueOf(c))); 183 } 184 } 185 186 void putFloats(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 187 for (float f : encodableFloats) { 188 if (putPrim) gdb.putFloat(f); 189 if (putObj) gdb.putObject(Float.valueOf(f)); 190 } 191 } 192 193 void getFloats(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 194 for (float f : encodableFloats) { 195 if (getPrim) assertTrue(gdb.getFloat() == f); 196 if (getObj) assertTrue(gdb.getObject().equals(Float.valueOf(f))); 197 } 198 } 199 200 void putFloatNaN(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 201 if (putPrim) gdb.putFloat(Float.NaN); 202 if (putObj) gdb.putObject(Float.valueOf(Float.NaN)); 203 } 204 205 void getFloatNaN(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 206 if (getPrim) assertTrue(Float.isNaN(gdb.getFloat())); 207 if (getObj) assertTrue(gdb.getObject().equals(Float.valueOf(Float.NaN))); 208 } 209 210 void putDoubles(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 211 for (double d : encodableDoubles) { 212 if (putPrim) gdb.putDouble(d); 213 if (putObj) gdb.putObject(Double.valueOf(d)); 214 } 215 } 216 217 void getDoubles(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 218 for (double d : encodableDoubles) { 219 if (getPrim) assertTrue(gdb.getDouble() == d); 220 if (getObj) assertTrue(gdb.getObject().equals(Double.valueOf(d))); 221 } 222 } 223 224 void putDoubleNaN(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 225 if (putPrim) gdb.putDouble(Double.NaN); 226 if (putObj) gdb.putObject(Double.valueOf(Double.NaN)); 227 } 228 229 void getDoubleNaN(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 230 if (getPrim) assertTrue(Double.isNaN(gdb.getDouble())); 231 if (getObj) assertTrue(gdb.getObject().equals(Double.valueOf(Double.NaN))); 232 } 233 234 void fill(GrowableDataBuffer gdb, boolean putPrim, boolean putObj) { 235 putBooleans(gdb, putPrim, putObj); 236 putChars(gdb, putPrim, putObj); 237 putBytes(gdb, putPrim, putObj); 238 putShorts(gdb, putPrim, putObj); 239 putInts(gdb, putPrim, putObj); 240 putLongs(gdb, putPrim, putObj); 241 putFloats(gdb, putPrim, putObj); 242 putFloatNaN(gdb, putPrim, putObj); 243 putDoubles(gdb, putPrim, putObj); 244 putDoubleNaN(gdb, putPrim, putObj); 245 } 246 247 void test(GrowableDataBuffer gdb, boolean getPrim, boolean getObj) { 248 getBooleans(gdb, getPrim, getObj); 249 getChars(gdb, getPrim, getObj); 250 getBytes(gdb, getPrim, getObj); 251 getShorts(gdb, getPrim, getObj); 252 getInts(gdb, getPrim, getObj); 253 getLongs(gdb, getPrim, getObj); 254 getFloats(gdb, getPrim, getObj); 255 getFloatNaN(gdb, getPrim, getObj); 256 getDoubles(gdb, getPrim, getObj); 257 getDoubleNaN(gdb, getPrim, getObj); 258 } 259 260 @Test public void testCapacities() { 261 for (int i = 1; i < 100000; i += 100) { 262 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(i, i); 263 assertFalse(gdb.hasValues()); 264 assertFalse(gdb.hasObjects()); 265 assertTrue(gdb.isEmpty()); 266 assertTrue(gdb.valueCapacity() >= i); 267 assertTrue(gdb.objectCapacity() >= i); 268 } 269 } 270 271 @Test public void testWriteAndReadValues() { 272 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 273 fill(gdb, true, false); 274 assertTrue(gdb.hasValues()); 275 assertFalse(gdb.hasObjects()); 276 test(gdb, true, false); 277 assertFalse(gdb.hasValues()); 278 assertFalse(gdb.hasObjects()); 279 } 280 281 @Test public void testWriteAndReadUbytes() { 282 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 283 putUBytes(gdb); 284 assertTrue(gdb.hasValues()); 285 assertFalse(gdb.hasObjects()); 286 getUBytes(gdb); 287 assertFalse(gdb.hasValues()); 288 assertFalse(gdb.hasObjects()); 289 } 290 291 @Test public void testWriteAndReadObjects() { 292 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 293 fill(gdb, false, true); 294 assertFalse(gdb.hasValues()); 295 assertTrue(gdb.hasObjects()); 296 test(gdb, false, true); 297 assertFalse(gdb.hasValues()); 298 assertFalse(gdb.hasObjects()); 299 } 300 301 @Test public void testWriteAndReadValuesAndObjects() { 302 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 303 fill(gdb, true, true); 304 assertTrue(gdb.hasValues()); 305 assertTrue(gdb.hasObjects()); 306 test(gdb, true, true); 307 assertFalse(gdb.hasValues()); 308 assertFalse(gdb.hasObjects()); 309 } 310 311 @Test public void testWriteAndReadGrowableValues() { 312 for (int i = 0; i < NUM_BYTES; i++) { 313 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(i, NUM_VALUES); 314 fill(gdb, true, false); 315 assertTrue(gdb.hasValues()); 316 assertFalse(gdb.hasObjects()); 317 test(gdb, true, false); 318 assertFalse(gdb.hasValues()); 319 assertFalse(gdb.hasObjects()); 320 } 321 } 322 323 @Test public void testWriteAndReadGrowableObjects() { 324 for (int i = 0; i < NUM_VALUES; i++) { 325 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, i); 326 fill(gdb, false, true); 327 assertFalse(gdb.hasValues()); 328 assertTrue(gdb.hasObjects()); 329 test(gdb, false, true); 330 assertFalse(gdb.hasValues()); 331 assertFalse(gdb.hasObjects()); 332 } 333 } 334 335 @Test public void testWriteAndMultipleReads() { 336 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 337 fill(gdb, true, true); 338 assertTrue(gdb.hasValues()); 339 assertTrue(gdb.hasObjects()); 340 gdb.save(); 341 assertTrue(gdb.hasValues()); 342 assertTrue(gdb.hasObjects()); 343 test(gdb, true, true); 344 assertFalse(gdb.hasValues()); 345 assertFalse(gdb.hasObjects()); 346 gdb.restore(); 347 assertTrue(gdb.hasValues()); 348 assertTrue(gdb.hasObjects()); 349 test(gdb, true, true); 350 assertFalse(gdb.hasValues()); 351 assertFalse(gdb.hasObjects()); 352 } 353 354 @Test public void testPeekValues() { 355 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 356 fill(gdb, true, false); 357 assertTrue(gdb.hasValues()); 358 assertFalse(gdb.hasObjects()); 359 for (int i = 0; i < gdb.writeValuePosition(); i++) { 360 gdb.peekByte(i); 361 } 362 assertTrue(gdb.hasValues()); 363 assertFalse(gdb.hasObjects()); 364 } 365 366 @Test public void testPeekObjects() { 367 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 368 fill(gdb, false, true); 369 assertFalse(gdb.hasValues()); 370 assertTrue(gdb.hasObjects()); 371 for (int i = 0; i < gdb.writeValuePosition(); i++) { 372 gdb.peekByte(i); 373 } 374 assertFalse(gdb.hasValues()); 375 assertTrue(gdb.hasObjects()); 376 } 377 378 @Test public void testAppend() { 379 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 380 fill(gdb, true, true); 381 GrowableDataBuffer gdb2 = GrowableDataBuffer.getBuffer(NUM_BYTES, NUM_VALUES); 382 fill(gdb2, true, true); 383 gdb.append(gdb2); 384 assertTrue(gdb.hasValues()); 385 assertTrue(gdb.hasObjects()); 386 test(gdb, true, true); 387 assertTrue(gdb.hasValues()); 388 assertTrue(gdb.hasObjects()); 389 test(gdb, true, true); 390 assertFalse(gdb.hasValues()); 391 assertFalse(gdb.hasObjects()); 392 } 393 394 @Test public void testReset() { 395 GrowableDataBuffer gdb = GrowableDataBuffer.getBuffer(0, 0); 396 fill(gdb, true, true); 397 assertTrue(gdb.hasValues()); 398 assertTrue(gdb.hasObjects()); 399 int valcapacity = gdb.valueCapacity(); 400 int objcapacity = gdb.objectCapacity(); 401 for (int i = 0; i < 5; i++) { 402 gdb.reset(); 403 assertFalse(gdb.hasValues()); 404 assertFalse(gdb.hasObjects()); 405 fill(gdb, true, true); 406 assertTrue(gdb.hasValues()); 407 assertTrue(gdb.hasObjects()); 408 } 409 assertTrue(gdb.valueCapacity() == valcapacity); 410 assertTrue(gdb.objectCapacity() == objcapacity); 411 test(gdb, true, true); 412 assertFalse(gdb.hasValues()); 413 assertFalse(gdb.hasObjects()); 414 } 415 }