/*
* Copyright (C) 2011 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.common.layout.grid;
import static com.android.SdkConstants.ANDROID_URI;
import static com.android.SdkConstants.ATTR_COLUMN_COUNT;
import static com.android.SdkConstants.ATTR_LAYOUT_COLUMN;
import static com.android.SdkConstants.ATTR_LAYOUT_COLUMN_SPAN;
import static com.android.SdkConstants.ATTR_LAYOUT_ROW;
import static com.android.SdkConstants.FQCN_BUTTON;
import com.android.ide.common.api.INode;
import com.android.ide.common.api.Rect;
import com.android.ide.common.layout.LayoutTestBase;
import com.android.ide.common.layout.TestNode;
import com.android.ide.common.layout.grid.GridModel.ViewData;
import java.util.Arrays;
import java.util.Collections;
@SuppressWarnings("javadoc")
public class GridModelTest extends LayoutTestBase {
public void testRemoveFlag() {
assertEquals("left", GridModel.removeFlag("top", "top|left"));
assertEquals("left", GridModel.removeFlag("top", "top | left"));
assertEquals("top", GridModel.removeFlag("left", "top|left"));
assertEquals("top", GridModel.removeFlag("left", "top | left"));
assertEquals("left | center", GridModel.removeFlag("top", "top | left | center"));
assertEquals(null, GridModel.removeFlag("top", "top"));
}
public void testReadModel1() {
TestNode targetNode = TestNode.create("android.widget.GridLayout").id("@+id/GridLayout1")
.bounds(new Rect(0, 0, 240, 480)).set(ANDROID_URI, ATTR_COLUMN_COUNT, "3");
GridModel model = GridModel.get(null, targetNode, null);
assertEquals(3, model.declaredColumnCount);
assertEquals(1, model.actualColumnCount);
assertEquals(1, model.actualRowCount);
targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button1"));
targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button2"));
targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button3"));
targetNode.add(TestNode.create(FQCN_BUTTON).id("@+id/Button4"));
model = GridModel.get(null, targetNode, null);
assertEquals(3, model.declaredColumnCount);
assertEquals(3, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
}
public void testSplitColumn() {
TestNode targetNode = TestNode.create("android.widget.GridLayout").id("@+id/GridLayout1")
.bounds(new Rect(0, 0, 240, 480)).set(ANDROID_URI, ATTR_COLUMN_COUNT, "3");
TestNode b1 = TestNode.create(FQCN_BUTTON).id("@+id/Button1");
TestNode b2 = TestNode.create(FQCN_BUTTON).id("@+id/Button2");
TestNode b3 = TestNode.create(FQCN_BUTTON).id("@+id/Button3");
TestNode b4 = TestNode.create(FQCN_BUTTON).id("@+id/Button4");
targetNode.add(b1);
targetNode.add(b2);
targetNode.add(b3);
targetNode.add(b4);
b4.setAttribute(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN, "2");
GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
targetNode, null);
assertEquals(3, model.declaredColumnCount);
assertEquals(3, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
model.applyPositionAttributes();
assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("1", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("0", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("2", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("0", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("0", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("1", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("2", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
model.splitColumn(1, false /*insertMarginColumn*/, 100 /*columnWidthDp*/, 300 /* x */);
model.applyPositionAttributes();
assertEquals(4, model.declaredColumnCount);
assertEquals(4, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("0", b1.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("1", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("2", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
assertEquals("0", b2.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("3", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("0", b3.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("0", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN));
assertEquals("1", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_ROW));
assertEquals("3", b4.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
}
public void testDeletion1() {
String xml =
"\n" +
"\n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
"";
TestNode targetNode = TestNode.createFromXml(xml);
assertNotNull(targetNode);
TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
TestNode textView1 = TestNode.findById(targetNode, "@+id/TextView1");
TestNode wspace1 = TestNode.findById(targetNode, "@+id/wspace1");
TestNode wspace2 = TestNode.findById(targetNode, "@+id/wspace2");
TestNode hspace1 = TestNode.findById(targetNode, "@+id/hspace1");
assertNotNull(wspace1);
assertNotNull(hspace1);
assertNotNull(wspace2);
assertNotNull(button1);
assertNotNull(textView1);
// Assign some bounds such that the model makes sense when merging spacer sizes
// TODO: MAke test utility method to automatically assign half divisions!!
button1.bounds(new Rect(90, 10, 100, 40));
textView1.bounds(new Rect(200, 10, 100, 40));
wspace1.bounds(new Rect(0, 0, 90, 1));
wspace1.bounds(new Rect(190, 0, 10, 1));
hspace1.bounds(new Rect(0, 0, 1, 10));
GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
targetNode, null);
assertEquals(4, model.declaredColumnCount);
assertEquals(4, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
ViewData textViewData = model.getView(textView1);
assertEquals(3, textViewData.column);
// Delete button1
button1.getParent().removeChild(button1);
model.onDeleted(Arrays.asList(button1));
model.applyPositionAttributes();
assertEquals(2, model.declaredColumnCount);
assertEquals(2, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
assertNotNull(model.getView(textView1));
assertNull(model.getView(button1));
assertEquals(
"\n" +
"\n" +
"\n" +
" \n" +
" \n" +
"\n" +
" \n" +
" \n" +
"\n" +
" \n" +
" \n" +
"\n" +
"", TestNode.toXml(targetNode));
// Delete textView1
textView1.getParent().removeChild(textView1);
model.onDeleted(Arrays.asList(textView1));
model.applyPositionAttributes();
assertEquals(2, model.declaredColumnCount);
assertEquals(0, model.actualColumnCount);
assertEquals(0, model.actualRowCount);
assertNull(model.getView(textView1));
assertNull(model.getView(button1));
assertEquals(
"\n" +
"\n" +
"\n" +
"", TestNode.toXml(targetNode));
}
public void testDelete2() throws Exception {
String xml =
"\n" +
"\n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
"";
TestNode targetNode = TestNode.createFromXml(xml);
assertNotNull(targetNode);
TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
TestNode hspacer = TestNode.findById(targetNode, "@+id/spacer_177");
assertNotNull(button1);
assertNotNull(button2);
assertNotNull(button3);
assertNotNull(hspacer);
// Assign some bounds such that the model makes sense when merging spacer sizes
// TODO: MAke test utility method to automatically assign half divisions!!
button1.bounds(new Rect(0, 0, 100, 40));
button2.bounds(new Rect(100, 0, 100, 40));
button3.bounds(new Rect(50, 40, 100, 40));
hspacer.bounds(new Rect(0, 0, 50, 1));
GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
targetNode, null);
assertEquals(4, model.declaredColumnCount);
assertEquals(3, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
ViewData buttonData = model.getView(button1);
assertEquals(0, buttonData.column);
// Delete button1
button1.getParent().removeChild(button1);
model.onDeleted(Arrays.asList(button1));
model.applyPositionAttributes();
assertEquals(3, model.declaredColumnCount);
assertEquals(3, model.actualColumnCount);
assertEquals(2, model.actualRowCount);
assertNull(model.getView(button1));
assertEquals(
"\n" +
"\n" +
"\n" +
" \n" +
"\n" +
" \n" +
"\n" +
" \n" +
" \n" +
"\n" +
"", TestNode.toXml(targetNode));
}
public void testDelete3_INCOMPLETE() throws Exception {
String xml =
"\n" +
"\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
"";
TestNode targetNode = TestNode.createFromXml(xml);
assertNotNull(targetNode);
targetNode.assignBounds(
"android.widget.GridLayout [0,109,480,800] \n" +
" android.widget.Button [32,83,148,155]