Home | History | Annotate | Download | only in gle2
      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