Serenity Operating System
1describe("HTMLTableElement", () => {
2 loadLocalPage("Table.html");
3
4 afterInitialPageLoad(page => {
5 test("empty table attributes", () => {
6 let table = page.document.getElementById("empty-table");
7 expect(table).not.toBeNull();
8
9 expect(table.caption).toBe(null);
10 expect(table.tHead).toBe(null);
11 expect(table.tFoot).toBe(null);
12
13 expect(table.tBodies).toHaveLength(0);
14 expect(table.rows).toHaveLength(0);
15 });
16
17 test("full table attributes", () => {
18 let table = page.document.getElementById("full-table");
19 expect(table).not.toBeNull();
20
21 expect(table.caption.nodeName).toBe("CAPTION");
22 expect(table.tHead.nodeName).toBe("THEAD");
23 expect(table.tFoot.nodeName).toBe("TFOOT");
24
25 expect(table.tBodies.length).toBe(1);
26 expect(table.rows.length).toBe(3);
27 });
28
29 test("create/delete caption", () => {
30 let table = page.document.createElement("table");
31 expect(table).not.toBeNull();
32
33 expect(table.caption).toBeNull();
34 table.createCaption();
35 expect(table.caption).not.toBeNull();
36 table.deleteCaption();
37 expect(table.caption).toBeNull();
38 });
39
40 test("create/delete thead", () => {
41 let table = page.document.createElement("table");
42 expect(table).not.toBeNull();
43
44 expect(table.tHead).toBeNull();
45 table.createTHead();
46 expect(table.tHead).not.toBeNull();
47 table.deleteTHead();
48 expect(table.tHead).toBeNull();
49 });
50
51 test("create/delete tfoot", () => {
52 let table = page.document.createElement("table");
53 expect(table).not.toBeNull();
54
55 expect(table.tFoot).toBeNull();
56 table.createTFoot();
57 expect(table.tFoot).not.toBeNull();
58 table.deleteTFoot();
59 expect(table.tFoot).toBeNull();
60 });
61
62 test("insert rows", () => {
63 let table = page.document.createElement("table");
64 expect(table).not.toBeNull();
65
66 // We hardcode the default value in a few places, due to the BindingsGenerator's bug with default values
67 const defaultValue = -1;
68
69 expect(table.rows.length).toBe(0);
70
71 // insertRow with an index > number of rows will throw
72 expect(() => {
73 table.insertRow(1);
74 }).toThrow();
75
76 // Inserting a row into an empty table will create a <tbody> and <tr>
77 let rowFirst = table.insertRow(defaultValue);
78 rowFirst.innerText = "row_first";
79 expect(table.firstElementChild.nodeName).toBe("TBODY");
80 expect(table.firstElementChild.firstElementChild.nodeName).toBe("TR");
81 expect(table.firstElementChild.firstElementChild.innerText).toBe("row_first");
82
83 for (let i = 0; i < 10; i++) {
84 let row = table.insertRow(defaultValue);
85 row.innerText = "row" + i;
86 }
87 expect(table.rows.length).toBe(11);
88
89 // insertRow with the default value
90 let rowDefault = table.insertRow(defaultValue);
91 rowDefault.innerText = "row_default";
92 expect(table.rows[table.rows.length - 1].innerText).toBe("row_default");
93 });
94
95 test("delete rows", () => {
96 let table = page.document.createElement("table");
97 expect(table).not.toBeNull();
98
99 // We hardcode the default value in a few places, due to the BindingsGenerator's bug with default values
100 const defaultValue = -1;
101
102 // deleteRow with an index > number of rows will throw
103 expect(table.deleteRow).toThrow();
104
105 for (let i = 0; i < 10; i++) {
106 let row = table.insertRow(defaultValue);
107 row.innerText = "row" + i;
108 }
109 // deleteRow with with no argument will delete the last row
110 expect(table.rows[table.rows.length - 1].innerText).toBe("row9");
111 table.deleteRow(defaultValue);
112 expect(table.rows[table.rows.length - 1].innerText).toBe("row8");
113
114 // We can delete a row with a specific index
115 expect(table.rows[5].innerText).toBe("row5");
116 table.deleteRow(5);
117 expect(table.rows[5].innerText).toBe("row6");
118 });
119 });
120 waitForPageToLoad();
121});