/*
 * 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 =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
            "    android:layout_width=\"match_parent\"\n" +
            "    android:layout_height=\"match_parent\"\n" +
            "    android:columnCount=\"4\" >\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button1\"\n" +
            "        android:layout_column=\"1\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"1\"\n" +
            "        android:text=\"Button\" />\n" +
            "\n" +
            "    <TextView\n" +
            "        android:id=\"@+id/TextView1\"\n" +
            "        android:layout_column=\"3\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"1\"\n" +
            "        android:text=\"Text\" />\n" +
            "\n" +
            "    <Space\n" +
            "        android:id=\"@+id/wspace1\"\n" +
            "        android:layout_width=\"21dp\"\n" +
            "        android:layout_height=\"1dp\"\n" +
            "        android:layout_column=\"0\"\n" +
            "        android:layout_row=\"0\" />\n" +
            "\n" +
            "    <Space\n" +
            "        android:id=\"@+id/hspace1\"\n" +
            "        android:layout_width=\"1dp\"\n" +
            "        android:layout_height=\"55dp\"\n" +
            "        android:layout_column=\"0\"\n" +
            "        android:layout_row=\"0\" />\n" +
            "\n" +
            "    <Space\n" +
            "        android:id=\"@+id/wspace2\"\n" +
            "        android:layout_width=\"10dp\"\n" +
            "        android:layout_height=\"1dp\"\n" +
            "        android:layout_column=\"2\"\n" +
            "        android:layout_row=\"0\" />\n" +
            "\n" +
            "</GridLayout>";

        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.<INode>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(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:columnCount=\"2\">\n" +
                "\n" +
                "    <TextView\n" +
                "        android:id=\"@+id/TextView1\"\n" +
                "        android:layout_column=\"1\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"1\"\n" +
                "        android:text=\"Text\">\n" +
                "    </TextView>\n" +
                "\n" +
                "    <Space\n" +
                "        android:id=\"@+id/wspace1\"\n" +
                "        android:layout_width=\"66dp\"\n" +
                "        android:layout_height=\"1dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\">\n" +
                "    </Space>\n" +
                "\n" +
                "    <Space\n" +
                "        android:id=\"@+id/hspace1\"\n" +
                "        android:layout_width=\"1dp\"\n" +
                "        android:layout_height=\"55dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\">\n" +
                "    </Space>\n" +
                "\n" +
                "</GridLayout>", TestNode.toXml(targetNode));

        // Delete textView1

        textView1.getParent().removeChild(textView1);
        model.onDeleted(Arrays.<INode>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(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:columnCount=\"0\">\n" +
                "\n" +
                "</GridLayout>", TestNode.toXml(targetNode));

    }

    public void testDelete2() throws Exception {
        String xml =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
            "    android:layout_width=\"match_parent\"\n" +
            "    android:layout_height=\"match_parent\"\n" +
            "    android:columnCount=\"4\"\n" +
            "    android:orientation=\"vertical\" >\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button1\"\n" +
            "        android:layout_column=\"0\"\n" +
            "        android:layout_columnSpan=\"2\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"0\"\n" +
            "        android:text=\"Button1\" />\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button3\"\n" +
            "        android:layout_column=\"1\"\n" +
            "        android:layout_columnSpan=\"2\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"1\"\n" +
            "        android:text=\"Button2\" />\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button2\"\n" +
            "        android:layout_column=\"2\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"0\"\n" +
            "        android:text=\"Button3\" />\n" +
            "\n" +
            "    <Space\n" +
            "        android:id=\"@+id/spacer_177\"\n" +
            "        android:layout_width=\"46dp\"\n" +
            "        android:layout_height=\"1dp\"\n" +
            "        android:layout_column=\"0\"\n" +
            "        android:layout_row=\"0\" />\n" +
            "\n" +
            "</GridLayout>";

        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.<INode>asList(button1));
        model.applyPositionAttributes();

        assertEquals(3, model.declaredColumnCount);
        assertEquals(3, model.actualColumnCount);
        assertEquals(2, model.actualRowCount);
        assertNull(model.getView(button1));

        assertEquals(
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:columnCount=\"3\"\n" +
                "    android:orientation=\"vertical\">\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button3\"\n" +
                "        android:layout_column=\"1\"\n" +
                "        android:layout_columnSpan=\"2\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"1\"\n" +
                "        android:text=\"Button2\">\n" +
                "    </Button>\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button2\"\n" +
                "        android:layout_column=\"2\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"0\"\n" +
                "        android:text=\"Button3\">\n" +
                "    </Button>\n" +
                "\n" +
                "    <Space\n" +
                "        android:id=\"@+id/spacer_177\"\n" +
                "        android:layout_width=\"46dp\"\n" +
                "        android:layout_height=\"1dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\">\n" +
                "    </Space>\n" +
                "\n" +
                "</GridLayout>", TestNode.toXml(targetNode));
    }

    public void testDelete3_INCOMPLETE() throws Exception {
        String xml =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
            "  android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"\n" +
            "  android:columnCount=\"6\">\n" +
            "  <Button android:id=\"@+id/button1\" android:layout_column=\"1\"\n" +
            "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|top\"\n" +
            "    android:layout_row=\"1\" android:layout_rowSpan=\"2\" android:text=\"Button\" />\n" +
            "  <TextView android:id=\"@+id/TextView1\" android:layout_column=\"4\"\n" +
            "    android:layout_gravity=\"left|top\" android:layout_row=\"1\"\n" +
            "    android:text=\"Text\" />\n" +
            "  <Button android:id=\"@+id/button3\" android:layout_column=\"5\"\n" +
            "    android:layout_gravity=\"left|top\" android:layout_row=\"2\"\n" +
            "    android:layout_rowSpan=\"2\" android:text=\"Button\" />\n" +
            "  <Button android:id=\"@+id/button2\" android:layout_column=\"2\"\n" +
            "    android:layout_columnSpan=\"3\" android:layout_gravity=\"left|top\"\n" +
            "    android:layout_row=\"4\" android:text=\"Button\" />\n" +
            "  <Space android:id=\"@+id/wspace1\" android:layout_width=\"21dp\"\n" +
            "    android:layout_height=\"1dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/spacer_630\" android:layout_width=\"1dp\"\n" +
            "    android:layout_height=\"55dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/wspace2\" android:layout_width=\"10dp\"\n" +
            "    android:layout_height=\"1dp\" android:layout_column=\"3\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/spacer_619\" android:layout_width=\"59dp\"\n" +
            "    android:layout_height=\"1dp\" android:layout_column=\"1\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/spacer_102\" android:layout_width=\"1dp\"\n" +
            "    android:layout_height=\"30dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"1\" />\n" +
            "  <Space android:id=\"@+id/spacer_109\" android:layout_width=\"1dp\"\n" +
            "    android:layout_height=\"28dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"2\" />\n" +
            "  <Space android:id=\"@+id/spacer_146\" android:layout_width=\"1dp\"\n" +
            "    android:layout_height=\"70dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"3\" />\n" +
            "</GridLayout>";
        TestNode targetNode = TestNode.createFromXml(xml);
        assertNotNull(targetNode);
        targetNode.assignBounds(
            "android.widget.GridLayout [0,109,480,800] <GridLayout>\n" +
            "    android.widget.Button [32,83,148,155] <Button> @+id/button1\n" +
            "    android.widget.TextView [163,83,205,109] <TextView> @+id/TextView1\n" +
            "    android.widget.Button [237,128,353,200] <Button> @+id/button3\n" +
            "    android.widget.Button [121,275,237,347] <Button> @+id/button2\n" +
            "    android.widget.Space [0,0,32,2] <Space> @+id/wspace1\n" +
            "    android.widget.Space [0,0,2,83] <Space> @+id/spacer_630\n" +
            "    android.widget.Space [148,0,163,2] <Space> @+id/wspace2\n" +
            "    android.widget.Space [32,0,121,2] <Space> @+id/spacer_619\n" +
            "    android.widget.Space [0,83,2,128] <Space> @+id/spacer_102\n" +
            "    android.widget.Space [0,128,2,170] <Space> @+id/spacer_109\n" +
            "    android.widget.Space [0,170,2,275] <Space> @+id/spacer_146\n");
        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
        //TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");

        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
                targetNode, null);
        assertEquals(6, model.declaredColumnCount);
        assertEquals(6, model.actualColumnCount);
        assertEquals(5, model.actualRowCount);

        // TODO: Delete button2 or button3: bad stuff happens visually
        fail("Finish test");
    }

    public void testDelete4_INCOMPLETE() {
        String xml = "" +
            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
            "  xmlns:tools=\"http://schemas.android.com/tools\" " +
            "  android:layout_width=\"match_parent\"\n" +
            "  android:layout_height=\"match_parent\" android:columnCount=\"3\"\n" +
            "  android:gravity=\"center\" android:text=\"@string/hello_world\"\n" +
            "  tools:context=\".MainActivity\">\n" +
            "  <Button android:id=\"@+id/button2\" android:layout_column=\"1\"\n" +
            "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|top\"\n" +
            "    android:layout_row=\"1\" android:text=\"Button\" />\n" +
            "  <Button android:id=\"@+id/button1\" android:layout_column=\"1\"\n" +
            "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|top\"\n" +
            "    android:layout_row=\"3\" android:text=\"Button\" />\n" +
            "  <Space android:id=\"@+id/spacer_167\" android:layout_width=\"74dp\"\n" +
            "    android:layout_height=\"1dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/spacer_133\" android:layout_width=\"1dp\"\n" +
            "    android:layout_height=\"21dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/spacer_142\" android:layout_width=\"1dp\"\n" +
            "    android:layout_height=\"26dp\" android:layout_column=\"0\"\n" +
            "    android:layout_row=\"2\" />\n" +
            "  <Space android:id=\"@+id/spacer_673\" android:layout_width=\"43dp\"\n" +
            "    android:layout_height=\"1dp\" android:layout_column=\"1\"\n" +
            "    android:layout_row=\"0\" />\n" +
            "  <Space android:id=\"@+id/spacer_110\" android:layout_width=\"202dp\"\n" +
            "    android:layout_height=\"15dp\" android:layout_column=\"2\" />\n" +
            "</GridLayout>";
        TestNode targetNode = TestNode.createFromXml(xml);
        assertNotNull(targetNode);
        targetNode.assignBounds(
                "android.widget.GridLayout [0,109,480,800] <GridLayout>\n" +
                "    android.widget.Button [111,32,227,104] <Button> @+id/button2\n" +
                "    android.widget.Button [111,143,227,215] <Button> @+id/button1\n" +
                "    android.widget.Space [0,0,111,2] <Space> @+id/spacer_167\n" +
                "    android.widget.Space [0,0,2,32] <Space> @+id/spacer_133\n" +
                "    android.widget.Space [0,104,2,143] <Space> @+id/spacer_142\n" +
                "    android.widget.Space [111,0,176,2] <Space> @+id/spacer_673\n" +
                "    android.widget.Space [176,668,479,691] <Space> @+id/spacer_110");


        // Remove button2; button1 shifts to the right!

        //TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
        //TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
        assertEquals(new Rect(111, 32, 227 - 111, 104 - 32), button2.getBounds());

        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
                targetNode, null);
        assertEquals(3, model.declaredColumnCount);
        assertEquals(3, model.actualColumnCount);
        assertEquals(4, model.actualRowCount);
        fail("Finish test");
    }

    public void testDelete5_INCOMPLETE() {
        String xml =
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "  android:id=\"@+id/GridLayout1\" android:layout_width=\"match_parent\"\n" +
                "  android:layout_height=\"match_parent\" android:columnCount=\"4\"\n" +
                "  android:orientation=\"vertical\">\n" +
                "  <Button android:id=\"@+id/button1\" android:layout_column=\"0\"\n" +
                "    android:layout_gravity=\"center_horizontal|bottom\"\n" +
                "    android:layout_row=\"0\" android:text=\"Button\" />\n" +
                "  <Space android:layout_width=\"66dp\" android:layout_height=\"1dp\"\n" +
                "    android:layout_column=\"0\" android:layout_row=\"0\" />\n" +
                "  <Button android:id=\"@+id/button3\" android:layout_column=\"2\"\n" +
                "    android:layout_gravity=\"left|bottom\" android:layout_row=\"0\"\n" +
                "    android:text=\"Button\" />\n" +
                "  <Button android:id=\"@+id/button2\" android:layout_column=\"3\"\n" +
                "    android:layout_columnSpan=\"2\" android:layout_gravity=\"left|bottom\"\n" +
                "    android:layout_row=\"0\" android:text=\"Button\" />\n" +
                "  <Space android:id=\"@+id/spacer_109\" android:layout_width=\"51dp\"\n" +
                "    android:layout_height=\"1dp\" android:layout_column=\"1\"\n" +
                "    android:layout_row=\"0\" />\n" +
                "  <Space android:layout_width=\"129dp\" android:layout_height=\"1dp\"\n" +
                "    android:layout_column=\"2\" android:layout_row=\"0\" />\n" +
                "  <Space android:layout_width=\"62dp\" android:layout_height=\"1dp\"\n" +
                "    android:layout_column=\"3\" android:layout_row=\"0\" />\n" +
                "  <Space android:id=\"@+id/spacer_397\" android:layout_width=\"1dp\"\n" +
                "    android:layout_height=\"103dp\" android:layout_column=\"0\"\n" +
                "    android:layout_row=\"0\" />\n" +
                "  <Space android:layout_width=\"1dp\" android:layout_height=\"356dp\"\n" +
                "    android:layout_column=\"0\" android:layout_row=\"1\" />\n" +
                "</GridLayout>";
        TestNode targetNode = TestNode.createFromXml(xml);
        assertNotNull(targetNode);

        targetNode.assignBounds(
                "android.widget.GridLayout [0,109,480,800] <GridLayout> @+id/GridLayout1\n" +
                "    android.widget.Button [0,83,116,155] <Button> @+id/button1\n" +
                "    android.widget.Space [0,0,99,2] <Space>\n" +
                "    android.widget.Button [193,83,309,155] <Button> @+id/button3\n" +
                "    android.widget.Button [387,83,503,155] <Button> @+id/button2\n" +
                "    android.widget.Space [116,0,193,2] <Space> @+id/spacer_109\n" +
                "    android.widget.Space [193,0,387,2] <Space>\n" +
                "    android.widget.Space [387,0,480,2] <Space>\n" +
                "    android.widget.Space [0,0,2,155] <Space> @+id/spacer_397\n" +
                "    android.widget.Space [0,155,2,689] <Space>");

        // Delete button3. This causes an array out of bounds exception currently.

        //TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
        //TestNode button1 = TestNode.findById(targetNode, "@+id/button1");
        TestNode button2 = TestNode.findById(targetNode, "@+id/button2");
        TestNode button3 = TestNode.findById(targetNode, "@+id/button3");
        assertEquals(new Rect(387, 83, 503 - 387, 155- 83), button2.getBounds());

        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
                targetNode, null);
        assertEquals(4, model.declaredColumnCount);
        assertEquals(4, model.actualColumnCount);
        assertEquals(2, model.actualRowCount);

        model.onDeleted(Collections.<INode>singletonList(button3));
        // Exception fixed; todo: Test that the model updates are correct.

        assertEquals(3, model.declaredColumnCount);
        assertEquals(3, model.actualColumnCount);
        assertEquals(2, model.actualRowCount);

        fail("Finish test");
    }

    public void testInsert1() throws Exception {
        String xml =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
            "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
            "    android:id=\"@+id/GridLayout1\"\n" +
            "    android:layout_width=\"match_parent\"\n" +
            "    android:layout_height=\"match_parent\"\n" +
            "    android:columnCount=\"4\"\n" +
            "    android:orientation=\"vertical\" >\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button1\"\n" +
            "        android:layout_column=\"0\"\n" +
            "        android:layout_columnSpan=\"4\"\n" +
            "        android:layout_gravity=\"center_horizontal|bottom\"\n" +
            "        android:layout_row=\"0\"\n" +
            "        android:text=\"Button\" />\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button2\"\n" +
            "        android:layout_column=\"2\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"1\"\n" +
            "        android:text=\"Button\" />\n" +
            "\n" +
            "    <Button\n" +
            "        android:id=\"@+id/button3\"\n" +
            "        android:layout_column=\"3\"\n" +
            "        android:layout_gravity=\"left|top\"\n" +
            "        android:layout_row=\"1\"\n" +
            "        android:text=\"Button\" />\n" +
            "\n" +
            "    <Space\n" +
            "        android:id=\"@+id/spacer_393\"\n" +
            "        android:layout_width=\"81dp\"\n" +
            "        android:layout_height=\"1dp\"\n" +
            "        android:layout_column=\"1\"\n" +
            "        android:layout_row=\"0\" />\n" +
            "\n" +
            "    <Space\n" +
            "        android:id=\"@+id/spacer_397\"\n" +
            "        android:layout_width=\"1dp\"\n" +
            "        android:layout_height=\"103dp\"\n" +
            "        android:layout_column=\"0\"\n" +
            "        android:layout_row=\"0\" />\n" +
            "\n" +
            "</GridLayout>";

        TestNode targetNode = TestNode.createFromXml(xml);
        assertNotNull(targetNode);

        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
        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_393");
        TestNode vspacer = TestNode.findById(targetNode, "@+id/spacer_397");
        assertNotNull(layout);
        assertNotNull(button1);
        assertNotNull(button2);
        assertNotNull(button3);
        assertNotNull(hspacer);

        // Obtained by setting ViewHierarchy.DUMP_INFO=true:
        layout.bounds(new Rect(0, 109, 480, 800-109));
        button1.bounds(new Rect(182, 83, 298-182, 155-83));
        button2.bounds(new Rect(124, 155, 240-124, 227-155));
        button3.bounds(new Rect(240, 155, 356-240, 227-155));
        hspacer.bounds(new Rect(2, 0, 124-2, 2));
        vspacer.bounds(new Rect(0, 0, 2, 155));

        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
                targetNode, null);
        assertEquals(4, model.declaredColumnCount);
        assertEquals(4, model.actualColumnCount);
        assertEquals(2, model.actualRowCount);


        model.splitColumn(1, false, 21, 32);
        int index = model.getInsertIndex(2, 1);
        GridModel.ViewData next = model.getView(index);
        INode newChild = targetNode.insertChildAt(FQCN_BUTTON, index);
        next.applyPositionAttributes();
        model.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN, 1);
        model.setGridAttribute(newChild, ATTR_LAYOUT_COLUMN_SPAN, 3);
    }

    public void testInsert2() throws Exception {
        // Drop into a view where there is a centered view: when dropping to the right of
        // it (on a row further down), ensure that the row span is increased for the
        // non-left-justified centered view which does not horizontally overlap the view
        String xml =
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    android:id=\"@+id/GridLayout1\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:columnCount=\"3\"\n" +
                "    android:orientation=\"vertical\" >\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button1\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_columnSpan=\"3\"\n" +
                "        android:layout_gravity=\"center_horizontal|bottom\"\n" +
                "        android:layout_row=\"0\"\n" +
                "        android:text=\"Button\" />\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button2\"\n" +
                "        android:layout_column=\"1\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"1\"\n" +
                "        android:text=\"Button\" />\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button3\"\n" +
                "        android:layout_column=\"2\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"1\"\n" +
                "        android:text=\"Button\" />\n" +
                "\n" +
                "    <Space\n" +
                "        android:id=\"@+id/spacer_393\"\n" +
                "        android:layout_width=\"81dp\"\n" +
                "        android:layout_height=\"1dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\" />\n" +
                "\n" +
                "    \n" +
                "    <Space\n" +
                "        android:id=\"@+id/spacer_397\"\n" +
                "        android:layout_width=\"1dp\"\n" +
                "        android:layout_height=\"103dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\" />\n" +
                "\n" +
                "    \n" +
                "</GridLayout>";

        TestNode targetNode = TestNode.createFromXml(xml);
        assertNotNull(targetNode);

        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
        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_393");
        TestNode vspacer = TestNode.findById(targetNode, "@+id/spacer_397");
        assertNotNull(layout);
        assertNotNull(button1);
        assertNotNull(button2);
        assertNotNull(button3);
        assertNotNull(hspacer);

        // Obtained by setting ViewHierarchy.DUMP_INFO=true:
        layout.bounds(new Rect(0, 109, 480, 800-109));
        button1.bounds(new Rect(182, 83, 298-182, 155-83));
        button2.bounds(new Rect(122, 155, 238-122, 227-155));
        button3.bounds(new Rect(238, 155, 354-238, 227-155));
        hspacer.bounds(new Rect(0, 0, 122, 2));
        vspacer.bounds(new Rect(0, 0, 2, 155));

        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
                targetNode, null);
        assertEquals(3, model.declaredColumnCount);
        assertEquals(3, model.actualColumnCount);
        assertEquals(2, model.actualRowCount);

        ViewData view = model.getView(button1);
        assertNotNull(view);
        assertEquals(0, view.column);
        assertEquals(3, view.columnSpan);
        assertEquals("3", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));

        model.splitColumn(3, false, 53, 318);
        assertEquals(0, view.column);
        assertEquals(4, view.columnSpan);
        assertEquals("4", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
    }

    public void testInsert3_BROKEN() throws Exception {
        // Check that when we insert a new gap column near an existing column, the
        // view in that new column does not get moved
        String xml =
                "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<GridLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n" +
                "    android:id=\"@+id/GridLayout1\"\n" +
                "    android:layout_width=\"match_parent\"\n" +
                "    android:layout_height=\"match_parent\"\n" +
                "    android:columnCount=\"3\"\n" +
                "    android:orientation=\"vertical\" >\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button1\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_columnSpan=\"3\"\n" +
                "        android:layout_gravity=\"center_horizontal|bottom\"\n" +
                "        android:layout_row=\"0\"\n" +
                "        android:text=\"Button\" />\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button2\"\n" +
                "        android:layout_column=\"1\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"1\"\n" +
                "        android:text=\"Button\" />\n" +
                "\n" +
                "    <Button\n" +
                "        android:id=\"@+id/button3\"\n" +
                "        android:layout_column=\"2\"\n" +
                "        android:layout_gravity=\"left|top\"\n" +
                "        android:layout_row=\"1\"\n" +
                "        android:text=\"Button\" />\n" +
                "\n" +
                "    <Space\n" +
                "        android:id=\"@+id/spacer_393\"\n" +
                "        android:layout_width=\"81dp\"\n" +
                "        android:layout_height=\"1dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\" />\n" +
                "\n" +
                "    \n" +
                "    <Space\n" +
                "        android:id=\"@+id/spacer_397\"\n" +
                "        android:layout_width=\"1dp\"\n" +
                "        android:layout_height=\"103dp\"\n" +
                "        android:layout_column=\"0\"\n" +
                "        android:layout_row=\"0\" />\n" +
                "\n" +
                "    \n" +
                "</GridLayout>";

        TestNode targetNode = TestNode.createFromXml(xml);
        assertNotNull(targetNode);

        TestNode layout = TestNode.findById(targetNode, "@+id/GridLayout1");
        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_393");
        TestNode vspacer = TestNode.findById(targetNode, "@+id/spacer_397");
        assertNotNull(layout);
        assertNotNull(button1);
        assertNotNull(button2);
        assertNotNull(button3);
        assertNotNull(hspacer);

        // Obtained by setting ViewHierarchy.DUMP_INFO=true:
        layout.bounds(new Rect(0, 109, 480, 800-109));
        button1.bounds(new Rect(182, 83, 298-182, 155-83));
        button2.bounds(new Rect(122, 155, 238-122, 227-155));
        button3.bounds(new Rect(238, 155, 354-238, 227-155));
        hspacer.bounds(new Rect(0, 0, 122, 2));
        vspacer.bounds(new Rect(0, 0, 2, 155));

        GridModel model = GridModel.get(new LayoutTestBase.TestRulesEngine(targetNode.getFqcn()),
                targetNode, null);
        assertEquals(3, model.declaredColumnCount);
        assertEquals(3, model.actualColumnCount);
        assertEquals(2, model.actualRowCount);

        ViewData view = model.getView(button3);
        assertNotNull(view);
        assertEquals(2, view.column);
        assertEquals(1, view.columnSpan);
        assertNull("1", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));

        model.splitColumn(2, true, 10, 253);
        // TODO: Finish this test: Assert that the cells are in the right place
        //assertEquals(4, view.column);
        //assertEquals(1, view.columnSpan);
        //assertEquals("4", view.node.getStringAttr(ANDROID_URI, ATTR_LAYOUT_COLUMN_SPAN));
        fail("Finish test");
    }
}
