/test/kilim/test/TestTypeDesc.java

http://github.com/kilim/kilim · Java · 155 lines · 103 code · 31 blank · 21 comment · 6 complexity · f3c8bc73dd89a5754fd17586231610d6 MD5 · raw file

  1. /* Copyright (c) 2006, Sriram Srinivasan
  2. *
  3. * You may distribute this software under the terms of the license
  4. * specified in the file "License"
  5. */
  6. package kilim.test;
  7. import kilim.analysis.IncompatibleTypesException;
  8. import kilim.analysis.TypeDesc;
  9. import junit.framework.TestCase;
  10. import static kilim.Constants.*;
  11. import java.lang.reflect.*;
  12. import java.util.Arrays;
  13. import kilim.analysis.KilimContext;
  14. public class TestTypeDesc extends TestCase {
  15. public static String commonSuperType(String oa,String ob) {
  16. return TypeDesc.commonSuperType(KilimContext.DEFAULT.detector,oa,ob);
  17. }
  18. public static String mergeType(String a,String b) throws IncompatibleTypesException {
  19. return TypeDesc.mergeType(KilimContext.DEFAULT.detector,a,b);
  20. }
  21. public void testInterning() throws Exception {
  22. // Verify all strings in Constants that start with "D_"
  23. // are indeed interned.
  24. Class<?> c = Class.forName("kilim.Constants");
  25. Field[] fields = c.getFields();
  26. for (Field f:fields) {
  27. if (f.getName().startsWith("D_")) {
  28. String val = f.get(null).toString();
  29. assertSame(TypeDesc.getInterned(new String(val)), val);
  30. }
  31. }
  32. }
  33. public void testComponentType() {
  34. assertSame(TypeDesc.getComponentType("[J"), D_LONG);
  35. assertSame(TypeDesc.getComponentType("[Ljava/lang/String;"), D_STRING);
  36. }
  37. public void testCommonSuperTypes() {
  38. // Two interfaces => Object. Checking interning at the same time.
  39. assertSame(commonSuperType("Ljava/io/Serializable;", "Ljava/lang/Comparable;"),
  40. D_OBJECT);
  41. assertEquals(commonSuperType("Lkilim/BasicBlock;",
  42. "Lkilim/BasicBlock;"), "Lkilim/BasicBlock;");
  43. assertSame(commonSuperType("[Z", "[Z"), D_ARRAY_BOOLEAN);
  44. // least upper bound of Field and Method is AccessibleObject
  45. assertEquals("Ljava/lang/reflect/AccessibleObject;",
  46. commonSuperType("Ljava/lang/reflect/Field;",
  47. "Ljava/lang/reflect/Method;"));
  48. // least upper bound of Field and AccessibleObject is AccessibleObject
  49. assertEquals("Ljava/lang/reflect/AccessibleObject;",
  50. commonSuperType("Ljava/lang/reflect/Field;",
  51. "Ljava/lang/reflect/AccessibleObject;"));
  52. // Same as above, but flip the order to see if it is sensitive.
  53. assertEquals("Ljava/lang/reflect/AccessibleObject;",
  54. commonSuperType("Ljava/lang/reflect/Field;",
  55. "Ljava/lang/reflect/AccessibleObject;"));
  56. assertEquals("Lkilim/test/ex/ExA;",
  57. commonSuperType("Lkilim/test/ex/ExA;", "Lkilim/test/ex/ExD;"));
  58. assertEquals("Lkilim/test/ex/ExA;",
  59. commonSuperType("Lkilim/test/ex/ExD;", "Lkilim/test/ex/ExA;"));
  60. assertEquals("Lkilim/test/ex/ExA;",
  61. commonSuperType("Lkilim/test/ex/ExC;", "Lkilim/test/ex/ExD;"));
  62. }
  63. public void testArray() throws IncompatibleTypesException {
  64. assertSame(D_OBJECT,
  65. mergeType("Lkilim/test/ex/ExC;", "[Z"));
  66. assertSame(D_OBJECT,
  67. mergeType("[Z", "Lkilim/test/ex/ExC;"));
  68. }
  69. public void testNull() throws IncompatibleTypesException {
  70. assertSame(D_NULL, mergeType(D_NULL, D_NULL));
  71. assertSame(D_OBJECT, mergeType(D_OBJECT, D_NULL));
  72. assertSame(D_OBJECT, mergeType(D_NULL, D_OBJECT));
  73. }
  74. public void testNumArgs() throws IncompatibleTypesException {
  75. assertTrue(TypeDesc.getNumArgumentTypes("()V") == 0);
  76. assertTrue(TypeDesc.getNumArgumentTypes("(Ljava/lang/String;[[[ZZBCDSIJF)V") == 10);
  77. }
  78. public void testReturnType() throws IncompatibleTypesException {
  79. assertTrue(TypeDesc.getReturnTypeDesc("()V") == D_VOID);
  80. assertTrue(TypeDesc.getReturnTypeDesc("()[I") == D_ARRAY_INT);
  81. assertTrue(TypeDesc.getReturnTypeDesc("(IIII)[Ljava/lang/Throwable;").equals("[Ljava/lang/Throwable;"));
  82. }
  83. public void testArgTypes() throws IncompatibleTypesException {
  84. String[] types = TypeDesc.getArgumentTypes("([Ljava/lang/String;[[[ZZBCDSIJF)V");
  85. String[] expected = new String[] {"[Ljava/lang/String;","[[[Z", D_BOOLEAN, D_BYTE,D_CHAR,
  86. D_DOUBLE,D_SHORT,D_INT,D_LONG,D_FLOAT};
  87. assertTrue(Arrays.equals(types, expected));
  88. }
  89. public void testMerge() throws IncompatibleTypesException {
  90. // testCommonSuperTypes() has already checked many combinations of
  91. // classes, arrays and interfaces. Handle null etc.
  92. // Null + String => String
  93. assertSame(D_STRING, mergeType(D_NULL, D_STRING));
  94. // Null + X == X (order of D_NULL flipped this time)
  95. assertSame(D_ARRAY_DOUBLE, mergeType("[D", D_NULL));
  96. // primitive types should return the same
  97. assertEquals(D_DOUBLE, mergeType(D_DOUBLE, D_DOUBLE));
  98. // Array + Object -> Array
  99. assertSame(D_OBJECT, mergeType("[I", D_OBJECT));
  100. assertSame(D_OBJECT, mergeType("[I", "[D"));
  101. // common supertype of arrays
  102. assertEquals("[Ljava/lang/reflect/AccessibleObject;",
  103. mergeType("[Ljava/lang/reflect/Field;","[Ljava/lang/reflect/Method;"));
  104. // A inherits from B ==> merge(A[], B[]) = B[]
  105. assertEquals("[Ljava/lang/reflect/AccessibleObject;",
  106. mergeType("[Ljava/lang/reflect/Method;", "[Ljava/lang/reflect/AccessibleObject;"));
  107. // A inherits from B ==> merge(A[], B[]) = A[]
  108. assertEquals("[Ljava/lang/reflect/AccessibleObject;",
  109. mergeType("[Ljava/lang/reflect/AccessibleObject;", "[Ljava/lang/reflect/Method;"));
  110. }
  111. public void testInvalidCombinations() {
  112. assertInvalidCombo("I", D_OBJECT);
  113. assertInvalidCombo(D_OBJECT, D_INT);
  114. assertInvalidCombo("Meaningless", D_OBJECT);
  115. }
  116. private void assertInvalidCombo(String a, String b) {
  117. try {
  118. mergeType(a,b);
  119. fail("Types '" + a + "' and '" + b + "' aren't supposed to be compatible");
  120. } catch (IncompatibleTypesException ignore) {
  121. // Good. It is supposed to fail
  122. }
  123. }
  124. }