1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 package com.android.tools.layoutlib.create;
19 
20 import static org.junit.Assert.*;
21 
22 import org.junit.After;
23 import org.junit.Before;
24 import org.junit.Test;
25 
26 /**
27  *
28  */
29 public class RenameClassAdapterTest {
30 
31     private RenameClassAdapter mOuter;
32     private RenameClassAdapter mInner;
33 
34     @Before
setUp()35     public void setUp() throws Exception {
36         mOuter = new RenameClassAdapter(null, // cv
37                                          "com.pack.Old",
38                                          "org.blah.New");
39 
40         mInner = new RenameClassAdapter(null, // cv
41                                          "com.pack.Old$Inner",
42                                          "org.blah.New$Inner");
43     }
44 
45     @After
tearDown()46     public void tearDown() throws Exception {
47     }
48 
49     /**
50      * Renames a type, e.g. "Lcom.package.My;"
51      * If the type doesn't need to be renamed, returns the input string as-is.
52      */
53     @Test
testRenameTypeDesc()54     public void testRenameTypeDesc() {
55 
56         // primitive types are left untouched
57         assertEquals("I", mOuter.renameTypeDesc("I"));
58         assertEquals("D", mOuter.renameTypeDesc("D"));
59         assertEquals("V", mOuter.renameTypeDesc("V"));
60 
61         // object types that need no renaming are left untouched
62         assertEquals("Lcom.package.MyClass;", mOuter.renameTypeDesc("Lcom.package.MyClass;"));
63         assertEquals("Lcom.package.MyClass;", mInner.renameTypeDesc("Lcom.package.MyClass;"));
64 
65         // object types that match the requirements
66         assertEquals("Lorg.blah.New;", mOuter.renameTypeDesc("Lcom.pack.Old;"));
67         assertEquals("Lorg.blah.New$Inner;", mInner.renameTypeDesc("Lcom.pack.Old$Inner;"));
68         // inner classes match the base type which is being renamed
69         assertEquals("Lorg.blah.New$Other;", mOuter.renameTypeDesc("Lcom.pack.Old$Other;"));
70         assertEquals("Lorg.blah.New$Other;", mInner.renameTypeDesc("Lcom.pack.Old$Other;"));
71 
72         // arrays
73         assertEquals("[Lorg.blah.New;",  mOuter.renameTypeDesc("[Lcom.pack.Old;"));
74         assertEquals("[[Lorg.blah.New;", mOuter.renameTypeDesc("[[Lcom.pack.Old;"));
75 
76         assertEquals("[Lorg.blah.New;",  mInner.renameTypeDesc("[Lcom.pack.Old;"));
77         assertEquals("[[Lorg.blah.New;", mInner.renameTypeDesc("[[Lcom.pack.Old;"));
78     }
79 
80     /**
81      * Renames an object type, e.g. "Lcom.package.MyClass;" or an array type that has an
82      * object element, e.g. "[Lcom.package.MyClass;"
83      * If the type doesn't need to be renamed, returns the internal name of the input type.
84      */
85     @Test
testRenameType()86     public void testRenameType() {
87         // Skip. This is actually tested by testRenameTypeDesc above.
88     }
89 
90     /**
91      * Renames an internal type name, e.g. "com.package.MyClass".
92      * If the type doesn't need to be renamed, returns the input string as-is.
93      */
94     @Test
testRenameInternalType()95     public void testRenameInternalType() {
96         // an actual FQCN
97         assertEquals("org.blah.New", mOuter.renameInternalType("com.pack.Old"));
98         assertEquals("org.blah.New$Inner", mOuter.renameInternalType("com.pack.Old$Inner"));
99 
100         assertEquals("org.blah.New$Other", mInner.renameInternalType("com.pack.Old$Other"));
101         assertEquals("org.blah.New$Other", mInner.renameInternalType("com.pack.Old$Other"));
102     }
103 
104     /**
105      * Renames a method descriptor, i.e. applies renameType to all arguments and to the
106      * return value.
107      */
108     @Test
testRenameMethodDesc()109     public void testRenameMethodDesc() {
110         assertEquals("(IDLorg.blah.New;[Lorg.blah.New$Inner;)Lorg.blah.New$Other;",
111                mOuter.renameMethodDesc("(IDLcom.pack.Old;[Lcom.pack.Old$Inner;)Lcom.pack.Old$Other;"));
112     }
113 
114 
115 
116 }
117