2 <head><script src="../../../resources/js-test.js"></script></head>
7 description('This tests expected behaviour when modifying variables in a CSSVariablesMap during a forEach() loop.');
9 // Test adding variable in forEach: pass
10 // Test deleting in forEach: pass
11 // Test clearing in forEach: pass
12 // Test adding then deleting in forEach: pass
13 // Test adding then clearing in forEach: pass
14 // Test deleting then adding in forEach: pass
15 // Test clearing then adding in forEach: pass
16 // Test updating visited variable in forEach: pass
19 var div = document.querySelector('#test');
22 function logIteration(name, value, nested)
25 log.push('Nested iteration (var-' + name + ': ' + value + ')');
27 log.push('Iteration (var-' + name + ': ' + value + ')');
30 debug('\nTest adding variable in forEach() over "var-existing: pass;"');
32 div.style.var.set('existing', 'pass');
33 div.style.var.forEach(function(value, name, varMap) {
34 logIteration(name, value);
35 if (name === 'existing') {
36 log.push('Add variable (var-added: pass)');
37 varMap.set('added', 'pass');
40 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
41 shouldBeEqualToString('log[1]', 'Add variable (var-added: pass)');
42 shouldBeEqualToString('log[2]', 'Iteration (var-added: pass)');
43 shouldBe('log.length', '3');
45 debug('\nTest deleting variable in forEach() over "var-existing: pass; var-to-delete: fail;"');
46 div.style.var.clear();
47 div.style.var.set('existing', 'pass');
48 div.style.var.set('to-delete', 'fail');
50 div.style.var.forEach(function(value, name, varMap) {
51 logIteration(name, value);
52 if (name === 'existing') {
53 log.push('Delete variable (var-to-delete)');
54 varMap.delete('to-delete');
57 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
58 shouldBeEqualToString('log[1]', 'Delete variable (var-to-delete)');
59 shouldBe('log.length', '2');
61 debug('\nTest clearing variables in forEach() over "var-existing: pass; var-to-clear: fail;"');
62 div.style.var.clear();
63 div.style.var.set('existing', 'pass');
64 div.style.var.set('to-clear', 'fail');
66 div.style.var.forEach(function(value, name, varMap) {
67 logIteration(name, value);
68 if (name === 'existing') {
69 log.push('Clear variables');
73 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
74 shouldBeEqualToString('log[1]', 'Clear variables');
75 shouldBe('log.length', '2');
77 debug('\nTest adding then deleting in forEach() over "var-existing: pass;"');
78 div.style.var.clear();
79 div.style.var.set('existing', 'pass');
81 div.style.var.forEach(function(value, name, varMap) {
82 logIteration(name, value);
83 if (name === 'existing') {
84 log.push('Add variable (var-to-delete: fail)');
85 varMap.set('to-delete', 'fail');
86 log.push('Delete variable (var-to-delete)');
87 varMap.delete('to-delete');
90 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
91 shouldBeEqualToString('log[1]', 'Add variable (var-to-delete: fail)');
92 shouldBeEqualToString('log[2]', 'Delete variable (var-to-delete)');
93 shouldBe('log.length', '3');
95 debug('\nTest adding then clearing in forEach() over "var-existing: pass;"');
96 div.style.var.clear();
97 div.style.var.set('existing', 'pass');
99 div.style.var.forEach(function(value, name, varMap) {
100 logIteration(name, value);
101 if (name === 'existing') {
102 log.push('Add variable (var-to-clear: fail)');
103 varMap.set('to-clear', 'fail');
104 log.push('Clear variables (var-to-clear)');
105 varMap.clear('to-clear');
108 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
109 shouldBeEqualToString('log[1]', 'Add variable (var-to-clear: fail)');
110 shouldBeEqualToString('log[2]', 'Clear variables (var-to-clear)');
111 shouldBe('log.length', '3');
113 debug('\nTest deleting then adding in forEach() over "var-existing: pass; var-to-delete: fail;"');
114 div.style.var.clear();
115 div.style.var.set('existing', 'pass');
116 div.style.var.set('to-delete', 'fail');
118 div.style.var.forEach(function(value, name, varMap) {
119 logIteration(name, value);
120 if (name === 'existing') {
121 log.push('Delete variable (var-to-delete)');
122 varMap.delete('to-delete');
123 log.push('Add variable (var-added: pass)');
124 varMap.set('added', 'pass');
127 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
128 shouldBeEqualToString('log[1]', 'Delete variable (var-to-delete)');
129 shouldBeEqualToString('log[2]', 'Add variable (var-added: pass)');
130 shouldBeEqualToString('log[3]', 'Iteration (var-added: pass)');
131 shouldBe('log.length', '4');
133 debug('\nTest clearing then adding in forEach() over "var-existing: pass; var-to-clear: fail;"');
134 div.style.var.clear();
135 div.style.var.set('existing', 'pass');
136 div.style.var.set('to-clear', 'fail');
138 div.style.var.forEach(function(value, name, varMap) {
139 logIteration(name, value);
140 if (name === 'existing') {
141 log.push('Clear variables');
143 log.push('Add variable (var-added: pass)');
144 varMap.set('added', 'pass');
147 shouldBeEqualToString('log[0]', 'Iteration (var-existing: pass)');
148 shouldBeEqualToString('log[1]', 'Clear variables');
149 shouldBeEqualToString('log[2]', 'Add variable (var-added: pass)');
150 shouldBeEqualToString('log[3]', 'Iteration (var-added: pass)');
151 shouldBe('log.length', '4');
153 debug('\nTest updating visited variable in forEach() over "var-existing-a: pass; var-existing-b: pass;"');
154 div.style.var.clear();
155 div.style.var.set('existing-a', 'pass');
156 div.style.var.set('existing-b', 'pass');
158 div.style.var.forEach(function(value, name, varMap) {
159 logIteration(name, value);
160 if (name === 'existing-b') {
161 log.push('Set variable (var-existing-a: fail)');
162 varMap.set('existing-a', 'fail');
165 shouldBeEqualToString('log[0]', 'Iteration (var-existing-a: pass)');
166 shouldBeEqualToString('log[1]', 'Iteration (var-existing-b: pass)');
167 shouldBeEqualToString('log[2]', 'Set variable (var-existing-a: fail)');
168 shouldBe('log.length', '3');
170 debug('\nTest nested forEach calls with addition and deletion() over "var-existing-a: pass; var-existing-b: pass;"');
171 div.style.var.clear();
172 div.style.var.set('existing-a', 'pass');
173 div.style.var.set('existing-b', 'pass');
175 div.style.var.forEach(function(value, name, varMap) {
176 logIteration(name, value);
177 log.push('Call forEach()');
178 varMap.forEach(function(innerValue, innerName) {
179 logIteration(innerName, innerValue, true);
180 if (name === 'existing-a' && innerName === 'existing-b') {
181 log.push('Delete variable (var-existing-b)');
182 varMap.delete('existing-b');
183 log.push('Add variable (var-inner-added: pass)');
184 varMap.set('inner-added', 'pass');
188 shouldBeEqualToString('log[0]', 'Iteration (var-existing-a: pass)');
189 shouldBeEqualToString('log[1]', 'Call forEach()');
190 shouldBeEqualToString('log[2]', 'Nested iteration (var-existing-a: pass)');
191 shouldBeEqualToString('log[3]', 'Nested iteration (var-existing-b: pass)');
192 shouldBeEqualToString('log[4]', 'Delete variable (var-existing-b)');
193 shouldBeEqualToString('log[5]', 'Add variable (var-inner-added: pass)');
194 shouldBeEqualToString('log[6]', 'Nested iteration (var-inner-added: pass)');
195 shouldBeEqualToString('log[7]', 'Iteration (var-inner-added: pass)');
196 shouldBeEqualToString('log[8]', 'Call forEach()');
197 shouldBeEqualToString('log[9]', 'Nested iteration (var-existing-a: pass)');
198 shouldBeEqualToString('log[10]', 'Nested iteration (var-inner-added: pass)');
199 shouldBe('log.length', '11');