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