528 Throwable actual) { 529 if (expected.isInstance(actual)) return; 530 actual.printStackTrace(); 531 assertEquals(expected, actual.getClass()); 532 } 533 534 static final boolean DEBUG_METHOD_HANDLE_NAMES = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES"); 535 536 // rough check of name string 537 static void assertNameStringContains(MethodHandle x, String s) { 538 if (!DEBUG_METHOD_HANDLE_NAMES) { 539 // ignore s 540 assertEquals("MethodHandle"+x.type(), x.toString()); 541 return; 542 } 543 if (x.toString().contains(s)) return; 544 assertEquals(s, x); 545 } 546 547 public static class HasFields { 548 boolean fZ = false; 549 byte fB = (byte)'B'; 550 short fS = (short)'S'; 551 char fC = 'C'; 552 int fI = 'I'; 553 long fJ = 'J'; 554 float fF = 'F'; 555 double fD = 'D'; 556 static boolean sZ = true; 557 static byte sB = 1+(byte)'B'; 558 static short sS = 1+(short)'S'; 559 static char sC = 1+'C'; 560 static int sI = 1+'I'; 561 static long sJ = 1+'J'; 562 static float sF = 1+'F'; 563 static double sD = 1+'D'; 564 565 Object fL = 'L'; 566 String fR = "R"; 567 static Object sL = 'M'; 568 static String sR = "S"; 569 570 static final Object[][] CASES; 571 static { 572 ArrayList<Object[]> cases = new ArrayList<>(); 573 Object types[][] = { 574 {'L',Object.class}, {'R',String.class}, 575 {'I',int.class}, {'J',long.class}, 576 {'F',float.class}, {'D',double.class}, 577 {'Z',boolean.class}, {'B',byte.class}, 578 {'S',short.class}, {'C',char.class}, 579 }; 580 HasFields fields = new HasFields(); 581 for (Object[] t : types) { 582 for (int kind = 0; kind <= 1; kind++) { 583 boolean isStatic = (kind != 0); 584 char btc = (Character)t[0]; 585 String name = (isStatic ? "s" : "f") + btc; 586 Class<?> type = (Class<?>) t[1]; 587 Object value; 588 Field field; 589 try { 590 field = HasFields.class.getDeclaredField(name); 591 } catch (NoSuchFieldException | SecurityException ex) { 592 throw new InternalError("no field HasFields."+name); 593 } 594 try { 595 value = field.get(fields); 596 } catch (IllegalArgumentException | IllegalAccessException ex) { 597 throw new InternalError("cannot fetch field HasFields."+name); 598 } 599 if (type == float.class) { 600 float v = 'F'; 601 if (isStatic) v++; 602 assertTrue(value.equals(v)); 603 } 604 assertTrue(name.equals(field.getName())); 605 assertTrue(type.equals(field.getType())); 606 assertTrue(isStatic == (Modifier.isStatic(field.getModifiers()))); 607 cases.add(new Object[]{ field, value }); 608 } 609 } 610 cases.add(new Object[]{ new Object[]{ false, HasFields.class, "bogus_fD", double.class }, Error.class }); 611 cases.add(new Object[]{ new Object[]{ true, HasFields.class, "bogus_sL", Object.class }, Error.class }); 612 CASES = cases.toArray(new Object[0][]); 613 } 614 } 615 616 static final int TEST_UNREFLECT = 1, TEST_FIND_FIELD = 2, TEST_FIND_STATIC = 3, TEST_SETTER = 0x10, TEST_BOUND = 0x20, TEST_NPE = 0x40; 617 618 static boolean testModeMatches(int testMode, boolean isStatic) { 619 switch (testMode) { 620 case TEST_FIND_STATIC: return isStatic; 621 case TEST_FIND_FIELD: return !isStatic; 622 case TEST_UNREFLECT: return true; // unreflect matches both 623 } 624 throw new InternalError("testMode="+testMode); 625 } 626 | 528 Throwable actual) { 529 if (expected.isInstance(actual)) return; 530 actual.printStackTrace(); 531 assertEquals(expected, actual.getClass()); 532 } 533 534 static final boolean DEBUG_METHOD_HANDLE_NAMES = Boolean.getBoolean("java.lang.invoke.MethodHandle.DEBUG_NAMES"); 535 536 // rough check of name string 537 static void assertNameStringContains(MethodHandle x, String s) { 538 if (!DEBUG_METHOD_HANDLE_NAMES) { 539 // ignore s 540 assertEquals("MethodHandle"+x.type(), x.toString()); 541 return; 542 } 543 if (x.toString().contains(s)) return; 544 assertEquals(s, x); 545 } 546 547 public static class HasFields { 548 boolean iZ = false; 549 byte iB = (byte)'B'; 550 short iS = (short)'S'; 551 char iC = 'C'; 552 int iI = 'I'; 553 long iJ = 'J'; 554 float iF = 'F'; 555 double iD = 'D'; 556 static boolean sZ = true; 557 static byte sB = 1+(byte)'B'; 558 static short sS = 1+(short)'S'; 559 static char sC = 1+'C'; 560 static int sI = 1+'I'; 561 static long sJ = 1+'J'; 562 static float sF = 1+'F'; 563 static double sD = 1+'D'; 564 final static boolean fsZ = false; 565 final static byte fsB = 2+(byte)'B'; 566 final static short fsS = 2+(short)'S'; 567 final static char fsC = 2+'C'; 568 final static int fsI = 2+'I'; 569 final static long fsJ = 2+'J'; 570 final static float fsF = 2+'F'; 571 final static double fsD = 2+'D'; 572 573 Object iL = 'L'; 574 String iR = "R"; 575 static Object sL = 'M'; 576 static String sR = "S"; 577 final static Object fsL = 'N'; 578 final static String fsR = "T"; 579 580 static final Object[][] CASES; 581 static { 582 ArrayList<Object[]> cases = new ArrayList<>(); 583 Object types[][] = { 584 {'L',Object.class}, {'R',String.class}, 585 {'I',int.class}, {'J',long.class}, 586 {'F',float.class}, {'D',double.class}, 587 {'Z',boolean.class}, {'B',byte.class}, 588 {'S',short.class}, {'C',char.class}, 589 }; 590 HasFields fields = new HasFields(); 591 for (Object[] t : types) { 592 for (int kind = 0; kind <= 2; kind++) { 593 boolean isStatic = (kind != 0); 594 boolean isFinal = (kind == 2); 595 char btc = (Character)t[0]; 596 String name = (isStatic ? "s" : "i") + btc; 597 if (isFinal) name = "f" + name; 598 Class<?> type = (Class<?>) t[1]; 599 Object value; 600 Field field; 601 try { 602 field = HasFields.class.getDeclaredField(name); 603 } catch (NoSuchFieldException | SecurityException ex) { 604 throw new InternalError("no field HasFields."+name); 605 } 606 try { 607 value = field.get(fields); 608 } catch (IllegalArgumentException | IllegalAccessException ex) { 609 throw new InternalError("cannot fetch field HasFields."+name); 610 } 611 if (type == float.class) { 612 float v = 'F'; 613 if (isStatic) v++; 614 if (isFinal) v++; 615 assertTrue(value.equals(v)); 616 } 617 if (isFinal && isStatic) field.setAccessible(true); 618 assertTrue(name.equals(field.getName())); 619 assertTrue(type.equals(field.getType())); 620 assertTrue(isStatic == (Modifier.isStatic(field.getModifiers()))); 621 assertTrue(isFinal == (Modifier.isFinal(field.getModifiers()))); 622 cases.add(new Object[]{ field, value }); 623 } 624 } 625 cases.add(new Object[]{ new Object[]{ false, HasFields.class, "bogus_fD", double.class }, Error.class }); 626 cases.add(new Object[]{ new Object[]{ true, HasFields.class, "bogus_sL", Object.class }, Error.class }); 627 CASES = cases.toArray(new Object[0][]); 628 } 629 } 630 631 static final int TEST_UNREFLECT = 1, TEST_FIND_FIELD = 2, TEST_FIND_STATIC = 3, TEST_SETTER = 0x10, TEST_BOUND = 0x20, TEST_NPE = 0x40; 632 633 static boolean testModeMatches(int testMode, boolean isStatic) { 634 switch (testMode) { 635 case TEST_FIND_STATIC: return isStatic; 636 case TEST_FIND_FIELD: return !isStatic; 637 case TEST_UNREFLECT: return true; // unreflect matches both 638 } 639 throw new InternalError("testMode="+testMode); 640 } 641 |