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