• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
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.ide.eclipse.adt.internal.editors.descriptors;
19 
20 import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
21 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
22 import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
23 
24 import junit.framework.TestCase;
25 
26 /**
27  * Unit tests for DescriptorsUtils in the editors plugin
28  */
29 @SuppressWarnings("javadoc")
30 public class DescriptorsUtilsTest extends TestCase {
31 
32     @Override
setUp()33     protected void setUp() throws Exception {
34         super.setUp();
35     }
36 
37     @Override
tearDown()38     protected void tearDown() throws Exception {
39         super.tearDown();
40     }
41 
testPrettyAttributeUiName()42     public void testPrettyAttributeUiName() {
43         assertEquals("", DescriptorsUtils.prettyAttributeUiName(""));
44 
45         assertEquals("Max width for view",
46                 DescriptorsUtils.prettyAttributeUiName("maxWidthForView"));
47 
48         assertEquals("Layout width",
49                 DescriptorsUtils.prettyAttributeUiName("layout_width"));
50 
51         // X Y and Z are capitalized when used as single words (so "T" becomes "t")
52         assertEquals("Axis X", DescriptorsUtils.prettyAttributeUiName("axisX"));
53         assertEquals("Axis Y", DescriptorsUtils.prettyAttributeUiName("axisY"));
54         assertEquals("Axis Z", DescriptorsUtils.prettyAttributeUiName("axisZ"));
55         assertEquals("Axis t", DescriptorsUtils.prettyAttributeUiName("axisT"));
56 
57         assertEquals("The X axis", DescriptorsUtils.prettyAttributeUiName("theXAxis"));
58         assertEquals("The Y axis", DescriptorsUtils.prettyAttributeUiName("theYAxis"));
59         assertEquals("The Z axis", DescriptorsUtils.prettyAttributeUiName("theZAxis"));
60         assertEquals("The t axis", DescriptorsUtils.prettyAttributeUiName("theTAxis"));
61 
62         // Special cases for "uri" and "sdk" etc
63         assertEquals("Grant URI permission",
64                 DescriptorsUtils.prettyAttributeUiName("grantUriPermission"));
65         assertEquals("URI permission",
66                 DescriptorsUtils.prettyAttributeUiName("uriPermission"));
67         assertEquals("Min SDK version", DescriptorsUtils.prettyAttributeUiName("minSdkVersion"));
68         assertEquals("SDK version", DescriptorsUtils.prettyAttributeUiName("sdkVersion"));
69         assertEquals("IME action method",
70                 DescriptorsUtils.prettyAttributeUiName("imeActionMethod"));
71     }
72 
testCapitalize()73     public void testCapitalize() {
74         assertEquals("", DescriptorsUtils.capitalize(""));
75 
76         assertEquals("Max Width For View",
77                 DescriptorsUtils.capitalize("maxWidthForView"));
78 
79         assertEquals("Layout Width",
80                 DescriptorsUtils.capitalize("layout_width"));
81 
82         assertEquals("Axis X", DescriptorsUtils.capitalize("axisX"));
83         assertEquals("Axis Y", DescriptorsUtils.capitalize("axisY"));
84         assertEquals("Axis Z", DescriptorsUtils.capitalize("axisZ"));
85         assertEquals("Axis T", DescriptorsUtils.capitalize("axisT"));
86 
87         assertEquals("The X Axis", DescriptorsUtils.capitalize("theXAxis"));
88         assertEquals("The Y Axis", DescriptorsUtils.capitalize("theYAxis"));
89         assertEquals("The Z Axis", DescriptorsUtils.capitalize("theZAxis"));
90         assertEquals("The T Axis", DescriptorsUtils.capitalize("theTAxis"));
91 
92         // Special cases for "uri" and "sdk" etc
93         assertEquals("Grant URI Permission", DescriptorsUtils.capitalize("grantUriPermission"));
94         assertEquals("Min SDK Version", DescriptorsUtils.capitalize("minSdkVersion"));
95         assertEquals("IME Action Method", DescriptorsUtils.capitalize("imeActionMethod"));
96         assertEquals("URI Permission", DescriptorsUtils.capitalize("uriPermission"));
97         assertEquals("SDK Version", DescriptorsUtils.capitalize("sdkVersion"));
98         assertEquals("Grant IME", DescriptorsUtils.capitalize("GrantIme"));
99     }
100 
testFormatTooltip()101     public void testFormatTooltip() {
102         assertEquals("", DescriptorsUtils.formatTooltip(""));
103 
104         assertEquals("\"application\"",
105                 DescriptorsUtils.formatTooltip(
106                         "<code>application</code>"));
107 
108         assertEquals("android.content.Intent",
109                 DescriptorsUtils.formatTooltip(
110                         "{@link android.content.Intent}"));
111 
112         assertEquals("FLAG_ACTIVITY_SINGLE_TOP",
113                 DescriptorsUtils.formatTooltip(
114                         "{@link android.content.Intent#FLAG_ACTIVITY_SINGLE_TOP}"));
115 
116         assertEquals("activity-alias",
117                 DescriptorsUtils.formatTooltip(
118                         "{@link \t  #AndroidManifestActivityAlias  \tactivity-alias }"));
119 
120         assertEquals("\"permission\"",
121                 DescriptorsUtils.formatTooltip(
122                         "{@link #AndroidManifestPermission &lt;permission&gt;}"));
123 
124         assertEquals("and etc.",
125                 DescriptorsUtils.formatTooltip(
126                         "{@link #IntentCategory <category> and etc. }"));
127 
128         assertEquals("Activity.onNewIntent()",
129                 DescriptorsUtils.formatTooltip(
130                         "{@link android.app.Activity#onNewIntent Activity.onNewIntent()}"));
131     }
132 
testFormatFormText()133     public void testFormatFormText() {
134         ElementDescriptor desc = new ElementDescriptor("application");
135         desc.setSdkUrl(DescriptorsUtils.MANIFEST_SDK_URL + "TagApplication");
136         String docBaseUrl = "http://base";
137         assertEquals("<form><li style=\"image\" value=\"image\"></li></form>", DescriptorsUtils.formatFormText("", desc, docBaseUrl));
138 
139         assertEquals("<form><li style=\"image\" value=\"image\"><a href=\"http://base/reference/android/R.styleable.html#TagApplication\">application</a></li></form>",
140                 DescriptorsUtils.formatFormText(
141                         "<code>application</code>",
142                         desc, docBaseUrl));
143 
144         assertEquals("<form><li style=\"image\" value=\"image\"><b>android.content.Intent</b></li></form>",
145                 DescriptorsUtils.formatFormText(
146                         "{@link android.content.Intent}",
147                         desc, docBaseUrl));
148 
149         assertEquals("<form><li style=\"image\" value=\"image\"><a href=\"http://base/reference/android/R.styleable.html#AndroidManifestPermission\">AndroidManifestPermission</a></li></form>",
150                 DescriptorsUtils.formatFormText(
151                         "{@link #AndroidManifestPermission}",
152                         desc, docBaseUrl));
153 
154         assertEquals("<form><li style=\"image\" value=\"image\"><a href=\"http://base/reference/android/R.styleable.html#AndroidManifestPermission\">\"permission\"</a></li></form>",
155                 DescriptorsUtils.formatFormText(
156                         "{@link #AndroidManifestPermission &lt;permission&gt;}",
157                         desc, docBaseUrl));
158     }
159 
testGetFreeWidgetId()160     public void testGetFreeWidgetId() throws Exception {
161         DocumentDescriptor documentDescriptor =
162             new DocumentDescriptor("layout_doc", null); //$NON-NLS-1$
163         UiDocumentNode model = new UiDocumentNode(documentDescriptor);
164         UiElementNode uiRoot = model.getUiRoot();
165 
166         assertEquals("@+id/button1", DescriptorsUtils.getFreeWidgetId(uiRoot, "Button"));
167         assertEquals("@+id/linearLayout1",
168                 DescriptorsUtils.getFreeWidgetId(uiRoot, "LinearLayout"));
169     }
170 
testNeedsDefaultId()171     public void testNeedsDefaultId() throws Exception {
172         assertTrue(DescriptorsUtils.needsDefaultId(new ElementDescriptor("Button")));
173         assertTrue(DescriptorsUtils.needsDefaultId(new ElementDescriptor("EditText")));
174         assertTrue(DescriptorsUtils.needsDefaultId(new ElementDescriptor("TextView")));
175 
176         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("LinearLayout")));
177         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("GridLayout")));
178         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("RelativeLayout")));
179         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("include")));
180         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("merge")));
181         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("fragment")));
182         assertFalse(DescriptorsUtils.needsDefaultId(new ElementDescriptor("Space")));
183     }
184 
createDesc(String name, String fqn, boolean hasChildren)185     private static ViewElementDescriptor createDesc(String name, String fqn, boolean hasChildren) {
186         if (hasChildren) {
187             return new ViewElementDescriptor(name, name, fqn, "", "", new AttributeDescriptor[0],
188                     new AttributeDescriptor[0], new ElementDescriptor[1], false);
189         } else {
190             return new ViewElementDescriptor(name, fqn);
191         }
192     }
193 
testCanInsertChildren()194     public void testCanInsertChildren() throws Exception {
195         assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:Button",
196                 "android.widget.Button", false), null));
197         assertTrue(DescriptorsUtils.canInsertChildren(createDesc("android:LinearLayout",
198                 "android.view.LinearLayout", true), null));
199         assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:ListView",
200                 "android.widget.ListView", true), null));
201         assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:ExpandableListView",
202                 "android.widget.ExpandableListView", true), null));
203         assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:Gallery",
204                 "android.widget.Gallery", true), null));
205         assertFalse(DescriptorsUtils.canInsertChildren(createDesc("android:GridView",
206                 "android.widget.GridView", true), null));
207 
208         // This isn't the Android one (missing android: namespace prefix):
209         // This test is disabled since I had to remove the namespace enforcement
210         // (see namespace-related comment in canInsertChildren)
211         //assertTrue(DescriptorsUtils.canInsertChildren(createDesc("mynamespace:ListView",
212         //        "android.widget.ListView", true), null));
213 
214         // Custom view without known view object
215         assertTrue(DescriptorsUtils.canInsertChildren(createDesc("MyView",
216                 "foo.bar.MyView", true), null));
217 
218         // Custom view with known view object that extends AdapterView
219         Object view = new MyClassLoader().findClass("foo.bar.MyView").newInstance();
220         assertFalse(DescriptorsUtils.canInsertChildren(createDesc("MyView",
221                 "foo.bar.MyView", true), view));
222     }
223 
224     /** Test class loader which finds foo.bar.MyView extends android.widget.AdapterView */
225     private static class MyClassLoader extends ClassLoader {
MyClassLoader()226         public MyClassLoader() {
227             super(null);
228         }
229 
230         @Override
findClass(String name)231         protected Class<?> findClass(String name) throws ClassNotFoundException {
232             if (name.equals("foo.bar.MyView")) {
233                 // Simple class stub compiled by javac and dumped as bytes:
234                 //package foo.bar;
235                 //public class MyView extends android.widget.AdapterView {
236                 //    public MyView() {
237                 //        super(null);
238                 //    }
239                 //}
240                 byte[] classData = new byte[] {
241                         -54,-2,-70,-66,0,0,0,49,0,17,10,0,3,0,13,7,0,14,7,0,15,1,0,6,60,105,110,
242                         105,116,62,1,0,3,40,41,86,1,0,4,67,111,100,101,1,0,15,76,105,110,101,78,
243                         117,109,98,101,114,84,97,98,108,101,1,0,18,76,111,99,97,108,86,97,114,
244                         105,97,98,108,101,84,97,98,108,101,1,0,4,116,104,105,115,1,0,16,76,102,
245                         111,111,47,98,97,114,47,77,121,86,105,101,119,59,1,0,10,83,111,117,114,
246                         99,101,70,105,108,101,1,0,11,77,121,86,105,101,119,46,106,97,118,97,12,
247                         0,4,0,16,1,0,14,102,111,111,47,98,97,114,47,77,121,86,105,101,119,1,0,
248                         26,97,110,100,114,111,105,100,47,119,105,100,103,101,116,47,65,100,97,
249                         112,116,101,114,86,105,101,119,1,0,28,40,76,97,110,100,114,111,105,100,
250                         47,99,111,110,116,101,110,116,47,67,111,110,116,101,120,116,59,41,86,0,
251                         33,0,2,0,3,0,0,0,0,0,1,0,1,0,4,0,5,0,1,0,6,0,0,0,52,0,2,0,1,0,0,0,6,42,
252                         1,-73,0,1,-79,0,0,0,2,0,7,0,0,0,10,0,2,0,0,0,9,0,5,0,10,0,8,0,0,0,12,0,
253                         1,0,0,0,6,0,9,0,10,0,0,0,1,0,11,0,0,0,2,0,12
254                 };
255                 return defineClass("foo.bar.MyView", classData, 0, classData.length);
256             }
257             if (name.equals("android.widget.AdapterView")) {
258                 // Simple class stub compiled by javac and dumped as bytes:
259                 //package android.widget;
260                 //public class AdapterView {
261                 //    public AdapterView(android.content.Context context) { }
262                 //}
263                 byte[] classData = new byte[] {
264                         -54,-2,-70,-66,0,0,0,49,0,19,10,0,3,0,15,7,0,16,7,0,17,1,0,6,60,105,110,
265                         105,116,62,1,0,28,40,76,97,110,100,114,111,105,100,47,99,111,110,116,101,
266                         110,116,47,67,111,110,116,101,120,116,59,41,86,1,0,4,67,111,100,101,1,0,
267                         15,76,105,110,101,78,117,109,98,101,114,84,97,98,108,101,1,0,18,76,111,
268                         99,97,108,86,97,114,105,97,98,108,101,84,97,98,108,101,1,0,4,116,104,105,
269                         115,1,0,28,76,97,110,100,114,111,105,100,47,119,105,100,103,101,116,47,
270                         65,100,97,112,116,101,114,86,105,101,119,59,1,0,7,99,111,110,116,101,120,
271                         116,1,0,25,76,97,110,100,114,111,105,100,47,99,111,110,116,101,110,116,
272                         47,67,111,110,116,101,120,116,59,1,0,10,83,111,117,114,99,101,70,105,108,
273                         101,1,0,16,65,100,97,112,116,101,114,86,105,101,119,46,106,97,118,97,12,
274                         0,4,0,18,1,0,26,97,110,100,114,111,105,100,47,119,105,100,103,101,116,
275                         47,65,100,97,112,116,101,114,86,105,101,119,1,0,16,106,97,118,97,47,108,
276                         97,110,103,47,79,98,106,101,99,116,1,0,3,40,41,86,0,33,0,2,0,3,0,0,0,0,0,
277                         1,0,1,0,4,0,5,0,1,0,6,0,0,0,57,0,1,0,2,0,0,0,5,42,-73,0,1,-79,0,0,0,2,0,
278                         7,0,0,0,6,0,1,0,0,0,8,0,8,0,0,0,22,0,2,0,0,0,5,0,9,0,10,0,0,0,0,0,5,0,11,
279                         0,12,0,1,0,1,0,13,0,0,0,2,0,14
280                 };
281                 return defineClass("android.widget.AdapterView", classData, 0, classData.length);
282             }
283 
284             return super.findClass(name);
285         }
286     }
287 
testGetBasename()288     public void testGetBasename() {
289         assertEquals("Foo", DescriptorsUtils.getBasename("Foo"));
290         assertEquals("Foo", DescriptorsUtils.getBasename("foo.Foo"));
291         assertEquals("String", DescriptorsUtils.getBasename("java.util.String"));
292     }
293 }
294