19896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet/*
29896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * Copyright (C) 2010 The Android Open Source Project
39896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet *
49896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * Licensed under the Eclipse Public License, Version 1.0 (the "License");
59896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * you may not use this file except in compliance with the License.
69896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * You may obtain a copy of the License at
79896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet *
89896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet *      http://www.eclipse.org/org/documents/epl-v10.php
99896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet *
109896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * Unless required by applicable law or agreed to in writing, software
119896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
129896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * See the License for the specific language governing permissions and
149896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet * limitations under the License.
159896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet */
169896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
179896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohetpackage com.android.ide.eclipse.adt.internal.editors.layout;
189896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1981cefe2a26dd6db8a878e30874d12cdcbff0e83bXavier Ducrohetimport com.android.SdkConstants;
209896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohetimport com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode;
219896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
229896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohetimport org.w3c.dom.Node;
239896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
241f78628aea2386dc02c4522f06702e4168b1a966Xavier Ducrohetimport java.util.HashSet;
259896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
269896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohetimport junit.framework.TestCase;
279896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
289896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohetpublic class ExplodeRenderingHelperTest extends TestCase {
299896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
301f78628aea2386dc02c4522f06702e4168b1a966Xavier Ducrohet    private final HashSet<String> mLayoutNames = new HashSet<String>();
319896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
329896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    @Override
339896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    protected void setUp() throws Exception {
349896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        super.setUp();
359896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
369896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        mLayoutNames.add("LinearLayout");
379896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        mLayoutNames.add("RelativeLayout");
389896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
399896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
409896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void testSingleHorizontalLinearLayout() {
419896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // Single layout, horizontal, 2 buttons.
429896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createLinearLayout(true /*horizontal*/,
439896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton(), createButton()} );
449896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
459896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
469896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(1, helper.getHeightPadding());
479896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(1, helper.getWidthPadding());
489896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
499896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
509896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void testSingleVerticalLinearLayout() {
519896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // Single layout, horizontal, with 2 buttons.
529896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // LinearLayout(H:[Button Button])
539896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createLinearLayout(false /*horizontal*/,
549896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton(), createButton()} );
559896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
569896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
579896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(1, helper.getWidthPadding());
589896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(1, helper.getHeightPadding());
599896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
609896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
619896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void testEmbeddedLinearLayouts() {
629896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        /*
639896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *  LinearLayout(vertical):
649896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button])
659896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button Button])
669896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *
679896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Result should be 2 in x, 3 in y
689896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         */
699896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createLinearLayout(false /*horizontal*/,
709896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] {
719896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                    createLinearLayout(true /*horizontal*/,
729896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                            new MockXmlNode[] { createButton(), createButton()}),
739896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                    createLinearLayout(true /*horizontal*/,
749896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                            new MockXmlNode[] { createButton(), createButton(), createButton()}),
759896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                } );
769896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
779896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
789896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(2, helper.getWidthPadding());
799896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(3, helper.getHeightPadding());
809896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
819896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
829896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void testSimpleRelativeLayoutWithOneLinearLayouts() {
839896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        /*
849896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *  RelativeLayout:
859896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button])
869896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *
879896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Result should be 2 in x, 2 in y
889896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         */
899896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createRelativeLayout(
909896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] {
919896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                    createLinearLayout(true /*horizontal*/,
929896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                            new MockXmlNode[] { createButton(), createButton()}),
939896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                } );
949896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
959896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
969896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(2, helper.getWidthPadding());
979896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(2, helper.getHeightPadding());
989896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
999896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1009896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void /*test*/RelativeLayoutWithVerticalLinearLayouts() {
1019896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        //FIXME: Reenable once the relative layout are properly supported.
1029896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        /*
1039896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Children of the relative layouts, one below the other.
1049896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Each with only buttons in them.
1059896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *  RelativeLayout:
1069896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button])
1079896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *          ^
1089896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button])
1099896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *
1109896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Result should be 2 in x, 3 in y
1119896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         */
1129896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1139896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // create the linearlayouts.
1149896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear1 = createLinearLayout(true /*horizontal*/,
1159896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton(), createButton()});
1169896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1");
1179896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1189896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear2 = createLinearLayout(true /*horizontal*/,
1199896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                        new MockXmlNode[] { createButton(), createButton()});
1209896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2");
1219896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1229896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // position linear2 below linear1
1239896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear2.addAttributes(SdkConstants.NS_RESOURCES, "layout_below", "@+id/linear1");
1249896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1259896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1269896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createRelativeLayout(new MockXmlNode[] { linear1, linear2 } );
1279896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1289896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
1299896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(2, helper.getWidthPadding());
1309896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(3, helper.getHeightPadding());
1319896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
1329896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1339896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void /*test*/RelativeLayoutWithVerticalLinearLayouts2() {
1349896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        //FIXME: Reenable once the relative layout are properly supported.
1359896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        /*
1369896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Children of the relative layouts, one above the other.
1379896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Each with only buttons in them.
1389896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *  RelativeLayout:
1399896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button])
1409896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *          v
1419896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *    LinearLayout(H:[Button Button])
1429896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *
1439896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Result should be 2 in x, 3 in y
1449896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         */
1459896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1469896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // create the linearlayouts.
1479896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear1 = createLinearLayout(true /*horizontal*/,
1489896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton(), createButton() } );
1499896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1");
1509896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1519896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear2 = createLinearLayout(true /*horizontal*/,
1529896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                        new MockXmlNode[] { createButton(), createButton() } );
1539896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2");
1549896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1559896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // position linear2 below linear1
1569896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear2.addAttributes(SdkConstants.NS_RESOURCES, "layout_above", "@+id/linear1");
1579896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1589896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1599896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createRelativeLayout(new MockXmlNode[] { linear1, linear2 } );
1609896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1619896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
1629896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(2, helper.getWidthPadding());
1639896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(3, helper.getHeightPadding());
1649896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
1659896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1669896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    public void /*test*/ComplexRelativeLayout() {
1679896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        //FIXME: Reenable once the relative layout are properly supported.
1689896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        /*
1699896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *  RelativeLayout:
1709896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *
1719896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *                                       < LinearLayout1(V: [button]) > LinearLayout2(V: [button])
1729896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *                                            v
1739896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *  Button1 > LinearLayout3(V: [button]) < Button2
1749896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *                  v
1759896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *          < LinearLayout4(V: [button])
1769896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *                                     ^
1779896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *                                     <LinearLayout5(V: [button])
1789896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         *
1799896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         * Result should be 4 in x, 5 in y
1809896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet         */
1819896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1829896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // create the elements
1839896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode button1 = createButton();
1849896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        button1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/button1");
1859896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1869896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode button2 = createButton();
1879896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        button2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/button2");
1889896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1899896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear1 = createLinearLayout(true /*horizontal*/,
1909896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton() } );
1919896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1");
1929896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1939896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear2 = createLinearLayout(true /*horizontal*/,
1949896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton() } );
1959896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2");
1969896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
1979896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear3 = createLinearLayout(true /*horizontal*/,
1989896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton() } );
1999896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear3.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear3");
2009896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2019896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear4 = createLinearLayout(true /*horizontal*/,
2029896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton() } );
2039896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear4.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear4");
2049896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2059896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode linear5 = createLinearLayout(true /*horizontal*/,
2069896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] { createButton() } );
2079896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear5.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear5");
2089896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2099896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2109896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        // link them
2119896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        button1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toLeftOf",  "@+id/linear3");
2129896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2139896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        button2.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear3");
2149896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2159896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear3");
2169896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toLeftOf",  "@+id/linear2");
2179896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_above",     "@+id/button2");
2189896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2199896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear3.addAttributes(SdkConstants.NS_RESOURCES, "layout_above",     "@+id/linear4");
2209896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2219896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear4.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/button1");
2229896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2239896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear5.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear4");
2249896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        linear5.addAttributes(SdkConstants.NS_RESOURCES, "layout_below",     "@+id/linear4");
2259896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2269896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = createRelativeLayout(
2279896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                new MockXmlNode[] {
2289896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                        button1, button2, linear1, linear2, linear3, linear4, linear5 } );
2299896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2309896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames);
2319896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(4, helper.getWidthPadding());
2329896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        assertEquals(5, helper.getHeightPadding());
2339896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
2349896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2359896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2369896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    // ----- helper to deal with mocks
2379896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2389896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    private MockXmlNode createButton() {
2399896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        return new MockXmlNode(null, "Button", Node.ELEMENT_NODE, null);
2409896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
2419896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2429896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    private MockXmlNode createLinearLayout(boolean horizontal, MockXmlNode[] children) {
2439896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = new MockXmlNode(null, "LinearLayout", Node.ELEMENT_NODE, children);
2449896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2459896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        layout.addAttributes(SdkConstants.NS_RESOURCES, "orientation",
2469896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet                horizontal ? "horizontal" : "vertical");
2479896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2489896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        return layout;
2499896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
2509896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2519896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    private MockXmlNode createRelativeLayout(MockXmlNode[] children) {
2529896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        MockXmlNode layout = new MockXmlNode(null, "RelativeLayout", Node.ELEMENT_NODE, children);
2539896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet
2549896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet        return layout;
2559896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet    }
2569896debadf106c8d8ad0e626fbadd71f96fb338dXavier Ducrohet}
257