1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.bcel.classfile;
19
20 import static org.junit.jupiter.api.Assertions.assertEquals;
21 import static org.junit.jupiter.api.Assertions.assertFalse;
22 import static org.junit.jupiter.api.Assertions.assertNotNull;
23 import static org.junit.jupiter.api.Assertions.assertTrue;
24
25 import java.util.Arrays;
26
27 import org.apache.bcel.Const;
28 import org.apache.bcel.Repository;
29 import org.junit.jupiter.api.Test;
30
31 public class UtilityTestCase {
32
33 @Test
34 public void testClearBit() {
35 assertEquals(0, Utility.clearBit(0, 0));
36 assertEquals(0, Utility.clearBit(1, 0), "1 bit 0 set to 0 -> 0");
37 assertEquals(1, Utility.clearBit(1, 1), "1 bit 1 is 0 hence no change");
38 assertEquals(8, Utility.clearBit(8, 4), "1000 only has 4 bit hence no change");
39 assertEquals(1, Utility.clearBit(9, 3), "1001 bit 3 set to 0 -> 0001");
40 assertEquals(-2, Utility.clearBit(-1, 0), "111...11 set bit 0 to 0 -> 111..10");
41 assertEquals(0, Utility.clearBit(Integer.MIN_VALUE, 31), "100...00 set bit 31 to 0 -> 000..00");
42 }
43
44 @Test
45 public void testCodeToString() throws Exception {
46 final class CodeToString {
47 int[][] a = new int[0][0];
48
49 CodeToString() {
50 if (a instanceof int[][]) {
51 System.out.print(Arrays.asList(a).size());
52 }
53 }
54 }
55 final JavaClass javaClass = Repository.lookupClass(CodeToString.class);
56 assertNotNull(javaClass);
57 for (final Method method : javaClass.getMethods()) {
58 assertEquals("<init>", method.getName());
59 final String code = method.getCode().toString(false);
60 assertTrue(code.contains("0: aload_0"), code);
61 assertTrue(code.contains("1: aload_1"), code);
62 assertTrue(code.contains("2: putfield\t\torg.apache.bcel.classfile.UtilityTestCase$1CodeToString.this$0 Lorg/apache/bcel/classfile/UtilityTestCase;"), code);
63 assertTrue(code.contains("5: aload_0"), code);
64 assertTrue(code.contains("6: invokespecial\tjava.lang.Object.<init> ()V"), code);
65 assertTrue(code.contains("9: aload_0"), code);
66 assertTrue(code.contains("10: iconst_0"), code);
67 assertTrue(code.contains("11: iconst_0"), code);
68 assertTrue(code.contains("12: multianewarray\t<[[I>\t2"), code);
69 assertTrue(code.contains("16: putfield\t\torg.apache.bcel.classfile.UtilityTestCase$1CodeToString.a [[I"), code);
70 assertTrue(code.contains("19: aload_0"), code);
71 assertTrue(code.contains("20: getfield\t\torg.apache.bcel.classfile.UtilityTestCase$1CodeToString.a [[I"), code);
72 assertTrue(code.contains("23: instanceof\t<[[I>"), code);
73 assertTrue(code.contains("26: ifeq\t\t#47"), code);
74 assertTrue(code.contains("29: getstatic\t\tjava.lang.System.out Ljava/io/PrintStream;"), code);
75 assertTrue(code.contains("32: aload_0"), code);
76 assertTrue(code.contains("33: getfield\t\torg.apache.bcel.classfile.UtilityTestCase$1CodeToString.a [[I"), code);
77 assertTrue(code.contains("36: invokestatic\tjava.util.Arrays.asList ([Ljava/lang/Object;)Ljava/util/List;"), code);
78 assertTrue(code.contains("39: invokeinterface\tjava.util.List.size ()I1\t0"), code);
79 assertTrue(code.contains("44: invokevirtual\tjava.io.PrintStream.print (I)V"), code);
80 assertTrue(code.contains("47: return"), code);
81 }
82 }
83
84 @Test
85 public void testConvertString() {
86 assertEquals("\\n", Utility.convertString("\n"));
87 assertEquals("\\r", Utility.convertString("\r"));
88 assertEquals("\\\"", Utility.convertString("\""));
89 assertEquals("\\'", Utility.convertString("'"));
90 assertEquals("\\\\", Utility.convertString("\\"));
91 assertEquals("abc", Utility.convertString("abc"));
92 }
93
94 @Test
95 public void testIsSet() {
96 assertTrue(Utility.isSet(1, 0));
97 assertTrue(Utility.isSet(7, 1));
98 assertTrue(Utility.isSet(8, 3));
99 assertTrue(Utility.isSet(9, 0));
100 assertTrue(Utility.isSet(Integer.MIN_VALUE, 31));
101 assertFalse(Utility.isSet(0, 0));
102 assertFalse(Utility.isSet(8, 4));
103 assertFalse(Utility.isSet(9, 1));
104 }
105
106 @Test
107 public void testPrintArray() {
108 assertEquals(null, Utility.printArray(null, false, false));
109 assertEquals("", Utility.printArray(new Object[0], false, false));
110 assertEquals("{}", Utility.printArray(new Object[0], true, false));
111 assertEquals("null", Utility.printArray(new Object[]{null}, false, false));
112 assertEquals("a, b", Utility.printArray(new String[]{"a", "b"}, false, false));
113 assertEquals("{a, b}", Utility.printArray(new String[]{"a", "b"}, true, false));
114 assertEquals("\"a\", \"b\"", Utility.printArray(new String[]{"a", "b"}, false, true));
115 assertEquals("{\"a\", \"b\"}", Utility.printArray(new String[]{"a", "b"}, true, true));
116 }
117
118 @Test
119 public void testSearchOpcode() {
120 assertEquals(Const.ALOAD, Utility.searchOpcode("aload"));
121 assertEquals(Const.NOP, Utility.searchOpcode("nop"));
122 assertEquals(Const.BREAKPOINT, Utility.searchOpcode("breakpoint"));
123 assertEquals(Const.IMPDEP2, Utility.searchOpcode("impdep2"));
124 assertEquals(Const.I2D, Utility.searchOpcode("I2D"), "case insensitive");
125 assertEquals(Const.UNDEFINED, Utility.searchOpcode("???"), "not found");
126 }
127
128 @Test
129 public void testSetBit() {
130 assertEquals(1, Utility.setBit(0, 0), "0 bit 0 set to 1 -> 1");
131 assertEquals(1, Utility.setBit(1, 0), "1 bit 0 is 1 hence no change");
132 assertEquals(3, Utility.setBit(1, 1), "1 bit 1 set to 1 -> 3");
133 assertEquals(8, Utility.setBit(8, 3), "1000 bit 3 is 1 hence no change");
134 assertEquals(9, Utility.setBit(1, 3), "0001 bit 3 set to 1 -> 1001");
135 assertEquals(-1, Utility.setBit(-2, 0), "111...10 set bit 0 to 1 -> 111..11");
136 assertEquals(Integer.MIN_VALUE, Utility.setBit(0, 31), "000...00 set bit 31 to 0 -> 100..00");
137 }
138
139 @Test
140 public void testSignatureToStringWithGenerics() throws Exception {
141
142 assertEquals("java.util.Map<X, java.util.List<Y>>", Utility.signatureToString("Ljava/util/Map<TX;Ljava/util/List<TY;>;>;"), "generic signature");
143 assertEquals("java.util.Set<? extends java.nio.file.OpenOption>", Utility.signatureToString("Ljava/util/Set<+Ljava/nio/file/OpenOption;>;"),
144 "generic signature");
145 assertEquals("java.nio.file.attribute.FileAttribute<?>[]", Utility.signatureToString("[Ljava/nio/file/attribute/FileAttribute<*>;"),
146 "generic signature");
147
148
149 assertEquals(
150 "boofcv.alg.tracker.tld.TldTracker<boofcv.struct.image.ImageGray<boofcv.struct.image.GrayU8>, boofcv.struct.image.GrayI<boofcv.struct.image.GrayU8>>",
151 Utility.signatureToString(
152 "Lboofcv/alg/tracker/tld/TldTracker<Lboofcv/struct/image/ImageGray<Lboofcv/struct/image/GrayU8;>;Lboofcv/struct/image/GrayI<Lboofcv/struct/image/GrayU8;>;>;"),
153 "generic signature");
154 assertEquals("java.util.Map<?, ?>", Utility.signatureToString("Ljava/util/Map<**>;"), "generic signature");
155 assertEquals("com.jme3.util.IntMap<T>.IntMapIterator", Utility.signatureToString("Lcom/jme3/util/IntMap<TT;>.IntMapIterator;"), "generic signature");
156
157
158 assertEquals("<T extends java.lang.Object>(com.google.common.io.ByteProcessor<T>, int)T",
159 Utility.signatureToString("<T:Ljava/lang/Object;>(Lcom/google/common/io/ByteProcessor<TT;>;I)TT;", false), "type parameters signature");
160 assertEquals("<T extends Object>(com.google.common.io.ByteProcessor<T>, int)T",
161 Utility.signatureToString("<T:Ljava/lang/Object;>(Lcom/google/common/io/ByteProcessor<TT;>;I)TT;", true), "type parameters signature");
162 assertEquals("<M extends java.lang.reflect.AccessibleObject & java.lang.reflect.Member>(M)void",
163 Utility.signatureToString("<M:Ljava/lang/reflect/AccessibleObject;:Ljava/lang/reflect/Member;>(TM;)V"), "type parameters signature");
164 assertEquals("<K1 extends K, V1 extends V>()com.google.common.cache.Weigher<K1, V1>",
165 Utility.signatureToString("<K1:TK;V1:TV;>()Lcom/google/common/cache/Weigher<TK1;TV1;>;"), "type parameters signature");
166 assertEquals("<K1 extends K, V1 extends V>(com.google.common.cache.Weigher<? super K1, ? super V1>)com.google.common.cache.CacheBuilder<K1, V1>",
167 Utility.signatureToString("<K1:TK;V1:TV;>(Lcom/google/common/cache/Weigher<-TK1;-TV1;>;)Lcom/google/common/cache/CacheBuilder<TK1;TV1;>;"),
168 "type parameters signature");
169 assertEquals("<N extends java.lang.Object, E extends java.lang.Object> extends java.lang.Object implements com.google.common.graph.Network<N, E>",
170 Utility.signatureToString("<N:Ljava/lang/Object;E:Ljava/lang/Object;>Ljava/lang/Object;Lcom/google/common/graph/Network<TN;TE;>;", false),
171 "class signature");
172 assertEquals("<K extends Object, V extends Object> extends Object",
173 Utility.signatureToString("<K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;"), "class signature");
174 }
175 }