1 # -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 # tests for tracked changes ; tdf912270
8 from uitest
.framework
import UITestCase
9 from libreoffice
.calc
.document
import get_cell_by_position
10 from libreoffice
.uno
.propertyvalue
import mkPropertyValues
11 from uitest
.uihelper
.calc
import enter_text_to_cell
12 from uitest
.uihelper
.common
import get_state_as_dict
14 import org
.libreoffice
.unotest
17 def get_url_for_data_file(file_name
):
18 return pathlib
.Path(org
.libreoffice
.unotest
.makeCopyFromTDOC(file_name
)).as_uri()
20 class CalcTrackedChanges(UITestCase
):
22 def test_tdf131907(self
):
23 calc_doc
= self
.ui_test
.load_file(get_url_for_data_file("tdf131907.ods"))
24 xCalcDoc
= self
.xUITest
.getTopFocusWindow()
25 self
.ui_test
.execute_modeless_dialog_through_command(".uno:AcceptChanges")
26 xTrackDlg
= self
.xUITest
.getTopFocusWindow()
28 xChangesList
= xTrackDlg
.getChild("calcchanges")
29 self
.assertEqual(1, len(xChangesList
.getChildren()))
31 textStart
= "Row inserted \tSheet1.1:1\t \t"
32 textEnd
= "(Row 1:1 inserted)"
33 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart
))
34 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd
))
37 xRejBtn
= xTrackDlg
.getChild("reject")
38 xRejBtn
.executeAction("CLICK", tuple())
40 self
.assertEqual(2, len(xChangesList
.getChildren()))
41 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('0'))["Text"], "Accepted")
42 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('1'))["Text"], "Rejected")
44 xCancBtn
= xTrackDlg
.getChild("close")
45 xCancBtn
.executeAction("CLICK", tuple())
47 self
.ui_test
.close_doc()
49 def test_tdf66263_Protect_Records(self
):
50 calc_doc
= self
.ui_test
.create_doc_in_start_center("calc")
51 xCalcDoc
= self
.xUITest
.getTopFocusWindow()
52 gridwin
= xCalcDoc
.getChild("grid_window")
53 document
= self
.ui_test
.get_component()
54 self
.xUITest
.executeCommand(".uno:TraceChangeMode")
56 self
.ui_test
.execute_dialog_through_command(".uno:ProtectTraceChangeMode")
57 xDialog
= self
.xUITest
.getTopFocusWindow()
58 xpass
= xDialog
.getChild("pass1ed")
59 xpass
.executeAction("TYPE", mkPropertyValues({"TEXT":"a"}))
60 xconfirm
= xDialog
.getChild("confirm1ed")
61 xconfirm
.executeAction("TYPE", mkPropertyValues({"TEXT":"a"}))
62 xOkBtn
= xDialog
.getChild("ok")
63 xOkBtn
.executeAction("CLICK", tuple())
65 self
.ui_test
.execute_dialog_through_command(".uno:ProtectTraceChangeMode")
66 xDialog
= self
.xUITest
.getTopFocusWindow()
67 xpass
= xDialog
.getChild("pass1ed")
68 xpass
.executeAction("TYPE", mkPropertyValues({"TEXT":"a"}))
69 xOkBtn
= xDialog
.getChild("ok")
70 xOkBtn
.executeAction("CLICK", tuple())
72 self
.ui_test
.close_doc()
74 def test_tracked_changes_accept(self
):
76 calc_doc
= self
.ui_test
.create_doc_in_start_center("calc")
77 xCalcDoc
= self
.xUITest
.getTopFocusWindow()
78 gridwin
= xCalcDoc
.getChild("grid_window")
79 document
= self
.ui_test
.get_component()
80 #track changes; enter text to cell
81 self
.xUITest
.executeCommand(".uno:TraceChangeMode")
82 enter_text_to_cell(gridwin
, "A1", "Test LibreOffice")
83 enter_text_to_cell(gridwin
, "A2", "Test LibreOffice")
84 #accept tracked changes
85 self
.ui_test
.execute_modeless_dialog_through_command(".uno:AcceptChanges")
86 xTrackDlg
= self
.xUITest
.getTopFocusWindow()
88 xChangesList
= xTrackDlg
.getChild("calcchanges")
89 self
.assertEqual(2, len(xChangesList
.getChildren()))
91 textStart
= "Changed contents\tSheet1.A1\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
92 textEnd
= "(Cell A1 changed from '<empty>' to 'Test LibreOffice')"
93 textStart2
= "Changed contents\tSheet1.A2\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
94 textEnd2
= "(Cell A2 changed from '<empty>' to 'Test LibreOffice')"
95 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart
))
96 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd
))
97 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].startswith(textStart2
))
98 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].endswith(textEnd2
))
100 xAccBtn
= xTrackDlg
.getChild("accept")
101 xAccBtn
.executeAction("CLICK", tuple())
103 self
.assertEqual(2, len(xChangesList
.getChildren()))
104 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart2
))
105 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd2
))
106 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('1'))["Text"], "Accepted")
108 xAccBtn
= xTrackDlg
.getChild("accept")
109 xAccBtn
.executeAction("CLICK", tuple())
111 self
.assertEqual(1, len(xChangesList
.getChildren()))
112 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('0'))["Text"], "Accepted")
113 xChangesList
.getChild('0').executeAction("EXPAND", tuple())
115 self
.assertEqual(2, len(xChangesList
.getChild('0').getChildren()))
117 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].startswith(textStart
))
118 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].endswith(textEnd
))
119 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].startswith(textStart2
))
120 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].endswith(textEnd2
))
122 xCancBtn
= xTrackDlg
.getChild("close")
123 xCancBtn
.executeAction("CLICK", tuple())
125 self
.assertEqual(get_cell_by_position(document
, 0, 0, 0).getString(), "Test LibreOffice")
126 self
.ui_test
.close_doc()
128 def test_tracked_changes_acceptall(self
):
130 calc_doc
= self
.ui_test
.create_doc_in_start_center("calc")
131 xCalcDoc
= self
.xUITest
.getTopFocusWindow()
132 gridwin
= xCalcDoc
.getChild("grid_window")
133 document
= self
.ui_test
.get_component()
134 #track changes; enter text to cell
135 self
.xUITest
.executeCommand(".uno:TraceChangeMode")
136 enter_text_to_cell(gridwin
, "A1", "Test LibreOffice")
137 enter_text_to_cell(gridwin
, "A2", "Test LibreOffice")
138 #accept All tracked changes
139 self
.ui_test
.execute_modeless_dialog_through_command(".uno:AcceptChanges")
140 xTrackDlg
= self
.xUITest
.getTopFocusWindow()
142 xChangesList
= xTrackDlg
.getChild("calcchanges")
143 self
.assertEqual(2, len(xChangesList
.getChildren()))
145 textStart
= "Changed contents\tSheet1.A1\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
146 textEnd
= "(Cell A1 changed from '<empty>' to 'Test LibreOffice')"
147 textStart2
= "Changed contents\tSheet1.A2\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
148 textEnd2
= "(Cell A2 changed from '<empty>' to 'Test LibreOffice')"
149 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart
))
150 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd
))
151 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].startswith(textStart2
))
152 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].endswith(textEnd2
))
154 xAccBtn
= xTrackDlg
.getChild("acceptall")
155 xAccBtn
.executeAction("CLICK", tuple())
157 self
.assertEqual(1, len(xChangesList
.getChildren()))
158 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('0'))["Text"], "Accepted")
159 xChangesList
.getChild('0').executeAction("EXPAND", tuple())
161 self
.assertEqual(2, len(xChangesList
.getChild('0').getChildren()))
163 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].startswith(textStart
))
164 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].endswith(textEnd
))
165 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].startswith(textStart2
))
166 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].endswith(textEnd2
))
168 xCancBtn
= xTrackDlg
.getChild("close")
169 xCancBtn
.executeAction("CLICK", tuple())
171 self
.assertEqual(get_cell_by_position(document
, 0, 0, 0).getString(), "Test LibreOffice")
172 self
.ui_test
.close_doc()
174 def test_tracked_changes_reject(self
):
176 calc_doc
= self
.ui_test
.create_doc_in_start_center("calc")
177 xCalcDoc
= self
.xUITest
.getTopFocusWindow()
178 gridwin
= xCalcDoc
.getChild("grid_window")
179 document
= self
.ui_test
.get_component()
180 #track changes; enter text to cell
181 self
.xUITest
.executeCommand(".uno:TraceChangeMode")
182 enter_text_to_cell(gridwin
, "A1", "Test LibreOffice")
183 enter_text_to_cell(gridwin
, "A2", "Test LibreOffice")
184 #accept tracked changes
185 self
.ui_test
.execute_modeless_dialog_through_command(".uno:AcceptChanges")
186 xTrackDlg
= self
.xUITest
.getTopFocusWindow()
188 xChangesList
= xTrackDlg
.getChild("calcchanges")
189 self
.assertEqual(2, len(xChangesList
.getChildren()))
191 textStart
= "Changed contents\tSheet1.A1\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
192 textEnd
= "(Cell A1 changed from '<empty>' to 'Test LibreOffice')"
193 textStart2
= "Changed contents\tSheet1.A2\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
194 textEnd2
= "(Cell A2 changed from '<empty>' to 'Test LibreOffice')"
195 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart
))
196 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd
))
197 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].startswith(textStart2
))
198 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].endswith(textEnd2
))
200 xRejBtn
= xTrackDlg
.getChild("reject")
201 xRejBtn
.executeAction("CLICK", tuple())
203 self
.assertEqual(3, len(xChangesList
.getChildren()))
204 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart2
))
205 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd2
))
206 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('1'))["Text"], "Accepted")
207 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('2'))["Text"], "Rejected")
209 xAccBtn
= xTrackDlg
.getChild("reject")
210 xAccBtn
.executeAction("CLICK", tuple())
212 self
.assertEqual(2, len(xChangesList
.getChildren()))
213 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('0'))["Text"], "Accepted")
214 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('1'))["Text"], "Rejected")
216 xChangesList
.getChild('0').executeAction("EXPAND", tuple())
217 self
.assertEqual(2, len(xChangesList
.getChild('0').getChildren()))
219 textEnd3
= "(Cell A1 changed from 'Test LibreOffice' to '<empty>')"
220 textEnd4
= "(Cell A2 changed from 'Test LibreOffice' to '<empty>')"
221 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].startswith(textStart
))
222 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].endswith(textEnd3
))
223 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].startswith(textStart2
))
224 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].endswith(textEnd4
))
226 xChangesList
.getChild('1').executeAction("EXPAND", tuple())
227 self
.assertEqual(2, len(xChangesList
.getChild('1').getChildren()))
229 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('0'))["Text"].startswith(textStart
))
230 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('0'))["Text"].endswith(textEnd
))
231 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('1'))["Text"].startswith(textStart2
))
232 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('1'))["Text"].endswith(textEnd2
))
234 xCancBtn
= xTrackDlg
.getChild("close")
235 xCancBtn
.executeAction("CLICK", tuple())
237 self
.assertEqual(get_cell_by_position(document
, 0, 0, 0).getString(), "")
238 self
.ui_test
.close_doc()
240 def test_tracked_changes_rejectall(self
):
242 calc_doc
= self
.ui_test
.create_doc_in_start_center("calc")
243 xCalcDoc
= self
.xUITest
.getTopFocusWindow()
244 gridwin
= xCalcDoc
.getChild("grid_window")
245 document
= self
.ui_test
.get_component()
246 #track changes; enter text to cell
247 self
.xUITest
.executeCommand(".uno:TraceChangeMode")
248 enter_text_to_cell(gridwin
, "A1", "Test LibreOffice")
249 enter_text_to_cell(gridwin
, "A2", "Test LibreOffice")
250 #accept tracked changes
251 self
.ui_test
.execute_modeless_dialog_through_command(".uno:AcceptChanges")
252 xTrackDlg
= self
.xUITest
.getTopFocusWindow()
254 xChangesList
= xTrackDlg
.getChild("calcchanges")
255 self
.assertEqual(2, len(xChangesList
.getChildren()))
257 textStart
= "Changed contents\tSheet1.A1\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
258 textEnd
= "(Cell A1 changed from '<empty>' to 'Test LibreOffice')"
259 textStart2
= "Changed contents\tSheet1.A2\t \t" + datetime
.datetime
.now().strftime("%m/%d/%Y")
260 textEnd2
= "(Cell A2 changed from '<empty>' to 'Test LibreOffice')"
261 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].startswith(textStart
))
262 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0'))["Text"].endswith(textEnd
))
263 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].startswith(textStart2
))
264 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1'))["Text"].endswith(textEnd2
))
266 xAccBtn
= xTrackDlg
.getChild("rejectall")
267 xAccBtn
.executeAction("CLICK", tuple())
269 self
.assertEqual(2, len(xChangesList
.getChildren()))
270 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('0'))["Text"], "Accepted")
271 self
.assertEqual(get_state_as_dict(xChangesList
.getChild('1'))["Text"], "Rejected")
273 xChangesList
.getChild('0').executeAction("EXPAND", tuple())
274 self
.assertEqual(2, len(xChangesList
.getChild('0').getChildren()))
276 textEnd3
= "(Cell A1 changed from 'Test LibreOffice' to '<empty>')"
277 textEnd4
= "(Cell A2 changed from 'Test LibreOffice' to '<empty>')"
278 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].startswith(textStart2
))
279 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('0'))["Text"].endswith(textEnd4
))
280 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].startswith(textStart
))
281 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('0').getChild('1'))["Text"].endswith(textEnd3
))
283 xChangesList
.getChild('1').executeAction("EXPAND", tuple())
284 self
.assertEqual(2, len(xChangesList
.getChild('1').getChildren()))
286 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('0'))["Text"].startswith(textStart
))
287 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('0'))["Text"].endswith(textEnd
))
288 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('1'))["Text"].startswith(textStart2
))
289 self
.assertTrue(get_state_as_dict(xChangesList
.getChild('1').getChild('1'))["Text"].endswith(textEnd2
))
291 xCancBtn
= xTrackDlg
.getChild("close")
292 xCancBtn
.executeAction("CLICK", tuple())
294 self
.assertEqual(get_cell_by_position(document
, 0, 0, 0).getString(), "")
295 self
.ui_test
.close_doc()
297 def test_tdf136062(self
):
299 self
.ui_test
.load_file(get_url_for_data_file("tdf136062.ods"))
301 self
.xUITest
.getTopFocusWindow()
303 self
.ui_test
.execute_modeless_dialog_through_command(".uno:AcceptChanges")
304 xTrackDlg
= self
.xUITest
.getTopFocusWindow()
306 xChangesList
= xTrackDlg
.getChild("calcchanges")
307 self
.assertEqual(1, len(xChangesList
.getChildren()))
309 xRejectAllBtn
= xTrackDlg
.getChild("rejectall")
310 xRejectBtn
= xTrackDlg
.getChild("reject")
311 xAcceptAllBtn
= xTrackDlg
.getChild("acceptall")
312 xAcceptBtn
= xTrackDlg
.getChild("accept")
314 # Without the fix in place, it would have failed with
315 # AssertionError: 'R~eject All' != 'R~eject All/Clear formatting'
316 self
.assertEqual('R~eject All', get_state_as_dict(xRejectAllBtn
)['Text'])
317 self
.assertEqual('~Reject', get_state_as_dict(xRejectBtn
)['Text'])
318 self
.assertEqual('A~ccept All', get_state_as_dict(xAcceptAllBtn
)['Text'])
319 self
.assertEqual('~Accept', get_state_as_dict(xAcceptBtn
)['Text'])
321 xCancBtn
= xTrackDlg
.getChild("close")
322 xCancBtn
.executeAction("CLICK", tuple())
324 self
.ui_test
.close_doc()
326 # vim: set shiftwidth=4 softtabstop=4 expandtab: