1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. 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 package org.apache.harmony.tests.java.nio; 19 20 import java.nio.BufferOverflowException; 21 import java.nio.BufferUnderflowException; 22 import java.nio.ByteBuffer; 23 import java.nio.ByteOrder; 24 import java.nio.DoubleBuffer; 25 import java.nio.InvalidMarkException; 26 27 /** 28 * Tests java.nio.DoubleBuffer 29 */ 30 public class DoubleBufferTest extends AbstractBufferTest { 31 32 protected static final int SMALL_TEST_LENGTH = 5; 33 34 protected static final int BUFFER_LENGTH = 20; 35 36 protected DoubleBuffer buf; 37 38 protected void setUp() throws Exception { 39 buf = DoubleBuffer.allocate(BUFFER_LENGTH); 40 loadTestData1(buf); 41 baseBuf = buf; 42 } 43 44 protected void tearDown() throws Exception { 45 buf = null; 46 baseBuf = null; 47 } 48 49 /* 50 * Test with bit sequences that represent the IEEE754 doubles Positive 51 * infinity, negative infinity, and NaN. 52 */ 53 public void testNaNs() { 54 long[] nans = new long[] { 0x7ff0000000000000L, 0xfff0000000000000L, 55 0x7ff8000000000000L }; 56 for (int i = 0; i < nans.length; i++) { 57 long longBitsIn = nans[i]; 58 double dbl = Double.longBitsToDouble(longBitsIn); 59 long longBitsOut = Double.doubleToRawLongBits(dbl); 60 // Sanity check 61 assertTrue(longBitsIn == longBitsOut); 62 63 // Store the double and retrieve it 64 ByteBuffer buffer = ByteBuffer.allocate(8); 65 buffer.putDouble(dbl); 66 double bufDoubleOut = buffer.getDouble(0); 67 68 // Check the bits sequence was not normalized 69 long bufLongOut = Double.doubleToRawLongBits(bufDoubleOut); 70 assertTrue(longBitsIn == bufLongOut); 71 } 72 } 73 74 public void testArray() { 75 double array[] = buf.array(); 76 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 77 78 loadTestData1(array, buf.arrayOffset(), buf.capacity()); 79 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 80 81 loadTestData2(array, buf.arrayOffset(), buf.capacity()); 82 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 83 84 loadTestData1(buf); 85 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 86 87 loadTestData2(buf); 88 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 89 } 90 91 public void testArrayOffset() { 92 double array[] = buf.array(); 93 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 94 95 loadTestData1(array, buf.arrayOffset(), buf.capacity()); 96 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 97 98 loadTestData2(array, buf.arrayOffset(), buf.capacity()); 99 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 100 101 loadTestData1(buf); 102 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 103 104 loadTestData2(buf); 105 assertContentEquals(buf, array, buf.arrayOffset(), buf.capacity()); 106 } 107 108 public void testAsReadOnlyBuffer() { 109 buf.clear(); 110 buf.mark(); 111 buf.position(buf.limit()); 112 113 // readonly's contents should be the same as buf 114 DoubleBuffer readonly = buf.asReadOnlyBuffer(); 115 assertNotSame(buf, readonly); 116 assertTrue(readonly.isReadOnly()); 117 assertEquals(buf.position(), readonly.position()); 118 assertEquals(buf.limit(), readonly.limit()); 119 assertEquals(buf.isDirect(), readonly.isDirect()); 120 assertEquals(buf.order(), readonly.order()); 121 assertContentEquals(buf, readonly); 122 123 // readonly's position, mark, and limit should be independent to buf 124 readonly.reset(); 125 assertEquals(readonly.position(), 0); 126 readonly.clear(); 127 assertEquals(buf.position(), buf.limit()); 128 buf.reset(); 129 assertEquals(buf.position(), 0); 130 } 131 132 public void testCompact() { 133 // case: buffer is full 134 buf.clear(); 135 buf.mark(); 136 loadTestData1(buf); 137 DoubleBuffer ret = buf.compact(); 138 assertSame(ret, buf); 139 assertEquals(buf.position(), buf.capacity()); 140 assertEquals(buf.limit(), buf.capacity()); 141 assertContentLikeTestData1(buf, 0, 0.0, buf.capacity()); 142 try { 143 buf.reset(); 144 fail("Should throw Exception"); //$NON-NLS-1$ 145 } catch (InvalidMarkException e) { 146 // expected 147 } 148 149 // case: buffer is empty 150 buf.position(0); 151 buf.limit(0); 152 buf.mark(); 153 ret = buf.compact(); 154 assertSame(ret, buf); 155 assertEquals(buf.position(), 0); 156 assertEquals(buf.limit(), buf.capacity()); 157 assertContentLikeTestData1(buf, 0, 0.0, buf.capacity()); 158 try { 159 buf.reset(); 160 fail("Should throw Exception"); //$NON-NLS-1$ 161 } catch (InvalidMarkException e) { 162 // expected 163 } 164 165 // case: normal 166 assertTrue(buf.capacity() > 5); 167 buf.position(1); 168 buf.limit(5); 169 buf.mark(); 170 ret = buf.compact(); 171 assertSame(ret, buf); 172 assertEquals(buf.position(), 4); 173 assertEquals(buf.limit(), buf.capacity()); 174 assertContentLikeTestData1(buf, 0, 1.0, 4); 175 try { 176 buf.reset(); 177 fail("Should throw Exception"); //$NON-NLS-1$ 178 } catch (InvalidMarkException e) { 179 // expected 180 } 181 } 182 183 public void testCompareTo() { 184 DoubleBuffer other = DoubleBuffer.allocate(buf.capacity()); 185 loadTestData1(other); 186 assertEquals(0, buf.compareTo(other)); 187 assertEquals(0, other.compareTo(buf)); 188 buf.position(1); 189 assertTrue(buf.compareTo(other) > 0); 190 assertTrue(other.compareTo(buf) < 0); 191 other.position(2); 192 assertTrue(buf.compareTo(other) < 0); 193 assertTrue(other.compareTo(buf) > 0); 194 buf.position(2); 195 other.limit(5); 196 assertTrue(buf.compareTo(other) > 0); 197 assertTrue(other.compareTo(buf) < 0); 198 199 DoubleBuffer dbuffer1 = DoubleBuffer.wrap(new double[] { Double.NaN }); 200 DoubleBuffer dbuffer2 = DoubleBuffer.wrap(new double[] { Double.NaN }); 201 DoubleBuffer dbuffer3 = DoubleBuffer.wrap(new double[] { 42d }); 202 203 assertEquals("Failed equal comparison with NaN entry", 0, dbuffer1 204 .compareTo(dbuffer2)); 205 assertEquals("Failed greater than comparison with NaN entry", -1, dbuffer3 206 .compareTo(dbuffer1)); 207 assertEquals("Failed greater than comparison with NaN entry", 1, dbuffer1 208 .compareTo(dbuffer3)); 209 } 210 211 public void testDuplicate() { 212 buf.clear(); 213 buf.mark(); 214 buf.position(buf.limit()); 215 216 // duplicate's contents should be the same as buf 217 DoubleBuffer duplicate = buf.duplicate(); 218 assertNotSame(buf, duplicate); 219 assertEquals(buf.position(), duplicate.position()); 220 assertEquals(buf.limit(), duplicate.limit()); 221 assertEquals(buf.isReadOnly(), duplicate.isReadOnly()); 222 assertEquals(buf.isDirect(), duplicate.isDirect()); 223 assertEquals(buf.order(), duplicate.order()); 224 assertContentEquals(buf, duplicate); 225 226 // duplicate's position, mark, and limit should be independent to buf 227 duplicate.reset(); 228 assertEquals(duplicate.position(), 0); 229 duplicate.clear(); 230 assertEquals(buf.position(), buf.limit()); 231 buf.reset(); 232 assertEquals(buf.position(), 0); 233 234 // duplicate share the same content with buf 235 // FIXME 236 if (!duplicate.isReadOnly()) { 237 loadTestData1(buf); 238 assertContentEquals(buf, duplicate); 239 loadTestData2(duplicate); 240 assertContentEquals(buf, duplicate); 241 } 242 } 243 244 public void testEquals() { 245 // equal to self 246 assertTrue(buf.equals(buf)); 247 DoubleBuffer readonly = buf.asReadOnlyBuffer(); 248 assertTrue(buf.equals(readonly)); 249 DoubleBuffer duplicate = buf.duplicate(); 250 assertTrue(buf.equals(duplicate)); 251 252 // always false, if type mismatch 253 assertFalse(buf.equals(Boolean.TRUE)); 254 255 assertTrue(buf.capacity() > 5); 256 257 buf.limit(buf.capacity()).position(0); 258 readonly.limit(readonly.capacity()).position(1); 259 assertFalse(buf.equals(readonly)); 260 261 buf.limit(buf.capacity() - 1).position(0); 262 duplicate.limit(duplicate.capacity()).position(0); 263 assertFalse(buf.equals(duplicate)); 264 } 265 266 /* 267 * Class under test for double get() 268 */ 269 public void testGet() { 270 buf.clear(); 271 for (int i = 0; i < buf.capacity(); i++) { 272 assertEquals(buf.position(), i); 273 assertEquals(buf.get(), buf.get(i), 0.01); 274 } 275 try { 276 buf.get(); 277 fail("Should throw Exception"); //$NON-NLS-1$ 278 } catch (BufferUnderflowException e) { 279 // expected 280 } 281 } 282 283 /* 284 * Class under test for java.nio.DoubleBuffer get(double[]) 285 */ 286 public void testGetdoubleArray() { 287 double array[] = new double[1]; 288 buf.clear(); 289 for (int i = 0; i < buf.capacity(); i++) { 290 assertEquals(buf.position(), i); 291 DoubleBuffer ret = buf.get(array); 292 assertEquals(array[0], buf.get(i), 0.01); 293 assertSame(ret, buf); 294 } 295 try { 296 buf.get(array); 297 fail("Should throw Exception"); //$NON-NLS-1$ 298 } catch (BufferUnderflowException e) { 299 // expected 300 } 301 } 302 303 /* 304 * Class under test for java.nio.DoubleBuffer get(double[], int, int) 305 */ 306 public void testGetdoubleArrayintint() { 307 buf.clear(); 308 double array[] = new double[buf.capacity()]; 309 310 try { 311 buf.get(new double[buf.capacity() + 1], 0, buf.capacity() + 1); 312 fail("Should throw Exception"); //$NON-NLS-1$ 313 } catch (BufferUnderflowException e) { 314 // expected 315 } 316 assertEquals(buf.position(), 0); 317 try { 318 buf.get(array, -1, array.length); 319 fail("Should throw Exception"); //$NON-NLS-1$ 320 } catch (IndexOutOfBoundsException e) { 321 // expected 322 } 323 buf.get(array, array.length, 0); 324 try { 325 buf.get(array, array.length + 1, 1); 326 fail("Should throw Exception"); //$NON-NLS-1$ 327 } catch (IndexOutOfBoundsException e) { 328 // expected 329 } 330 assertEquals(buf.position(), 0); 331 try { 332 buf.get(array, 2, -1); 333 fail("Should throw Exception"); //$NON-NLS-1$ 334 } catch (IndexOutOfBoundsException e) { 335 // expected 336 } 337 try { 338 buf.get((double[])null, 0, -1); 339 fail("Should throw Exception"); //$NON-NLS-1$ 340 } catch (NullPointerException e) { 341 // expected 342 } 343 try { 344 buf.get(array, 2, array.length); 345 fail("Should throw Exception"); //$NON-NLS-1$ 346 } catch (IndexOutOfBoundsException e) { 347 // expected 348 } 349 try { 350 buf.get(array, 1, Integer.MAX_VALUE); 351 fail("Should throw Exception"); //$NON-NLS-1$ 352 } catch (BufferUnderflowException expected) { 353 } catch (IndexOutOfBoundsException expected) { 354 } 355 try { 356 buf.get(array, Integer.MAX_VALUE, 1); 357 fail("Should throw Exception"); //$NON-NLS-1$ 358 } catch (IndexOutOfBoundsException e) { 359 // expected 360 } 361 assertEquals(buf.position(), 0); 362 363 buf.clear(); 364 DoubleBuffer ret = buf.get(array, 0, array.length); 365 assertEquals(buf.position(), buf.capacity()); 366 assertContentEquals(buf, array, 0, array.length); 367 assertSame(ret, buf); 368 } 369 370 /* 371 * Class under test for double get(int) 372 */ 373 public void testGetint() { 374 buf.clear(); 375 for (int i = 0; i < buf.capacity(); i++) { 376 assertEquals(buf.position(), i); 377 assertEquals(buf.get(), buf.get(i), 0.01); 378 } 379 try { 380 buf.get(-1); 381 fail("Should throw Exception"); //$NON-NLS-1$ 382 } catch (IndexOutOfBoundsException e) { 383 // expected 384 } 385 try { 386 buf.get(buf.limit()); 387 fail("Should throw Exception"); //$NON-NLS-1$ 388 } catch (IndexOutOfBoundsException e) { 389 // expected 390 } 391 } 392 393 public void testHasArray() { 394 assertTrue(buf.hasArray()); 395 } 396 397 public void testHashCode() { 398 buf.clear(); 399 DoubleBuffer readonly = buf.asReadOnlyBuffer(); 400 DoubleBuffer duplicate = buf.duplicate(); 401 assertTrue(buf.hashCode() == readonly.hashCode()); 402 403 assertTrue(buf.capacity() > 5); 404 duplicate.position(buf.capacity() / 2); 405 assertTrue(buf.hashCode() != duplicate.hashCode()); 406 } 407 408 public void testIsDirect() { 409 assertFalse(buf.isDirect()); 410 } 411 412 public void testOrder() { 413 assertEquals(ByteOrder.nativeOrder(), buf.order()); 414 } 415 416 /* 417 * Class under test for java.nio.DoubleBuffer put(double) 418 */ 419 public void testPutdouble() { 420 421 buf.clear(); 422 for (int i = 0; i < buf.capacity(); i++) { 423 assertEquals(buf.position(), i); 424 DoubleBuffer ret = buf.put((double) i); 425 assertEquals(buf.get(i), (double) i, 0.0); 426 assertSame(ret, buf); 427 } 428 try { 429 buf.put(0); 430 fail("Should throw Exception"); //$NON-NLS-1$ 431 } catch (BufferOverflowException e) { 432 // expected 433 } 434 } 435 436 /* 437 * Class under test for java.nio.DoubleBuffer put(double[]) 438 */ 439 public void testPutdoubleArray() { 440 double array[] = new double[1]; 441 442 buf.clear(); 443 for (int i = 0; i < buf.capacity(); i++) { 444 assertEquals(buf.position(), i); 445 array[0] = (double) i; 446 DoubleBuffer ret = buf.put(array); 447 assertEquals(buf.get(i), (double) i, 0.0); 448 assertSame(ret, buf); 449 } 450 try { 451 buf.put(array); 452 fail("Should throw Exception"); //$NON-NLS-1$ 453 } catch (BufferOverflowException e) { 454 // expected 455 } 456 } 457 458 /* 459 * Class under test for java.nio.DoubleBuffer put(double[], int, int) 460 */ 461 public void testPutdoubleArrayintint() { 462 buf.clear(); 463 double array[] = new double[buf.capacity()]; 464 465 try { 466 buf.put(new double[buf.capacity() + 1], 0, buf.capacity() + 1); 467 fail("Should throw Exception"); //$NON-NLS-1$ 468 } catch (BufferOverflowException e) { 469 // expected 470 } 471 assertEquals(buf.position(), 0); 472 try { 473 buf.put(array, -1, array.length); 474 fail("Should throw Exception"); //$NON-NLS-1$ 475 } catch (IndexOutOfBoundsException e) { 476 // expected 477 } 478 try { 479 buf.put(array, array.length + 1, 0); 480 fail("Should throw Exception"); //$NON-NLS-1$ 481 } catch (IndexOutOfBoundsException e) { 482 // expected 483 } 484 buf.put(array, array.length, 0); 485 assertEquals(buf.position(), 0); 486 try { 487 buf.put(array, 0, -1); 488 fail("Should throw Exception"); //$NON-NLS-1$ 489 } catch (IndexOutOfBoundsException e) { 490 // expected 491 } 492 try { 493 buf.put((double[])null, 0, -1); 494 fail("Should throw Exception"); //$NON-NLS-1$ 495 } catch (NullPointerException e) { 496 // expected 497 } 498 try { 499 buf.put(array, 2, array.length); 500 fail("Should throw Exception"); //$NON-NLS-1$ 501 } catch (IndexOutOfBoundsException e) { 502 // expected 503 } 504 try { 505 buf.put(array, Integer.MAX_VALUE, 1); 506 fail("Should throw Exception"); //$NON-NLS-1$ 507 } catch (IndexOutOfBoundsException e) { 508 // expected 509 } 510 try { 511 buf.put(array, 1, Integer.MAX_VALUE); 512 fail("Should throw Exception"); //$NON-NLS-1$ 513 } catch (BufferOverflowException expected) { 514 } catch (IndexOutOfBoundsException expected) { 515 } 516 assertEquals(buf.position(), 0); 517 518 loadTestData2(array, 0, array.length); 519 DoubleBuffer ret = buf.put(array, 0, array.length); 520 assertEquals(buf.position(), buf.capacity()); 521 assertContentEquals(buf, array, 0, array.length); 522 assertSame(ret, buf); 523 } 524 525 /* 526 * Class under test for java.nio.DoubleBuffer put(java.nio.DoubleBuffer) 527 */ 528 public void testPutDoubleBuffer() { 529 DoubleBuffer other = DoubleBuffer.allocate(buf.capacity()); 530 531 try { 532 buf.put(buf); 533 fail("Should throw Exception"); //$NON-NLS-1$ 534 } catch (IllegalArgumentException e) { 535 // expected 536 } 537 try { 538 buf.put(DoubleBuffer.allocate(buf.capacity() + 1)); 539 fail("Should throw Exception"); //$NON-NLS-1$ 540 } catch (BufferOverflowException e) { 541 // expected 542 } 543 544 loadTestData2(other); 545 other.clear(); 546 buf.clear(); 547 DoubleBuffer ret = buf.put(other); 548 assertEquals(other.position(), other.capacity()); 549 assertEquals(buf.position(), buf.capacity()); 550 assertContentEquals(other, buf); 551 assertSame(ret, buf); 552 } 553 554 /* 555 * Class under test for java.nio.DoubleBuffer put(int, double) 556 */ 557 public void testPutintdouble() { 558 buf.clear(); 559 for (int i = 0; i < buf.capacity(); i++) { 560 assertEquals(buf.position(), 0); 561 DoubleBuffer ret = buf.put(i, (double) i); 562 assertEquals(buf.get(i), (double) i, 0.0); 563 assertSame(ret, buf); 564 } 565 try { 566 buf.put(-1, 0); 567 fail("Should throw Exception"); //$NON-NLS-1$ 568 } catch (IndexOutOfBoundsException e) { 569 // expected 570 } 571 try { 572 buf.put(buf.limit(), 0); 573 fail("Should throw Exception"); //$NON-NLS-1$ 574 } catch (IndexOutOfBoundsException e) { 575 // expected 576 } 577 } 578 579 public void testSlice() { 580 assertTrue(buf.capacity() > 5); 581 buf.position(1); 582 buf.limit(buf.capacity() - 1); 583 584 DoubleBuffer slice = buf.slice(); 585 assertEquals(buf.isReadOnly(), slice.isReadOnly()); 586 assertEquals(buf.isDirect(), slice.isDirect()); 587 assertEquals(buf.order(), slice.order()); 588 assertEquals(slice.position(), 0); 589 assertEquals(slice.limit(), buf.remaining()); 590 assertEquals(slice.capacity(), buf.remaining()); 591 try { 592 slice.reset(); 593 fail("Should throw Exception"); //$NON-NLS-1$ 594 } catch (InvalidMarkException e) { 595 // expected 596 } 597 598 // slice share the same content with buf 599 // FIXME: 600 if (!slice.isReadOnly()) { 601 loadTestData1(slice); 602 assertContentLikeTestData1(buf, 1, 0, slice.capacity()); 603 buf.put(2, 500); 604 assertEquals(slice.get(1), 500, 0.0); 605 } 606 } 607 608 public void testToString() { 609 String str = buf.toString(); 610 assertTrue(str.indexOf("Double") >= 0 || str.indexOf("double") >= 0); 611 assertTrue(str.indexOf("" + buf.position()) >= 0); 612 assertTrue(str.indexOf("" + buf.limit()) >= 0); 613 assertTrue(str.indexOf("" + buf.capacity()) >= 0); 614 } 615 616 void loadTestData1(double array[], int offset, int length) { 617 for (int i = 0; i < length; i++) { 618 array[offset + i] = (double) i; 619 } 620 } 621 622 void loadTestData2(double array[], int offset, int length) { 623 for (int i = 0; i < length; i++) { 624 array[offset + i] = (double) length - i; 625 } 626 } 627 628 void loadTestData1(DoubleBuffer buf) { 629 buf.clear(); 630 for (int i = 0; i < buf.capacity(); i++) { 631 buf.put(i, (double) i); 632 } 633 } 634 635 void loadTestData2(DoubleBuffer buf) { 636 buf.clear(); 637 for (int i = 0; i < buf.capacity(); i++) { 638 buf.put(i, (double) buf.capacity() - i); 639 } 640 } 641 642 private void assertContentEquals(DoubleBuffer buf, double array[], 643 int offset, int length) { 644 for (int i = 0; i < length; i++) { 645 assertEquals(buf.get(i), array[offset + i], 0.01); 646 } 647 } 648 649 private void assertContentEquals(DoubleBuffer buf, DoubleBuffer other) { 650 assertEquals(buf.capacity(), other.capacity()); 651 for (int i = 0; i < buf.capacity(); i++) { 652 assertEquals(buf.get(i), other.get(i), 0.01); 653 } 654 } 655 656 private void assertContentLikeTestData1(DoubleBuffer buf, int startIndex, 657 double startValue, int length) { 658 double value = startValue; 659 for (int i = 0; i < length; i++) { 660 assertEquals(buf.get(startIndex + i), value, 0.01); 661 value = value + 1.0; 662 } 663 } 664 } 665