blob: 0e528674aeec4456e98f17fdc1324fac679cc506 [file] [log] [blame]
/*
* 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;
}
}