1 /* 2 * Copyright (C) 2010 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 package com.android.ide.eclipse.adt.internal.editors.layout.gle2; 18 19 import com.android.ide.common.api.Rect; 20 21 import java.util.Arrays; 22 23 import junit.framework.TestCase; 24 25 public class SimpleElementTest extends TestCase { 26 27 private SimpleElement e; 28 29 /** 30 * Helper method to compare arrays' *content* is equal (instead of object identity). 31 * Also produces a suitable output to understand mismatch, if any. 32 * <p/> 33 * Pre-requisite: The arrays' elements must properly implement {@link Object#equals(Object)} 34 * and a sensible {@link Object#toString()}. 35 */ 36 private static void assertArrayEquals(Object[] expected, Object[] actual) { 37 if (!Arrays.equals(expected, actual)) { 38 // In case of failure, transform the arguments into strings and let 39 // assertEquals(string) handle it as it can produce a nice diff of the string. 40 String strExpected = expected == null ? "(null)" : Arrays.toString(expected); 41 String strActual = actual == null ? "(null)" : Arrays.toString(actual); 42 43 if (strExpected.equals(strActual)) { 44 fail(String.format("Array not equal:\n Expected[%d]=%s\n Actual[%d]=%s", 45 expected == null ? 0 : expected.length, 46 strExpected, 47 actual == null ? 0 : actual.length, 48 strActual)); 49 } else { 50 assertEquals(strExpected, strActual); 51 } 52 } 53 } 54 55 @Override 56 protected void setUp() throws Exception { 57 super.setUp(); 58 59 e = new SimpleElement("android.view.LinearLayout", // fqcn 60 "android.view.FrameLayout", // parentFqcn 61 new Rect(10, 5, 60, 40), // bounds 62 new Rect(0, 0, 320, 480)); // parentBounds 63 } 64 65 public final void testGetFqcn() { 66 assertEquals("android.view.LinearLayout", e.getFqcn()); 67 } 68 69 public final void testGetParentFqcn() { 70 assertEquals("android.view.FrameLayout", e.getParentFqcn()); 71 } 72 73 public final void testGetBounds() { 74 assertEquals(new Rect(10, 5, 60, 40), e.getBounds()); 75 } 76 77 public final void testGetParentBounds() { 78 assertEquals(new Rect(0, 0, 320, 480), e.getParentBounds()); 79 } 80 81 public final void testToString() { 82 assertEquals("{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 83 "}\n", 84 e.toString()); 85 86 e.addAttribute(new SimpleAttribute("uri", "name", "value")); 87 e.addAttribute(new SimpleAttribute("my-uri", "second-name", "my = value ")); 88 89 assertEquals("{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 90 "@name:uri=value\n" + 91 "@second-name:my-uri=my = value \n" + 92 "}\n", 93 e.toString()); 94 95 SimpleElement e2 = new SimpleElement("android.view.Button", 96 "android.view.LinearLayout", 97 new Rect(10, 20, 30, 40), 98 new Rect(0, 0, 320, 480)); 99 e2.addAttribute(new SimpleAttribute("uri1", "name1", "value1")); 100 SimpleElement e3 = new SimpleElement("android.view.CheckBox", 101 "android.view.LinearLayout", 102 new Rect(-1, -2, -3, -4), // invalid rect is ignored 103 new Rect(-1, -2, -3, -4)); // invalid rectis ignored 104 e3.addAttribute(new SimpleAttribute("uri2", "name2", "value2")); 105 e3.addAttribute(new SimpleAttribute("uri3", "name3", "value3")); 106 e.addInnerElement(e2); 107 e.addInnerElement(e3); 108 109 assertEquals("{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 110 "@name:uri=value\n" + 111 "@second-name:my-uri=my = value \n" + 112 "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" + 113 "@name1:uri1=value1\n" + 114 "}\n" + 115 "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout\n" + 116 "@name2:uri2=value2\n" + 117 "@name3:uri3=value3\n" + 118 "}\n" + 119 "}\n", 120 e.toString()); 121 } 122 123 public final void testParseString() { 124 assertArrayEquals( 125 new SimpleElement[] { new SimpleElement("android.view.LinearLayout", 126 null, null, null) }, 127 SimpleElement.parseString( 128 "{V=3,N=android.view.LinearLayout\n" + 129 "}\n")); 130 131 assertArrayEquals( 132 new SimpleElement[] { new SimpleElement("android.view.LinearLayout", 133 "android.view.FrameLayout", 134 null, null) }, 135 SimpleElement.parseString( 136 "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout\n" + 137 "}\n")); 138 139 assertArrayEquals( 140 new SimpleElement[] { new SimpleElement("android.view.LinearLayout", 141 null, 142 new Rect(10, 5, 60, 40), 143 new Rect(0, 0, 320, 480)) }, 144 SimpleElement.parseString( 145 "{V=3,N=android.view.LinearLayout,R=10 5 60 40,Q=0 0 320 480\n" + 146 "}\n")); 147 148 149 assertArrayEquals( 150 new SimpleElement[] { e }, 151 SimpleElement.parseString( 152 "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 153 "}\n")); 154 155 156 e.addAttribute(new SimpleAttribute("uri", "name", "value")); 157 e.addAttribute(new SimpleAttribute("my-uri", "second-name", "my = value ")); 158 159 assertArrayEquals( 160 new SimpleElement[] { e }, 161 SimpleElement.parseString( 162 "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 163 "@name:uri=value\n" + 164 "@second-name:my-uri=my = value \n" + 165 "}\n")); 166 167 168 SimpleElement e2 = new SimpleElement("android.view.Button", 169 "android.view.LinearLayout", 170 new Rect(10, 20, 30, 40), 171 new Rect(0, 0, 320, 480)); 172 e2.addAttribute(new SimpleAttribute("uri1", "name1", "value1")); 173 SimpleElement e3 = new SimpleElement("android.view.CheckBox", 174 "android.view.LinearLayout", 175 new Rect(-1, -2, -3, -4), 176 new Rect(-1, -2, -3, -4)); 177 e3.addAttribute(new SimpleAttribute("uri2", "name2", "value2")); 178 e3.addAttribute(new SimpleAttribute("uri3", "name3", "value3")); 179 e.addInnerElement(e2); 180 e.addInnerElement(e3); 181 182 assertArrayEquals( 183 new SimpleElement[] { e }, 184 SimpleElement.parseString( 185 "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 186 "@name:uri=value\n" + 187 "@second-name:my-uri=my = value \n" + 188 "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" + 189 "@name1:uri1=value1\n" + 190 "}\n" + 191 "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout,R=-1 -2 -3 -4,Q=-1 -2 -3 -4\n" + 192 "@name2:uri2=value2\n" + 193 "@name3:uri3=value3\n" + 194 "}\n" + 195 "}\n")); 196 197 // Parse string can also parse an array of elements 198 assertArrayEquals( 199 new SimpleElement[] { e, e2, e3 }, 200 SimpleElement.parseString( 201 "{V=3,N=android.view.LinearLayout,P=android.view.FrameLayout,R=10 5 60 40,Q=0 0 320 480\n" + 202 "@name:uri=value\n" + 203 "@second-name:my-uri=my = value \n" + 204 "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" + 205 "@name1:uri1=value1\n" + 206 "}\n" + 207 "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout,R=-1 -2 -3 -4\n" + 208 "@name2:uri2=value2\n" + 209 "@name3:uri3=value3\n" + 210 "}\n" + 211 "}\n" + 212 "{V=3,N=android.view.Button,P=android.view.LinearLayout,R=10 20 30 40,Q=0 0 320 480\n" + 213 "@name1:uri1=value1\n" + 214 "}\n" + 215 "{V=3,N=android.view.CheckBox,P=android.view.LinearLayout,R=-1 -2 -3 -4,Q=-1 -2 -3 -4\n" + 216 "@name2:uri2=value2\n" + 217 "@name3:uri3=value3\n" + 218 "}\n")); 219 220 } 221 222 public final void testAddGetAttribute() { 223 assertNotNull(e.getAttributes()); 224 assertArrayEquals( 225 new SimpleAttribute[] {}, 226 e.getAttributes()); 227 228 e.addAttribute(new SimpleAttribute("uri", "name", "value")); 229 assertArrayEquals( 230 new SimpleAttribute[] { new SimpleAttribute("uri", "name", "value") }, 231 e.getAttributes()); 232 233 e.addAttribute(new SimpleAttribute("my-uri", "second-name", "value")); 234 assertArrayEquals( 235 new SimpleAttribute[] { new SimpleAttribute("uri", "name", "value"), 236 new SimpleAttribute("my-uri", "second-name", "value") }, 237 e.getAttributes()); 238 239 assertNull(e.getAttribute("unknown uri", "name")); 240 assertNull(e.getAttribute("uri", "unknown name")); 241 assertEquals(new SimpleAttribute("uri", "name", "value"), 242 e.getAttribute("uri", "name")); 243 assertEquals(new SimpleAttribute("my-uri", "second-name", "value"), 244 e.getAttribute("my-uri", "second-name")); 245 } 246 247 public final void testAddGetInnerElements() { 248 assertNotNull(e.getInnerElements()); 249 assertArrayEquals( 250 new SimpleElement[] {}, 251 e.getInnerElements()); 252 253 e.addInnerElement(new SimpleElement("android.view.Button", null, null, null)); 254 assertArrayEquals( 255 new SimpleElement[] { new SimpleElement("android.view.Button", null, null, null) }, 256 e.getInnerElements()); 257 258 e.addInnerElement(new SimpleElement("android.view.CheckBox", null, null, null)); 259 assertArrayEquals( 260 new SimpleElement[] { new SimpleElement("android.view.Button", null, null, null), 261 new SimpleElement("android.view.CheckBox", null, null, null) }, 262 e.getInnerElements()); 263 } 264 265 public final void testEqualsObject() { 266 assertFalse(e.equals(null)); 267 assertFalse(e.equals(new Object())); 268 269 assertNotSame(new SimpleElement("android.view.LinearLayout", 270 "android.view.FrameLayout", 271 new Rect(10, 5, 60, 40), 272 new Rect(0, 0, 320, 480)), 273 e); 274 assertEquals(new SimpleElement("android.view.LinearLayout", 275 "android.view.FrameLayout", 276 new Rect(10, 5, 60, 40), 277 new Rect(0, 0, 320, 480)), 278 e); 279 assertTrue(e.equals(new SimpleElement("android.view.LinearLayout", 280 "android.view.FrameLayout", 281 new Rect(10, 5, 60, 40), 282 new Rect(0, 0, 320, 480)))); 283 284 // not the same FQCN 285 assertFalse(e.equals(new SimpleElement("android.view.Button", 286 "android.view.FrameLayout", 287 new Rect(10, 5, 60, 40), 288 new Rect(0, 0, 320, 480)))); 289 290 // not the same parent 291 assertFalse(e.equals(new SimpleElement("android.view.LinearLayout", 292 "android.view.LinearLayout", 293 new Rect(10, 5, 60, 40), 294 new Rect(0, 0, 320, 480)))); 295 296 // not the same bounds 297 assertFalse(e.equals(new SimpleElement("android.view.LinearLayout", 298 "android.view.FrameLayout", 299 new Rect(10, 25, 30, 40), 300 new Rect(0, 0, 320, 480)))); 301 302 // not the same parent bounds 303 assertFalse(e.equals(new SimpleElement("android.view.LinearLayout", 304 "android.view.FrameLayout", 305 new Rect(10, 5, 60, 40), 306 new Rect(10, 100, 160, 240)))); 307 } 308 309 public final void testHashCode() { 310 int he = e.hashCode(); 311 312 assertEquals(he, new SimpleElement("android.view.LinearLayout", 313 "android.view.FrameLayout", 314 new Rect(10, 5, 60, 40), 315 new Rect(0, 0, 320, 480)).hashCode()); 316 317 318 // not the same FQCN 319 assertFalse(he == new SimpleElement("android.view.Button", 320 "android.view.FrameLayout", 321 new Rect(10, 5, 60, 40), 322 new Rect(0, 0, 320, 480)).hashCode()); 323 324 // not the same parent 325 assertFalse(he == new SimpleElement("android.view.LinearLayout", 326 "android.view.Button", 327 new Rect(10, 5, 60, 40), 328 new Rect(0, 0, 320, 480)).hashCode()); 329 330 // not the same bounds 331 assertFalse(he == new SimpleElement("android.view.LinearLayout", 332 "android.view.FrameLayout", 333 new Rect(10, 25, 30, 40), 334 new Rect(0, 0, 320, 480)).hashCode()); 335 336 // not the same parent bounds 337 assertFalse(he == new SimpleElement("android.view.LinearLayout", 338 "android.view.FrameLayout", 339 new Rect(10, 25, 30, 40), 340 new Rect(10, 100, 160, 240)).hashCode()); 341 } 342 343 } 344