/* * 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" + " \n" + "\n" + "", TestNode.toXml(targetNode)); } public void testDelete3_INCOMPLETE() throws Exception { String xml = "\n" + "\n" + "