Index: third_party/WebKit/Source/core/layout/LayoutTableTest.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableTest.cpp b/third_party/WebKit/Source/core/layout/LayoutTableTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f51be73df11df0a0c46af0553d8d4a6e5fc50e8c |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableTest.cpp |
@@ -0,0 +1,239 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "core/layout/LayoutTable.h" |
+ |
+#include "core/layout/LayoutTableCol.h" |
+#include "core/layout/LayoutTestHelper.h" |
+ |
+namespace blink { |
+ |
+namespace { |
+ |
+class LayoutTableTest : public RenderingTest { |
+ protected: |
+ LayoutTable* GetTableByElementId(const char* id) { |
+ return ToLayoutTable(GetLayoutObjectByElementId(id)); |
+ } |
+}; |
+ |
+TEST_F(LayoutTableTest, EffectiveColumnAndAbsoluteColumn) { |
+ SetBodyInnerHTML( |
+ "<table id ='table'>" |
+ " <tr><td colspan='5'></td></tr>" |
+ " <tr><td colspan='3'></td><td colspan=5'></td></tr>" |
+ " <tr><td></td></tr>" |
+ "</table>"); |
+ |
+ auto* table = GetTableByElementId("table"); |
+ EXPECT_EQ(4u, table->NumEffectiveColumns()); |
+ |
+ EXPECT_EQ(0u, table->EffectiveColumnToAbsoluteColumn(0)); |
+ EXPECT_EQ(1u, table->EffectiveColumnToAbsoluteColumn(1)); |
+ EXPECT_EQ(3u, table->EffectiveColumnToAbsoluteColumn(2)); |
+ EXPECT_EQ(5u, table->EffectiveColumnToAbsoluteColumn(3)); |
+ EXPECT_EQ(8u, table->EffectiveColumnToAbsoluteColumn(4)); |
+ |
+ EXPECT_EQ(0u, table->AbsoluteColumnToEffectiveColumn(0)); |
+ EXPECT_EQ(1u, table->AbsoluteColumnToEffectiveColumn(1)); |
+ EXPECT_EQ(1u, table->AbsoluteColumnToEffectiveColumn(2)); |
+ EXPECT_EQ(2u, table->AbsoluteColumnToEffectiveColumn(3)); |
+ EXPECT_EQ(2u, table->AbsoluteColumnToEffectiveColumn(4)); |
+ EXPECT_EQ(3u, table->AbsoluteColumnToEffectiveColumn(5)); |
+ EXPECT_EQ(3u, table->AbsoluteColumnToEffectiveColumn(6)); |
+ EXPECT_EQ(3u, table->AbsoluteColumnToEffectiveColumn(7)); |
+ EXPECT_EQ(4u, table->AbsoluteColumnToEffectiveColumn(8)); |
+} |
+ |
+TEST_F(LayoutTableTest, EffectiveColumnAndAbsoluteColumnWithCols) { |
+ SetBodyInnerHTML( |
+ "<table id ='table'>" |
+ " <colgroup>" |
+ " <col>" |
+ " <col span='3'>" |
+ " <col span='2'>" |
+ " </colgroup>" |
+ " <tr>" |
+ " <td></td>" |
+ " <td colspan='2'></td>" |
+ " <td></td>" |
+ " <td colspan='2'></td>" |
+ " </tr>" |
+ "</table>"); |
+ |
+ auto* table = GetTableByElementId("table"); |
+ EXPECT_EQ(4u, table->NumEffectiveColumns()); |
+ |
+ EXPECT_EQ(0u, table->EffectiveColumnToAbsoluteColumn(0)); |
+ EXPECT_EQ(1u, table->EffectiveColumnToAbsoluteColumn(1)); |
+ EXPECT_EQ(3u, table->EffectiveColumnToAbsoluteColumn(2)); |
+ EXPECT_EQ(4u, table->EffectiveColumnToAbsoluteColumn(3)); |
+ EXPECT_EQ(6u, table->EffectiveColumnToAbsoluteColumn(4)); |
+ |
+ EXPECT_EQ(0u, table->AbsoluteColumnToEffectiveColumn(0)); |
+ EXPECT_EQ(1u, table->AbsoluteColumnToEffectiveColumn(1)); |
+ EXPECT_EQ(1u, table->AbsoluteColumnToEffectiveColumn(2)); |
+ EXPECT_EQ(2u, table->AbsoluteColumnToEffectiveColumn(3)); |
+ EXPECT_EQ(3u, table->AbsoluteColumnToEffectiveColumn(4)); |
+ EXPECT_EQ(3u, table->AbsoluteColumnToEffectiveColumn(5)); |
+ EXPECT_EQ(4u, table->AbsoluteColumnToEffectiveColumn(6)); |
+} |
+ |
+TEST_F(LayoutTableTest, ColAndColGroupAtEffectiveColumn) { |
+ SetBodyInnerHTML( |
+ "<table id ='table'>" |
+ " <colgroup id='colgroup1'>" |
+ " <col id='col1a'>" |
+ " <col id='col1b'>" |
+ " </colgroup>" |
+ " <colgroup id='colgroup2'>" |
+ " <col id='col2' span='2'>" |
+ " </colgroup>" |
+ " <colgroup id='colgroup3' span='2'></colgroup>" |
+ " <colgroup id='colgroup4' span='2'></colgroup>" |
+ " <col id='col5' span='2'>" |
+ " <tr>" |
+ " <td colspan='2'></td>" // spans col1a and col1b |
+ " <td></td><td></td>" // split col2 into two effective columns |
+ " <td colspan=2'></td>" // matches col3 |
+ " <td colspan=3'></td>" // matches start but not end of col4 |
+ " <td></td>" // matches end but not start of col5 |
+ " </tr>" |
+ "</table>"); |
+ // absolute | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
+ // effective | 0 | 1 | 2 | 3 | 4 | 5 | |
+ // colgroup | 1 | 2 | 3 | 4 | | |
+ // col | a | b | 2 | | | 5 | |
+ // td | | | | | | | |
+ |
+ auto* table = GetTableByElementId("table"); |
+ EXPECT_EQ(6u, table->NumEffectiveColumns()); |
+ |
+ auto c0 = table->ColAndColGroupAtEffectiveColumn(0); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup1"), c0.colgroup); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col1a"), c0.col); |
+ EXPECT_EQ(c0.col, c0.InnermostColOrColGroup()); |
+ EXPECT_TRUE(c0.adjoins_start_border_of_col_group); |
+ EXPECT_TRUE(c0.adjoins_end_border_of_col_group); |
+ |
+ auto c1 = table->ColAndColGroupAtEffectiveColumn(1); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup2"), c1.colgroup); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col2"), c1.col); |
+ EXPECT_EQ(c1.col, c1.InnermostColOrColGroup()); |
+ EXPECT_TRUE(c1.adjoins_start_border_of_col_group); |
+ EXPECT_FALSE(c1.adjoins_end_border_of_col_group); |
+ |
+ auto c2 = table->ColAndColGroupAtEffectiveColumn(2); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup2"), c2.colgroup); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col2"), c2.col); |
+ EXPECT_EQ(c2.col, c2.InnermostColOrColGroup()); |
+ EXPECT_FALSE(c2.adjoins_start_border_of_col_group); |
+ EXPECT_TRUE(c2.adjoins_end_border_of_col_group); |
+ |
+ auto c3 = table->ColAndColGroupAtEffectiveColumn(3); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup3"), c3.colgroup); |
+ EXPECT_EQ(nullptr, c3.col); |
+ EXPECT_EQ(c3.colgroup, c3.InnermostColOrColGroup()); |
+ EXPECT_TRUE(c3.adjoins_start_border_of_col_group); |
+ EXPECT_TRUE(c3.adjoins_end_border_of_col_group); |
+ |
+ auto c4 = table->ColAndColGroupAtEffectiveColumn(4); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup4"), c4.colgroup); |
+ EXPECT_EQ(nullptr, c4.col); |
+ EXPECT_EQ(c4.colgroup, c4.InnermostColOrColGroup()); |
+ EXPECT_TRUE(c4.adjoins_start_border_of_col_group); |
+ EXPECT_FALSE(c4.adjoins_end_border_of_col_group); |
+ |
+ auto c5 = table->ColAndColGroupAtEffectiveColumn(5); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col5")->Parent(), c5.colgroup); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col5"), c5.col); |
+ EXPECT_EQ(c5.col, c5.InnermostColOrColGroup()); |
+ EXPECT_FALSE(c5.adjoins_start_border_of_col_group); |
+ EXPECT_TRUE(c5.adjoins_end_border_of_col_group); |
+ |
+ // Beyond the end of columns. |
+ auto c6 = table->ColAndColGroupAtEffectiveColumn(6); |
+ EXPECT_EQ(nullptr, c6.colgroup); |
+ EXPECT_EQ(nullptr, c6.col); |
+ EXPECT_EQ(nullptr, c6.InnermostColOrColGroup()); |
+ EXPECT_FALSE(c6.adjoins_start_border_of_col_group); |
+ EXPECT_FALSE(c6.adjoins_end_border_of_col_group); |
+} |
+ |
+TEST_F(LayoutTableTest, ColAndColGroupAtEffectiveColumnSingleEffectiveColumn) { |
+ SetBodyInnerHTML( |
+ "<table id ='table'>" |
+ " <colgroup id='colgroup'>" |
+ " <col id='col'>" |
+ " <col span='2'>" |
+ " <col span='3'>" |
+ " </colgroup>" |
+ " <tr>" |
+ " <td colspan='6'></td>" |
+ " </tr>" |
+ "</table>"); |
+ // absolute | 0 | 1 | 2 | 3 | 4 | 5 | |
+ // effective | 0 | |
+ // colgroup | | |
+ // col | | | | |
+ // td | | |
+ |
+ auto* table = GetTableByElementId("table"); |
+ EXPECT_EQ(1u, table->NumEffectiveColumns()); |
+ |
+ auto c0 = table->ColAndColGroupAtEffectiveColumn(0); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup"), c0.colgroup); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col"), c0.col); |
+ EXPECT_EQ(c0.col, c0.InnermostColOrColGroup()); |
+ EXPECT_TRUE(c0.adjoins_start_border_of_col_group); |
+ EXPECT_TRUE(c0.adjoins_end_border_of_col_group); |
+ |
+ auto c1 = table->ColAndColGroupAtEffectiveColumn(1); |
+ EXPECT_EQ(nullptr, c1.colgroup); |
+ EXPECT_EQ(nullptr, c1.col); |
+ EXPECT_EQ(nullptr, c1.InnermostColOrColGroup()); |
+ EXPECT_FALSE(c1.adjoins_start_border_of_col_group); |
+ EXPECT_FALSE(c1.adjoins_end_border_of_col_group); |
+} |
+ |
+TEST_F(LayoutTableTest, |
+ ColAndColGroupAtEffectiveColumnSingleEffectiveColumnUnmatchedEnd) { |
+ SetBodyInnerHTML( |
+ "<table id ='table'>" |
+ " <colgroup id='colgroup'>" |
+ " <col id='col'>" |
+ " <col span='2'>" |
+ " <col span='3'>" |
+ " </colgroup>" |
+ " <tr>" |
+ " <td colspan='5'></td>" |
+ " </tr>" |
+ "</table>"); |
+ // absolute | 0 | 1 | 2 | 3 | 4 | |
+ // effective | 0 | |
+ // colgroup | | |
+ // col | | | | |
+ // td | | |
+ |
+ auto* table = GetTableByElementId("table"); |
+ EXPECT_EQ(1u, table->NumEffectiveColumns()); |
+ |
+ auto c0 = table->ColAndColGroupAtEffectiveColumn(0); |
+ EXPECT_EQ(GetLayoutObjectByElementId("colgroup"), c0.colgroup); |
+ EXPECT_EQ(GetLayoutObjectByElementId("col"), c0.col); |
+ EXPECT_EQ(c0.col, c0.InnermostColOrColGroup()); |
+ EXPECT_TRUE(c0.adjoins_start_border_of_col_group); |
+ EXPECT_FALSE(c0.adjoins_end_border_of_col_group); |
+ |
+ auto c1 = table->ColAndColGroupAtEffectiveColumn(1); |
+ EXPECT_EQ(nullptr, c1.colgroup); |
+ EXPECT_EQ(nullptr, c1.col); |
+ EXPECT_EQ(nullptr, c1.InnermostColOrColGroup()); |
+ EXPECT_FALSE(c1.adjoins_start_border_of_col_group); |
+ EXPECT_FALSE(c1.adjoins_end_border_of_col_group); |
+} |
+ |
+} // anonymous namespace |
+ |
+} // namespace blink |