| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.eclipse.adt.internal.editors.layout; |
| |
| import com.android.SdkConstants; |
| import com.android.ide.eclipse.adt.internal.editors.mock.MockXmlNode; |
| |
| import org.w3c.dom.Node; |
| |
| import java.util.HashSet; |
| |
| import junit.framework.TestCase; |
| |
| public class ExplodeRenderingHelperTest extends TestCase { |
| |
| private final HashSet<String> mLayoutNames = new HashSet<String>(); |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| |
| mLayoutNames.add("LinearLayout"); |
| mLayoutNames.add("RelativeLayout"); |
| } |
| |
| public void testSingleHorizontalLinearLayout() { |
| // Single layout, horizontal, 2 buttons. |
| MockXmlNode layout = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton()} ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(1, helper.getHeightPadding()); |
| assertEquals(1, helper.getWidthPadding()); |
| } |
| |
| public void testSingleVerticalLinearLayout() { |
| // Single layout, horizontal, with 2 buttons. |
| // LinearLayout(H:[Button Button]) |
| MockXmlNode layout = createLinearLayout(false /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton()} ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(1, helper.getWidthPadding()); |
| assertEquals(1, helper.getHeightPadding()); |
| } |
| |
| public void testEmbeddedLinearLayouts() { |
| /* |
| * LinearLayout(vertical): |
| * LinearLayout(H:[Button Button]) |
| * LinearLayout(H:[Button Button Button]) |
| * |
| * Result should be 2 in x, 3 in y |
| */ |
| MockXmlNode layout = createLinearLayout(false /*horizontal*/, |
| new MockXmlNode[] { |
| createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton()}), |
| createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton(), createButton()}), |
| } ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(2, helper.getWidthPadding()); |
| assertEquals(3, helper.getHeightPadding()); |
| } |
| |
| public void testSimpleRelativeLayoutWithOneLinearLayouts() { |
| /* |
| * RelativeLayout: |
| * LinearLayout(H:[Button Button]) |
| * |
| * Result should be 2 in x, 2 in y |
| */ |
| MockXmlNode layout = createRelativeLayout( |
| new MockXmlNode[] { |
| createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton()}), |
| } ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(2, helper.getWidthPadding()); |
| assertEquals(2, helper.getHeightPadding()); |
| } |
| |
| public void /*test*/RelativeLayoutWithVerticalLinearLayouts() { |
| //FIXME: Reenable once the relative layout are properly supported. |
| /* |
| * Children of the relative layouts, one below the other. |
| * Each with only buttons in them. |
| * RelativeLayout: |
| * LinearLayout(H:[Button Button]) |
| * ^ |
| * LinearLayout(H:[Button Button]) |
| * |
| * Result should be 2 in x, 3 in y |
| */ |
| |
| // create the linearlayouts. |
| MockXmlNode linear1 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton()}); |
| linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1"); |
| |
| MockXmlNode linear2 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton()}); |
| linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2"); |
| |
| // position linear2 below linear1 |
| linear2.addAttributes(SdkConstants.NS_RESOURCES, "layout_below", "@+id/linear1"); |
| |
| |
| MockXmlNode layout = createRelativeLayout(new MockXmlNode[] { linear1, linear2 } ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(2, helper.getWidthPadding()); |
| assertEquals(3, helper.getHeightPadding()); |
| } |
| |
| public void /*test*/RelativeLayoutWithVerticalLinearLayouts2() { |
| //FIXME: Reenable once the relative layout are properly supported. |
| /* |
| * Children of the relative layouts, one above the other. |
| * Each with only buttons in them. |
| * RelativeLayout: |
| * LinearLayout(H:[Button Button]) |
| * v |
| * LinearLayout(H:[Button Button]) |
| * |
| * Result should be 2 in x, 3 in y |
| */ |
| |
| // create the linearlayouts. |
| MockXmlNode linear1 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton() } ); |
| linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1"); |
| |
| MockXmlNode linear2 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton(), createButton() } ); |
| linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2"); |
| |
| // position linear2 below linear1 |
| linear2.addAttributes(SdkConstants.NS_RESOURCES, "layout_above", "@+id/linear1"); |
| |
| |
| MockXmlNode layout = createRelativeLayout(new MockXmlNode[] { linear1, linear2 } ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(2, helper.getWidthPadding()); |
| assertEquals(3, helper.getHeightPadding()); |
| } |
| |
| public void /*test*/ComplexRelativeLayout() { |
| //FIXME: Reenable once the relative layout are properly supported. |
| /* |
| * RelativeLayout: |
| * |
| * < LinearLayout1(V: [button]) > LinearLayout2(V: [button]) |
| * v |
| * Button1 > LinearLayout3(V: [button]) < Button2 |
| * v |
| * < LinearLayout4(V: [button]) |
| * ^ |
| * <LinearLayout5(V: [button]) |
| * |
| * Result should be 4 in x, 5 in y |
| */ |
| |
| // create the elements |
| MockXmlNode button1 = createButton(); |
| button1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/button1"); |
| |
| MockXmlNode button2 = createButton(); |
| button2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/button2"); |
| |
| MockXmlNode linear1 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton() } ); |
| linear1.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear1"); |
| |
| MockXmlNode linear2 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton() } ); |
| linear2.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear2"); |
| |
| MockXmlNode linear3 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton() } ); |
| linear3.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear3"); |
| |
| MockXmlNode linear4 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton() } ); |
| linear4.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear4"); |
| |
| MockXmlNode linear5 = createLinearLayout(true /*horizontal*/, |
| new MockXmlNode[] { createButton() } ); |
| linear5.addAttributes(SdkConstants.NS_RESOURCES, "id", "@+id/linear5"); |
| |
| |
| // link them |
| button1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toLeftOf", "@+id/linear3"); |
| |
| button2.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear3"); |
| |
| linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear3"); |
| linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_toLeftOf", "@+id/linear2"); |
| linear1.addAttributes(SdkConstants.NS_RESOURCES, "layout_above", "@+id/button2"); |
| |
| linear3.addAttributes(SdkConstants.NS_RESOURCES, "layout_above", "@+id/linear4"); |
| |
| linear4.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/button1"); |
| |
| linear5.addAttributes(SdkConstants.NS_RESOURCES, "layout_toRightOf", "@+id/linear4"); |
| linear5.addAttributes(SdkConstants.NS_RESOURCES, "layout_below", "@+id/linear4"); |
| |
| MockXmlNode layout = createRelativeLayout( |
| new MockXmlNode[] { |
| button1, button2, linear1, linear2, linear3, linear4, linear5 } ); |
| |
| ExplodedRenderingHelper helper = new ExplodedRenderingHelper(layout, mLayoutNames); |
| assertEquals(4, helper.getWidthPadding()); |
| assertEquals(5, helper.getHeightPadding()); |
| } |
| |
| |
| // ----- helper to deal with mocks |
| |
| private MockXmlNode createButton() { |
| return new MockXmlNode(null, "Button", Node.ELEMENT_NODE, null); |
| } |
| |
| private MockXmlNode createLinearLayout(boolean horizontal, MockXmlNode[] children) { |
| MockXmlNode layout = new MockXmlNode(null, "LinearLayout", Node.ELEMENT_NODE, children); |
| |
| layout.addAttributes(SdkConstants.NS_RESOURCES, "orientation", |
| horizontal ? "horizontal" : "vertical"); |
| |
| return layout; |
| } |
| |
| private MockXmlNode createRelativeLayout(MockXmlNode[] children) { |
| MockXmlNode layout = new MockXmlNode(null, "RelativeLayout", Node.ELEMENT_NODE, children); |
| |
| return layout; |
| } |
| } |