blob: 258883db5487d92ec648ff04a532928564bccaa6 [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 android.widget.cts;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.test.ActivityInstrumentationTestCase2;
import android.test.UiThreadTest;
import android.util.AttributeSet;
import android.util.Xml;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.MeasureSpec;
import android.view.ViewGroup.OnHierarchyChangeListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import com.android.cts.stub.R;
import dalvik.annotation.BrokenTest;
import dalvik.annotation.TestTargets;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.ToBeFixed;
/**
* Test {@link TableLayout}.
*/
@TestTargetClass(TableLayout.class)
public class TableLayoutTest extends ActivityInstrumentationTestCase2<TableStubActivity> {
private Context mContext;
public TableLayoutTest() {
super("com.android.cts.stub", TableStubActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mContext = getInstrumentation().getContext();
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test constructor(s) of {@link TableLayout}",
method = "TableLayout",
args = {android.content.Context.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test constructor(s) of {@link TableLayout}",
method = "TableLayout",
args = {android.content.Context.class, android.util.AttributeSet.class}
)
})
@UiThreadTest
public void testConstructor() {
new TableLayout(mContext);
new TableLayout(mContext, null);
TableStubActivity activity = getActivity();
activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
TableLayout tableLayout = (TableLayout) activity
.findViewById(com.android.cts.stub.R.id.table1);
assertTrue(tableLayout.isColumnCollapsed(0));
assertTrue(tableLayout.isColumnStretchable(2));
activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
tableLayout = (TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
assertTrue(tableLayout.isColumnShrinkable(1));
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test setOnHierarchyChangeListener(OnHierarchyChangeListener listener)",
method = "setOnHierarchyChangeListener",
args = {android.view.ViewGroup.OnHierarchyChangeListener.class}
)
public void testSetOnHierarchyChangeListener() {
TableLayout tableLayout = new TableLayout(mContext);
MockOnHierarchyChangeListener listener = new MockOnHierarchyChangeListener();
tableLayout.setOnHierarchyChangeListener(listener);
tableLayout.addView(new TextView(mContext));
assertTrue(listener.hasCalledOnChildViewAdded());
tableLayout.removeViewAt(0);
assertTrue(listener.hasCalledOnChildViewRemoved());
listener.reset();
tableLayout.setOnHierarchyChangeListener(null);
tableLayout.addView(new TextView(mContext));
assertFalse(listener.hasCalledOnChildViewAdded());
tableLayout.removeViewAt(0);
assertFalse(listener.hasCalledOnChildViewRemoved());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test requestLayout()",
method = "requestLayout",
args = {}
)
public void testRequestLayout() {
TableLayout tableLayout = new TableLayout(mContext);
tableLayout.addView(new TextView(mContext));
tableLayout.addView(new ListView(mContext));
tableLayout.layout(0, 0, 200, 300);
assertFalse(tableLayout.isLayoutRequested());
assertFalse(tableLayout.getChildAt(0).isLayoutRequested());
assertFalse(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.requestLayout();
assertTrue(tableLayout.isLayoutRequested());
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ShrinkAllColumns",
method = "isShrinkAllColumns",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ShrinkAllColumns",
method = "setShrinkAllColumns",
args = {boolean.class}
)
})
public void testAccessShrinkAllColumns() {
TableLayout tableLayout = new TableLayout(mContext);
assertFalse(tableLayout.isShrinkAllColumns());
tableLayout.setShrinkAllColumns(true);
assertTrue(tableLayout.isShrinkAllColumns());
tableLayout.setShrinkAllColumns(false);
assertFalse(tableLayout.isShrinkAllColumns());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access StretchAllColumns",
method = "isStretchAllColumns",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access StretchAllColumns",
method = "setStretchAllColumns",
args = {boolean.class}
)
})
public void testAccessStretchAllColumns() {
TableLayout tableLayout = new TableLayout(mContext);
assertFalse(tableLayout.isStretchAllColumns());
tableLayout.setStretchAllColumns(true);
assertTrue(tableLayout.isStretchAllColumns());
tableLayout.setStretchAllColumns(false);
assertFalse(tableLayout.isStretchAllColumns());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ColumnCollapsed",
method = "isColumnCollapsed",
args = {int.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ColumnCollapsed",
method = "setColumnCollapsed",
args = {int.class, boolean.class}
)
})
public void testAccessColumnCollapsed() {
TableLayout tableLayout = new TableLayout(mContext);
tableLayout.addView(new TextView(mContext));
tableLayout.addView(new TextView(mContext));
assertFalse(tableLayout.isColumnCollapsed(0));
assertFalse(tableLayout.isColumnCollapsed(1));
tableLayout.layout(0, 0, 200, 300);
assertFalse(tableLayout.getChildAt(0).isLayoutRequested());
assertFalse(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.setColumnCollapsed(0, true);
assertTrue(tableLayout.isColumnCollapsed(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnCollapsed(1, true);
assertTrue(tableLayout.isColumnCollapsed(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnCollapsed(0, false);
assertFalse(tableLayout.isColumnCollapsed(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnCollapsed(1, false);
assertFalse(tableLayout.isColumnCollapsed(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ColumnStretchable",
method = "isColumnStretchable",
args = {int.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ColumnStretchable",
method = "setColumnStretchable",
args = {int.class, boolean.class}
)
})
public void testAccessColumnStretchable() {
TableLayout tableLayout = new TableLayout(mContext);
tableLayout.addView(new TableRow(mContext));
tableLayout.addView(new TableRow(mContext));
assertFalse(tableLayout.isColumnStretchable(0));
assertFalse(tableLayout.isColumnStretchable(1));
tableLayout.layout(0, 0, 200, 300);
assertFalse(tableLayout.getChildAt(0).isLayoutRequested());
assertFalse(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.setColumnStretchable(0, true);
assertTrue(tableLayout.isColumnStretchable(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnStretchable(1, true);
assertTrue(tableLayout.isColumnStretchable(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnStretchable(0, false);
assertFalse(tableLayout.isColumnStretchable(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnStretchable(1, false);
assertFalse(tableLayout.isColumnStretchable(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "test whether columns are actually stretched",
method = "setColumnStretchable",
args = {java.lang.Integer.class, java.lang.Boolean.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "test whether columns are actually stretched",
method = "setStretchAllColumns",
args = {java.lang.Boolean.class}
)
})
@ToBeFixed( bug = "", explanation = "After set a column unable to be stretched," +
" the other strtchable columns are not strtched as much as available.")
public void testColumnStretchableEffect() {
final TableStubActivity activity = getActivity();
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
activity.setContentView(com.android.cts.stub.R.layout.table_layout_1);
}
});
getInstrumentation().waitForIdleSync();
final TableLayout tableLayout =
(TableLayout) activity.findViewById(com.android.cts.stub.R.id.table1);
// Preparation: remove Collapsed mark for column 0.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnCollapsed(0, false);
}
});
getInstrumentation().waitForIdleSync();
assertFalse(tableLayout.isColumnStretchable(0));
assertFalse(tableLayout.isColumnStretchable(1));
assertTrue(tableLayout.isColumnStretchable(2));
TextView column0 = (TextView) ((TableRow) tableLayout.getChildAt(0)).getChildAt(0);
TextView column1 = (TextView) ((TableRow) tableLayout.getChildAt(0)).getChildAt(1);
TextView column2 = (TextView) ((TableRow) tableLayout.getChildAt(0)).getChildAt(2);
int oldWidth0 = column0.getWidth();
int oldWidth1 = column1.getWidth();
int oldWidth2 = column2.getWidth();
column0.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
int orignalWidth0 = column0.getMeasuredWidth();
column1.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
int orignalWidth1 = column1.getMeasuredWidth();
column2.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
int orignalWidth2 = column2.getMeasuredWidth();
int totalSpace = tableLayout.getWidth() - orignalWidth0
- orignalWidth1 - orignalWidth2;
// Test: set column 1 is able to be stretched.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnStretchable(1, true);
}
});
getInstrumentation().waitForIdleSync();
assertEquals(oldWidth0, column0.getWidth());
assertTrue(oldWidth1 < column1.getWidth());
assertTrue(oldWidth2 > column2.getWidth());
int extraSpace = totalSpace / 2;
assertEquals(orignalWidth0, column0.getWidth());
assertEquals(orignalWidth1 + extraSpace, column1.getWidth());
assertEquals(orignalWidth2 + extraSpace, column2.getWidth());
oldWidth0 = column0.getWidth();
oldWidth1 = column1.getWidth();
oldWidth2 = column2.getWidth();
// Test: set column 0 is able to be stretched.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnStretchable(0, true);
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 < column0.getWidth());
assertTrue(oldWidth1 > column1.getWidth());
assertTrue(oldWidth2 > column2.getWidth());
extraSpace = totalSpace / 3;
assertEquals(orignalWidth0 + extraSpace, column0.getWidth());
assertEquals(orignalWidth1 + extraSpace, column1.getWidth());
assertEquals(orignalWidth2 + extraSpace, column2.getWidth());
oldWidth0 = column0.getWidth();
oldWidth1 = column1.getWidth();
oldWidth2 = column2.getWidth();
// Test: set column 2 is unable to be stretched.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnStretchable(2, false);
}
});
getInstrumentation().waitForIdleSync();
// assertTrue(oldWidth0 < column0.getWidth());
// assertTrue(oldWidth1 < column1.getWidth());
assertEquals(oldWidth0, column0.getWidth());
assertEquals(oldWidth1, column1.getWidth());
assertTrue(oldWidth2 > column2.getWidth());
// extraSpace = totalSpace / 2;
extraSpace = totalSpace / 3;
assertEquals(orignalWidth0 + extraSpace, column0.getWidth());
assertEquals(orignalWidth1 + extraSpace, column1.getWidth());
assertEquals(orignalWidth2, column2.getWidth());
oldWidth0 = column0.getWidth();
oldWidth1 = column1.getWidth();
oldWidth2 = column2.getWidth();
// Test: mark all columns are able to be stretched.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setStretchAllColumns(true);
tableLayout.requestLayout();
}
});
getInstrumentation().waitForIdleSync();
// assertTrue(oldWidth0 > column0.getWidth());
// assertTrue(oldWidth1 > column1.getWidth());
assertEquals(oldWidth0, column0.getWidth());
assertEquals(oldWidth1, column1.getWidth());
assertTrue(oldWidth2 < column2.getWidth());
extraSpace = totalSpace / 3;
assertEquals(orignalWidth0 + extraSpace, column0.getWidth());
assertEquals(orignalWidth1 + extraSpace, column1.getWidth());
assertEquals(orignalWidth2 + extraSpace, column2.getWidth());
oldWidth0 = column0.getWidth();
oldWidth1 = column1.getWidth();
oldWidth2 = column2.getWidth();
// Test: Remove the mark for all columns are able to be stretched.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setStretchAllColumns(false);
tableLayout.requestLayout();
}
});
getInstrumentation().waitForIdleSync();
// assertTrue(oldWidth0 > column0.getWidth());
// assertTrue(oldWidth1 > column1.getWidth());
assertEquals(oldWidth0, column0.getWidth());
assertEquals(oldWidth1, column1.getWidth());
assertTrue(oldWidth2 > column2.getWidth());
assertEquals(orignalWidth0 + extraSpace, column0.getWidth());
assertEquals(orignalWidth1 + extraSpace, column1.getWidth());
assertEquals(orignalWidth2, column2.getWidth());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ColumnShrinkable",
method = "isColumnShrinkable",
args = {int.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test methods which access ColumnShrinkable",
method = "setColumnShrinkable",
args = {int.class, boolean.class}
)
})
public void testAccessColumnShrinkable() {
TableLayout tableLayout = new TableLayout(mContext);
tableLayout.addView(new TableRow(mContext));
tableLayout.addView(new TableRow(mContext));
assertFalse(tableLayout.isColumnShrinkable(0));
assertFalse(tableLayout.isColumnShrinkable(1));
tableLayout.layout(0, 0, 200, 300);
assertFalse(tableLayout.getChildAt(0).isLayoutRequested());
assertFalse(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.setColumnShrinkable(0, true);
assertTrue(tableLayout.isColumnShrinkable(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnShrinkable(1, true);
assertTrue(tableLayout.isColumnShrinkable(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnShrinkable(0, false);
assertFalse(tableLayout.isColumnShrinkable(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
tableLayout.setColumnShrinkable(1, false);
assertFalse(tableLayout.isColumnShrinkable(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "test whether columns are actually shrunk",
method = "setColumnShrinkable",
args = {java.lang.Integer.class, java.lang.Boolean.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "test whether columns are actually shrunk",
method = "setShrinkAllColumns",
args = {java.lang.Boolean.class}
)
})
@ToBeFixed( bug = "", explanation = "After set a column unable to be shrunk," +
" the other shrinkable columns are not shrunk more.")
@BrokenTest("fails consistently")
public void testColumnShrinkableEffect() {
final TableStubActivity activity = getActivity();
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
activity.setContentView(com.android.cts.stub.R.layout.table_layout_2);
}
});
getInstrumentation().waitForIdleSync();
final TableLayout tableLayout =
(TableLayout) activity.findViewById(com.android.cts.stub.R.id.table2);
final int columnVirtualIndex0 = 1;
final int columnVirtualIndex1 = 2;
final int columnVirtualIndex2 = 4;
final TextView child0 = (TextView) ((TableRow) tableLayout.getChildAt(0)).getChildAt(0);
final TextView child1 = (TextView) ((TableRow) tableLayout.getChildAt(0)).getChildAt(1);
final TextView child2 = (TextView) ((TableRow) tableLayout.getChildAt(0)).getChildAt(2);
// get the original width of each child.
int oldWidth0 = child0.getWidth();
int oldWidth1 = child1.getWidth();
int oldWidth2 = child2.getWidth();
child0.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
int orignalWidth0 = child0.getMeasuredWidth();
// child1 has 2 columns.
child1.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
TextView column12 = (TextView) ((TableRow) tableLayout.getChildAt(1)).getChildAt(2);
column12.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
int orignalWidth1 = child1.getMeasuredWidth() + column12.getMeasuredWidth();
child2.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY);
int orignalWidth2 = child2.getMeasuredWidth();
int totalSpace = tableLayout.getWidth() - orignalWidth0
- orignalWidth1 - orignalWidth2;
// Test: set column 2 which is the start column for child 1 is able to be shrunk.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnShrinkable(columnVirtualIndex1, true);
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 < child0.getWidth());
assertTrue(oldWidth1 > child1.getWidth());
assertEquals(oldWidth2, child2.getWidth());
int extraSpace = totalSpace / 2;
assertEquals(dropNegative(orignalWidth0 + extraSpace), child0.getWidth());
assertEquals(dropNegative(orignalWidth1 + extraSpace), child1.getWidth());
assertEquals(orignalWidth2, child2.getWidth());
oldWidth0 = child0.getWidth();
oldWidth1 = child1.getWidth();
oldWidth2 = child2.getWidth();
// Test: set column 4 which is the column for child 2 is able to be shrunk.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnShrinkable(columnVirtualIndex2, true);
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 < child0.getWidth());
assertTrue(oldWidth1 < child1.getWidth());
assertTrue(oldWidth2 > child2.getWidth());
extraSpace = totalSpace / 3;
assertEquals(dropNegative(orignalWidth0 + extraSpace), child0.getWidth());
assertEquals(dropNegative(orignalWidth1 + extraSpace), child1.getWidth());
assertEquals(dropNegative(orignalWidth2 + extraSpace), child2.getWidth());
oldWidth0 = child0.getWidth();
oldWidth1 = child1.getWidth();
oldWidth2 = child2.getWidth();
// Test: set column 3 which is the end column for child 1 is able to be shrunk.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnShrinkable(columnVirtualIndex1+1, true);
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 < child0.getWidth());
assertTrue(oldWidth1 > child1.getWidth());
assertTrue(oldWidth2 < child2.getWidth());
extraSpace = totalSpace / 4;
assertEquals(dropNegative(orignalWidth0 + extraSpace), child0.getWidth());
assertEquals(dropNegative(orignalWidth1 + extraSpace * 2), child1.getWidth());
assertEquals(dropNegative(orignalWidth2 + extraSpace), child2.getWidth());
oldWidth0 = child0.getWidth();
oldWidth1 = child1.getWidth();
oldWidth2 = child2.getWidth();
// Test: set column 1 which is the column for child 0 is unable to be shrunk.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setColumnShrinkable(columnVirtualIndex0, false);
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 < child0.getWidth());
// assertTrue(oldWidth1 > column1.getWidth());
// assertTrue(oldWidth2 > column2.getWidth());
assertEquals(oldWidth1, child1.getWidth());
assertEquals(oldWidth2, child2.getWidth());
// extraSpace = totalSpace / 3;
extraSpace = totalSpace / 4;
assertEquals(orignalWidth0, child0.getWidth());
assertEquals(orignalWidth1 + extraSpace * 2, child1.getWidth());
assertEquals(orignalWidth2 + extraSpace, child2.getWidth());
oldWidth0 = child0.getWidth();
oldWidth1 = child1.getWidth();
oldWidth2 = child2.getWidth();
// Test: mark all columns are able to be shrunk.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setShrinkAllColumns(true);
tableLayout.requestLayout();
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 > child0.getWidth());
assertTrue(oldWidth1 < child1.getWidth());
assertTrue(oldWidth2 < child2.getWidth());
extraSpace = totalSpace / 5;
assertEquals(orignalWidth0 + extraSpace, child0.getWidth());
assertEquals(orignalWidth1 + extraSpace * 2, child1.getWidth());
assertEquals(orignalWidth2 + extraSpace, child2.getWidth());
oldWidth0 = child0.getWidth();
oldWidth1 = child1.getWidth();
oldWidth2 = child2.getWidth();
// Test: Remove the mark for all columns are able to be shrunk.
getInstrumentation().runOnMainSync(new Runnable() {
public void run() {
tableLayout.setShrinkAllColumns(false);
tableLayout.requestLayout();
}
});
getInstrumentation().waitForIdleSync();
assertTrue(oldWidth0 < child0.getWidth());
assertTrue(oldWidth1 > child1.getWidth());
assertTrue(oldWidth2 > child2.getWidth());
// extraSpace = totalSpace / 3;
extraSpace = totalSpace / 4;
assertEquals(orignalWidth0, child0.getWidth());
assertEquals(orignalWidth1 + extraSpace * 2, child1.getWidth());
assertEquals(orignalWidth2 + extraSpace, child2.getWidth());
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test addView(View child)",
method = "addView",
args = {android.view.View.class}
)
@ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
public void testAddView1() {
TableLayout tableLayout = new TableLayout(mContext);
View child1 = new TextView(mContext);
tableLayout.addView(child1);
assertSame(child1, tableLayout.getChildAt(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child2 = new RelativeLayout(mContext);
tableLayout.addView(child2);
assertSame(child1, tableLayout.getChildAt(0));
assertSame(child2, tableLayout.getChildAt(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child3 = new ListView(mContext);
tableLayout.addView(child3);
assertSame(child1, tableLayout.getChildAt(0));
assertSame(child2, tableLayout.getChildAt(1));
assertSame(child3, tableLayout.getChildAt(2));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
assertTrue(tableLayout.getChildAt(2).isLayoutRequested());
// exceptional
try {
tableLayout.addView(null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test addView(View child, int index)",
method = "addView",
args = {android.view.View.class, int.class}
)
@ToBeFixed( bug = "1417734", explanation = "IndexOutOfBoundsException and " +
"NullPointerException issue")
public void testAddView2() {
TableLayout tableLayout = new TableLayout(mContext);
View child1 = new TextView(mContext);
tableLayout.addView(child1, 0);
assertSame(child1, tableLayout.getChildAt(0));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child2 = new RelativeLayout(mContext);
tableLayout.addView(child2, 0);
assertSame(child2, tableLayout.getChildAt(0));
assertSame(child1, tableLayout.getChildAt(1));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child3 = new ListView(mContext);
tableLayout.addView(child3, -1);
assertSame(child2, tableLayout.getChildAt(0));
assertSame(child1, tableLayout.getChildAt(1));
assertSame(child3, tableLayout.getChildAt(2));
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
assertTrue(tableLayout.getChildAt(2).isLayoutRequested());
try {
tableLayout.addView(new ListView(mContext), Integer.MAX_VALUE);
fail("Should throw IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException e) {
}
try {
tableLayout.addView(null, -1);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test addView(View child, ViewGroup.LayoutParams params)",
method = "addView",
args = {android.view.View.class, android.view.ViewGroup.LayoutParams.class}
)
@ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
public void testAddView3() {
TableLayout tableLayout = new TableLayout(mContext);
View child1 = new TextView(mContext);
assertNull(child1.getLayoutParams());
tableLayout.addView(child1, new ViewGroup.LayoutParams(100, 200));
assertSame(child1, tableLayout.getChildAt(0));
assertEquals(100, tableLayout.getChildAt(0).getLayoutParams().width);
assertEquals(200, tableLayout.getChildAt(0).getLayoutParams().height);
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child2 = new TableRow(mContext);
assertNull(child2.getLayoutParams());
tableLayout.addView(child2, new TableRow.LayoutParams(200, 300, 1));
assertSame(child1, tableLayout.getChildAt(0));
assertSame(child2, tableLayout.getChildAt(1));
assertEquals(100, tableLayout.getChildAt(0).getLayoutParams().width);
assertEquals(200, tableLayout.getChildAt(0).getLayoutParams().height);
assertEquals(200, tableLayout.getChildAt(1).getLayoutParams().width);
assertEquals(300, tableLayout.getChildAt(1).getLayoutParams().height);
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
try {
tableLayout.addView(null, new TableLayout.LayoutParams(200, 300));
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
try {
tableLayout.addView(new ListView(mContext), null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test addView(View child, int index, ViewGroup.LayoutParams params)",
method = "addView",
args = {android.view.View.class, int.class, android.view.ViewGroup.LayoutParams.class}
)
@ToBeFixed( bug = "1417734", explanation = "IndexOutOfBoundsException and " +
"NullPointerException issue")
public void testAddView4() {
TableLayout tableLayout = new TableLayout(mContext);
View child1 = new TextView(mContext);
assertNull(child1.getLayoutParams());
tableLayout.addView(child1, 0, new ViewGroup.LayoutParams(100, 200));
assertSame(child1, tableLayout.getChildAt(0));
assertEquals(100, tableLayout.getChildAt(0).getLayoutParams().width);
assertEquals(200, tableLayout.getChildAt(0).getLayoutParams().height);
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child2 = new TableRow(mContext);
assertNull(child2.getLayoutParams());
tableLayout.addView(child2, 0, new TableRow.LayoutParams(200, 300, 1));
assertSame(child2, tableLayout.getChildAt(0));
assertSame(child1, tableLayout.getChildAt(1));
assertEquals(200, tableLayout.getChildAt(0).getLayoutParams().width);
assertEquals(300, tableLayout.getChildAt(0).getLayoutParams().height);
assertEquals(100, tableLayout.getChildAt(1).getLayoutParams().width);
assertEquals(200, tableLayout.getChildAt(1).getLayoutParams().height);
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
tableLayout.layout(0, 0, 200, 300);
View child3 = new ListView(mContext);
assertNull(child3.getLayoutParams());
tableLayout.addView(child3, -1, new ListView.LayoutParams(300, 400));
assertSame(child2, tableLayout.getChildAt(0));
assertSame(child1, tableLayout.getChildAt(1));
assertSame(child3, tableLayout.getChildAt(2));
assertEquals(200, tableLayout.getChildAt(0).getLayoutParams().width);
assertEquals(300, tableLayout.getChildAt(0).getLayoutParams().height);
assertEquals(100, tableLayout.getChildAt(1).getLayoutParams().width);
assertEquals(200, tableLayout.getChildAt(1).getLayoutParams().height);
assertEquals(300, tableLayout.getChildAt(2).getLayoutParams().width);
assertEquals(400, tableLayout.getChildAt(2).getLayoutParams().height);
assertTrue(tableLayout.getChildAt(0).isLayoutRequested());
assertTrue(tableLayout.getChildAt(1).isLayoutRequested());
assertTrue(tableLayout.getChildAt(2).isLayoutRequested());
try {
tableLayout.addView(new ListView(mContext), Integer.MAX_VALUE,
new TableLayout.LayoutParams(200, 300));
fail("Should throw IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException e) {
}
try {
tableLayout.addView(null, -1, new TableLayout.LayoutParams(200, 300));
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
try {
tableLayout.addView(new ListView(mContext), -1, null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test generateLayoutParams(AttributeSet attrs)",
method = "generateLayoutParams",
args = {android.util.AttributeSet.class}
)
public void testGenerateLayoutParams1() {
TableLayout tableLayout = new TableLayout(mContext);
TableStubActivity activity = getActivity();
XmlResourceParser parser = activity.getResources().getLayout(R.layout.table_layout_1);
AttributeSet attr = Xml.asAttributeSet(parser);
assertNotNull(tableLayout.generateLayoutParams(attr));
assertNotNull(tableLayout.generateLayoutParams((AttributeSet) null));
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test checkLayoutParams(ViewGroup.LayoutParams p)",
method = "checkLayoutParams",
args = {android.view.ViewGroup.LayoutParams.class}
)
public void testCheckLayoutParams() {
MockTableLayout mockTableLayout = new MockTableLayout(mContext);
assertTrue(mockTableLayout.checkLayoutParams(new TableLayout.LayoutParams(200, 300)));
assertFalse(mockTableLayout.checkLayoutParams(new ViewGroup.LayoutParams(200, 300)));
assertFalse(mockTableLayout.checkLayoutParams(new RelativeLayout.LayoutParams(200, 300)));
assertFalse(mockTableLayout.checkLayoutParams(null));
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test generateDefaultLayoutParams()",
method = "generateDefaultLayoutParams",
args = {}
)
public void testGenerateDefaultLayoutParams() {
MockTableLayout mockTableLayout = new MockTableLayout(mContext);
LinearLayout.LayoutParams layoutParams = mockTableLayout.generateDefaultLayoutParams();
assertNotNull(layoutParams);
assertTrue(layoutParams instanceof TableLayout.LayoutParams);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test generateLayoutParams(ViewGroup.LayoutParams p)",
method = "generateLayoutParams",
args = {android.view.ViewGroup.LayoutParams.class}
)
@ToBeFixed( bug = "1417734", explanation = "NullPointerException issue")
public void testGenerateLayoutParams2() {
MockTableLayout mockTableLayout = new MockTableLayout(mContext);
LinearLayout.LayoutParams layoutParams = mockTableLayout.generateLayoutParams(
new ViewGroup.LayoutParams(200, 300));
assertNotNull(layoutParams);
assertEquals(200, layoutParams.width);
assertEquals(300, layoutParams.height);
assertTrue(layoutParams instanceof TableLayout.LayoutParams);
try {
layoutParams = mockTableLayout.generateLayoutParams((ViewGroup.LayoutParams) null);
fail("Should throw NullPointerException");
} catch (NullPointerException e) {
}
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test onLayout(boolean changed, int l, int t, int r, int b)",
method = "onLayout",
args = {boolean.class, int.class, int.class, int.class, int.class}
)
@ToBeFixed( bug = "1400249", explanation = "hard to do unit test," +
" will be tested by functional test.")
public void testOnLayout() {
MockTableLayout mockTableLayout = new MockTableLayout(mContext);
mockTableLayout.onLayout(false, 0, 0, 20, 20);
}
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test onMeasure(int widthMeasureSpec, int heightMeasureSpec)",
method = "onMeasure",
args = {int.class, int.class}
)
@ToBeFixed( bug = "1400249", explanation = "hard to do unit test," +
" will be tested by functional test.")
public void testOnMeasure() {
MockTableLayout mockTableLayout = new MockTableLayout(mContext);
mockTableLayout.onMeasure(MeasureSpec.EXACTLY, MeasureSpec.EXACTLY);
}
private int dropNegative(int number) {
return (number > 0 ? number : 0);
}
private class MockOnHierarchyChangeListener implements OnHierarchyChangeListener {
private boolean mCalledOnChildViewAdded = false;
private boolean mCalledOnChildViewRemoved = false;
/*
* (non-Javadoc)
*
* @see
* android.view.ViewGroup.OnHierarchyChangeListener#onChildViewAdded
* (View, View)
*/
public void onChildViewAdded(View parent, View child) {
mCalledOnChildViewAdded = true;
}
/*
* (non-Javadoc)
*
* @see
* android.view.ViewGroup.OnHierarchyChangeListener#onChildViewRemoved
* (View, View)
*/
public void onChildViewRemoved(View parent, View child) {
mCalledOnChildViewRemoved = true;
}
public boolean hasCalledOnChildViewAdded() {
return mCalledOnChildViewAdded;
}
public boolean hasCalledOnChildViewRemoved() {
return mCalledOnChildViewRemoved;
}
public void reset() {
mCalledOnChildViewAdded = false;
mCalledOnChildViewRemoved = false;
}
}
/*
* Mock class for TableLayout to test protected methods
*/
private class MockTableLayout extends TableLayout {
public MockTableLayout(Context context) {
super(context);
}
@Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return super.checkLayoutParams(p);
}
@Override
protected LinearLayout.LayoutParams generateDefaultLayoutParams() {
return super.generateDefaultLayoutParams();
}
@Override
protected LinearLayout.LayoutParams generateLayoutParams(
ViewGroup.LayoutParams p) {
return super.generateLayoutParams(p);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
}