1 /**
2 * UGENE - Integrated Bioinformatics Tools.
3 * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru>
4 * http://ugene.net
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 * MA 02110-1301, USA.
20 */
21
22 #include "GTTestsSequenceEdit.h"
23 #include <base_dialogs/GTFileDialog.h>
24 #include <drivers/GTKeyboardDriver.h>
25 #include <drivers/GTMouseDriver.h>
26 #include <primitives/GTTreeWidget.h>
27
28 #include <QApplication>
29 #include <QClipboard>
30 #include <QTreeWidgetItem>
31
32 #include <U2Core/DocumentModel.h>
33 #include <U2Core/U2IdTypes.h>
34
35 #include <U2View/ADVConstants.h>
36 #include <U2View/AnnotatedDNAViewFactory.h>
37
38 #include "GTGlobals.h"
39 #include "GTUtilsAnnotationsTreeView.h"
40 #include "GTUtilsDocument.h"
41 #include "GTUtilsMdi.h"
42 #include "GTUtilsNotifications.h"
43 #include "GTUtilsSequenceView.h"
44 #include "GTUtilsTaskTreeView.h"
45 #include "primitives/GTMenu.h"
46 #include "primitives/PopupChooser.h"
47 #include "runnables/ugene/corelibs/U2Gui/EditSequenceDialogFiller.h"
48 #include "runnables/ugene/corelibs/U2Gui/RangeSelectionDialogFiller.h"
49 #include "runnables/ugene/corelibs/U2Gui/RemovePartFromSequenceDialogFiller.h"
50 #include "runnables/ugene/corelibs/U2Gui/ReplaceSubsequenceDialogFiller.h"
51 #include "system/GTClipboard.h"
52 #include "utils/GTKeyboardUtils.h"
53
54 namespace U2 {
55
56 namespace GUITest_common_scenarios_sequence_edit {
57 using namespace HI;
GUI_TEST_CLASS_DEFINITION(test_0001)58 GUI_TEST_CLASS_DEFINITION(test_0001) {
59 GTFileDialog::openFile(os, dataDir + "samples/FASTA/human_T1.fa");
60 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
61
62 GTUtilsDialog::waitForDialog(os, new SelectSequenceRegionDialogFiller(os, 1, 50));
63 GTWidget::click(os, GTWidget::findWidget(os, "ADV_single_sequence_widget_0"));
64 GTKeyboardUtils::selectAll();
65
66 GTUtilsDialog::waitForDialog(os,
67 new RemovePartFromSequenceDialogFiller(os,
68 RemovePartFromSequenceDialogFiller::Remove,
69 true,
70 testDir + "_common_data/scenarios/sandbox/result.fa",
71 RemovePartFromSequenceDialogFiller::FASTA));
72 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
73
74 GTUtilsSequenceView::openSequenceView(os, "result.fa");
75
76 int sequenceLength = GTUtilsSequenceView::getLengthOfSequence(os);
77 CHECK_SET_ERR(sequenceLength == 199900, "Sequence length is " + QString::number(sequenceLength) + ", expected 199900");
78
79 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 7);
80 CHECK_SET_ERR(sequenceBegin == "AGAGAGA", "Sequence starts with <" + sequenceBegin + ">, expected AGAGAGA");
81 }
82
GUI_TEST_CLASS_DEFINITION(test_0002)83 GUI_TEST_CLASS_DEFINITION(test_0002) {
84 // Removing part from sequence
85 //
86 // Steps:
87 //
88 // 1. Use menu {File->Open}. Open file samples/FASTA/human_T1.fa
89 GTFileDialog::openFile(os, dataDir + "samples/FASTA/human_T1.fa");
90 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
91 // 2. Click Ctrl+A.
92 // Expected state: Select range dialog appears
93 //
94 // 3. Fill the next field in dialog:
95 // {Range:} 1..50
96 //
97 GTUtilsDialog::waitForDialog(os, new SelectSequenceRegionDialogFiller(os, 1, 50));
98 GTUtilsSequenceView::clickMouseOnTheSafeSequenceViewArea(os);
99 GTKeyboardUtils::selectAll();
100
101 // 4. Click OK. Right click on sequence area. Use context menu {Edit sequence->Remove selected sequence}.
102 // Expected state: Remove subsequence dialog appears
103 //
104 // 5. Fill the next field in dialog:
105 // {Save resulted document to a new file} set checked
106 // {Document format} Genbank
107 // {Document location} _common_data/scenarios/sandbox/result.gb
108 // 6. Click Remove Button.
109 GTUtilsDialog::waitForDialog(os, new PopupChooser(os, {ADV_MENU_EDIT, ACTION_EDIT_REMOVE_SUBSEQUENCE}, GTGlobals::UseMouse));
110 GTUtilsDialog::waitForDialog(os,
111 new RemovePartFromSequenceDialogFiller(os,
112 RemovePartFromSequenceDialogFiller::Remove,
113 true,
114 testDir + "_common_data/scenarios/sandbox/result.gb",
115 RemovePartFromSequenceDialogFiller::Genbank));
116 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
117
118 GTUtilsTaskTreeView::waitTaskFinished(os);
119
120 // Expected state:
121 // document with edited sequence must appear in project view,
122 // sequence length in new document must be 199900
123 // sequence must starts with "AGAGAGA"
124 GTUtilsSequenceView::openSequenceView(os, "result.gb");
125
126 int length = GTUtilsSequenceView::getLengthOfSequence(os);
127 CHECK_SET_ERR(length == 199900, "Expected length differs");
128 QString seqStart = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 7);
129 CHECK_SET_ERR(seqStart == "AGAGAGA", "Expected sequence beginning differs");
130 }
131
GUI_TEST_CLASS_DEFINITION(test_0003)132 GUI_TEST_CLASS_DEFINITION(test_0003) {
133 GTFileDialog::openFile(os, dataDir + "samples/FASTA/", "human_T1.fa");
134 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
135
136 GTUtilsDialog::waitForDialog(os,
137 new InsertSequenceFiller(os,
138 "AAAAAA",
139 InsertSequenceFiller::Resize,
140 1,
141 testDir + "_common_data/scenarios/sandbox/result.fa",
142 InsertSequenceFiller::FASTA,
143 true,
144 false));
145 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseKey);
146 GTUtilsDocument::checkDocument(os, "result.fa");
147
148 GTUtilsSequenceView::openSequenceView(os, "result.fa");
149
150 int sequenceLength = GTUtilsSequenceView::getLengthOfSequence(os);
151 CHECK_SET_ERR(sequenceLength == 199956, "Sequence length is " + QString::number(sequenceLength) + ", expected 199956");
152
153 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 6);
154 CHECK_SET_ERR(sequenceBegin == "AAAAAA", "Sequence starts with <" + sequenceBegin + ">, expected AAAAAA");
155 }
GUI_TEST_CLASS_DEFINITION(test_0004)156 GUI_TEST_CLASS_DEFINITION(test_0004) {
157 GTFileDialog::openFile(os, dataDir + "samples/FASTA/", "human_T1.fa");
158 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
159
160 GTUtilsDialog::waitForDialog(os,
161 new InsertSequenceFiller(os,
162 "AAAAAA",
163 InsertSequenceFiller::Resize,
164 1,
165 testDir + "_common_data/scenarios/sandbox/result.gb",
166 InsertSequenceFiller::Genbank,
167 true,
168 false));
169 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseKey);
170
171 GTUtilsDocument::checkDocument(os, "result.gb");
172
173 GTUtilsSequenceView::openSequenceView(os, "result.gb");
174
175 int sequenceLength = GTUtilsSequenceView::getLengthOfSequence(os);
176 CHECK_SET_ERR(sequenceLength == 199956, "Sequence length is " + QString::number(sequenceLength) + ", expected 199956");
177
178 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 6);
179 CHECK_SET_ERR(sequenceBegin == "AAAAAA", "Sequence starts with <" + sequenceBegin + ">, expected AAAAAA");
180 }
GUI_TEST_CLASS_DEFINITION(test_0005)181 GUI_TEST_CLASS_DEFINITION(test_0005) {
182 GTFileDialog::openFile(os, dataDir + "samples/FASTA/", "human_T1.fa");
183 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
184
185 GTUtilsDialog::waitForDialog(os, new SelectSequenceRegionDialogFiller(os, 1, 50));
186 GTKeyboardUtils::selectAll();
187 GTUtilsDialog::waitForDialog(os,
188 new RemovePartFromSequenceDialogFiller(os,
189 RemovePartFromSequenceDialogFiller::Remove,
190 true,
191 testDir + "_common_data/scenarios/sandbox/result.fa",
192 RemovePartFromSequenceDialogFiller::FASTA));
193 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
194 GTUtilsDocument::checkDocument(os, "result.fa");
195 GTUtilsSequenceView::openSequenceView(os, "result.fa");
196
197 int sequenceLength = GTUtilsSequenceView::getLengthOfSequence(os);
198 CHECK_SET_ERR(sequenceLength == 199900, "Sequence length is " + QString::number(sequenceLength) + ", expected 199900");
199
200 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 7);
201 CHECK_SET_ERR(sequenceBegin == "AGAGAGA", "Sequence starts with <" + sequenceBegin + ">, expected AGAGAGA");
202 }
203
GUI_TEST_CLASS_DEFINITION(test_0006)204 GUI_TEST_CLASS_DEFINITION(test_0006) {
205 GTFileDialog::openFile(os, testDir + "_common_data/scenarios/dp_view/", "NC_014267.gb");
206 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
207
208 GTUtilsDialog::waitForDialog(os, new PopupChooser(os, {ADV_MENU_EDIT, ADV_MENU_REPLACE_WHOLE_SEQUENCE, ACTION_EDIT_RESERVE_COMPLEMENT_SEQUENCE}, GTGlobals::UseKey));
209 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
210
211 QString expectedSequenceBegin = "ATCAGATT";
212 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 8);
213 CHECK_SET_ERR(sequenceBegin == expectedSequenceBegin, "unexpected begin. Expected ATCAGATT, actual: " + sequenceBegin);
214 }
215
GUI_TEST_CLASS_DEFINITION(test_0007)216 GUI_TEST_CLASS_DEFINITION(test_0007) {
217 // 1. Open file "test/_common_data/edit_sequence/test.gb"
218 GTFileDialog::openFile(os, testDir + "_common_data/edit_sequence/test.gb");
219 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
220
221 // 2. Select "Remove subsequence" in the context menu.
222 // 3. Insert region "2..2" into the "Region to remove" field.
223 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "2..2"));
224 GTMenu::clickMainMenuItem(os, QStringList() << "Actions"
225 << "Edit"
226 << "Remove subsequence...",
227 GTGlobals::UseMouse);
228
229 // Expected result: the sequence is started from "AAT", the sequence length is 29, DUMMY_1 annotation is [2..5].
230 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 3);
231 CHECK_SET_ERR(sequenceBegin == "AAT", "Sequence starts with " + sequenceBegin + ", expected AAT");
232
233 int length = GTUtilsSequenceView::getLengthOfSequence(os);
234 CHECK_SET_ERR(length == 29, "Sequence length is " + QString::number(length) + ", expected 29");
235
236 bool found = GTUtilsAnnotationsTreeView::findRegion(os, "DUMMY_1", U2Region(2, 5));
237 CHECK_SET_ERR(found == true, "There is no {2..5} region in annotation");
238 }
239
GUI_TEST_CLASS_DEFINITION(test_0008)240 GUI_TEST_CLASS_DEFINITION(test_0008) {
241 GTFileDialog::openFile(os, testDir + "_common_data/edit_sequence/", "test.gb");
242 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
243
244 QTreeWidgetItem *dummyTest = GTUtilsAnnotationsTreeView::findItem(os, "DUMMY_1");
245 CHECK_SET_ERR(dummyTest != nullptr, "There is no annotation DUMMY_1");
246
247 GTUtilsDialog::waitForDialog(os, new SelectSequenceRegionDialogFiller(os, 2, 2));
248 GTKeyboardUtils::selectAll();
249
250 GTUtilsDialog::waitForDialog(os,
251 new RemovePartFromSequenceDialogFiller(os,
252 RemovePartFromSequenceDialogFiller::Remove,
253 false,
254 testDir + "_common_data/scenarios/sandbox/result.fa",
255 RemovePartFromSequenceDialogFiller::FASTA));
256 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
257
258 int sequenceLength = GTUtilsSequenceView::getLengthOfSequence(os);
259 CHECK_SET_ERR(sequenceLength == 29, "Sequence length is " + QString::number(sequenceLength) + ", expected 29");
260
261 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 3);
262 CHECK_SET_ERR(sequenceBegin == "AAT", "Sequence starts with <" + sequenceBegin + ">, expected AAT");
263
264 QTreeWidgetItem *dummy1 = GTUtilsAnnotationsTreeView::findItem(os, "DUMMY_1", GTGlobals::FindOptions(false));
265 CHECK_SET_ERR(dummy1 == nullptr, "There is annotation DUMMY_1, expected state there is no annotation DUMMY_1");
266 }
267
GUI_TEST_CLASS_DEFINITION(test_0009)268 GUI_TEST_CLASS_DEFINITION(test_0009) {
269 GTFileDialog::openFile(os, testDir + "_common_data/fasta/AMINO.fa");
270 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
271
272 GTUtilsDialog::waitForDialog(os, new SelectSequenceRegionDialogFiller(os, 10, 13));
273 GTWidget::click(os, GTWidget::findWidget(os, "ADV_single_sequence_widget_0"));
274 GTKeyboardUtils::selectAll();
275
276 GTKeyboardDriver::keyClick('c', Qt::ControlModifier);
277
278 QString sequence = GTClipboard::text(os);
279 CHECK_SET_ERR(sequence == "ACCC", "Incorrect sequence is copied");
280 }
281
GUI_TEST_CLASS_DEFINITION(test_0010)282 GUI_TEST_CLASS_DEFINITION(test_0010) {
283 GTFileDialog::openFile(os, testDir + "_common_data/edit_sequence/", "test.gb");
284 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
285
286 QWidget *mdiWindow = GTUtilsMdi::activeWindow(os);
287 GTUtilsDialog::waitForDialog(os, new SelectSequenceRegionDialogFiller(os, 1, 11));
288 GTKeyboardUtils::selectAll();
289 GTUtilsDialog::waitForDialog(os, new PopupChooser(os, {ADV_MENU_COPY, ADV_COPY_TRANSLATION_ACTION}, GTGlobals::UseKey));
290 GTMenu::showContextMenu(os, mdiWindow);
291 QString text = GTClipboard::text(os);
292
293 CHECK_SET_ERR(text == "K*K", "Sequcence part translated to <" + text + ">, expected K*K");
294 }
295
GUI_TEST_CLASS_DEFINITION(test_0011)296 GUI_TEST_CLASS_DEFINITION(test_0011) {
297 GTFileDialog::openFile(os, testDir + "_common_data/edit_sequence/", "test.gb");
298 GTUtilsTaskTreeView::waitTaskFinished(os);
299
300 GTUtilsDialog::waitForDialog(os, new PopupChooser(os, QStringList() << "ADV_MENU_COPY"
301 << "action_copy_annotation_sequence"));
302 GTMouseDriver::moveTo(GTUtilsAnnotationsTreeView::getItemCenter(os, "DUMMY_1"));
303 GTMouseDriver::click(Qt::RightButton);
304
305 QString expectedSequence = "AATGA";
306
307 QString realSequence = GTClipboard::text(os);
308 CHECK_SET_ERR(expectedSequence == realSequence, "Sequence is not pasted");
309 }
310
GUI_TEST_CLASS_DEFINITION(test_0012)311 GUI_TEST_CLASS_DEFINITION(test_0012) {
312 GTFileDialog::openFile(os, testDir + "_common_data/edit_sequence/test.gb");
313 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
314
315 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "2..2"));
316 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
317
318 QString sequenceBegin = GTUtilsSequenceView::getBeginOfSequenceAsString(os, 3);
319 CHECK_SET_ERR(sequenceBegin == "AAT", "Sequence starts with " + sequenceBegin + ", expected AAT");
320
321 int length = GTUtilsSequenceView::getLengthOfSequence(os);
322 CHECK_SET_ERR(length == 29, "Sequence length is " + QString::number(length) + ", expected 29");
323
324 bool found = GTUtilsAnnotationsTreeView::findRegion(os, "DUMMY_1", U2Region(2, 5));
325 CHECK_SET_ERR(found == true, "There is no {2..5} region in annotation");
326 }
327
getReferenceQualifiers()328 static QMap<QString, QString> getReferenceQualifiers() {
329 static QMap<QString, QString> qualifiers;
330 if (qualifiers.isEmpty()) {
331 qualifiers["new_qualifier"] = "adsdas 50..60 asdk 70..80 ljsad";
332 qualifiers["new_qualifier1"] = "sdfsdfsdf join(20..30,90..100) dfdfdsf";
333 qualifiers["new_qualifier2"] = "asdas order(230..250,270..300) a dsd";
334 qualifiers["new_qualifier3"] = "sdfsdfk complement(order(450..470, 490..500)) dfdsf";
335 qualifiers["new_qualifier4"] = "sdfsdfk complement(join(370..400,420..440)) dfdsf";
336 qualifiers["new_qualifier5"] = "sdfsdfk complement(320..350) df complement(355..365) dsf";
337 }
338 return qualifiers;
339 }
340
shiftQualifierRegions(const QString & value,int delta)341 static QString shiftQualifierRegions(const QString &value, int delta) {
342 QString result = value;
343 QRegExp digitMatcher("\\d+");
344 int lastFoundPos = 0;
345 int lastReplacementPos = 0;
346
347 while ((lastFoundPos = digitMatcher.indexIn(value, lastFoundPos)) != -1) {
348 const QString number = digitMatcher.cap();
349 const QString newNumber = QString::number(number.toLongLong() + delta);
350 const int replacementStart = result.indexOf(number, lastReplacementPos);
351 result.replace(replacementStart, number.length(), newNumber);
352 lastReplacementPos = replacementStart + newNumber.length();
353 lastFoundPos += digitMatcher.matchedLength();
354 }
355 return result;
356 }
357
checkQualifierValue(HI::GUITestOpStatus & os,const QString & qualName,int regionShift)358 static void checkQualifierValue(HI::GUITestOpStatus &os, const QString &qualName, int regionShift) {
359 QTreeWidgetItem *qual = GTUtilsAnnotationsTreeView::findItem(os, qualName);
360 QString qualValue = qual->data(2, Qt::DisplayRole).toString();
361 QString expectedVal = shiftQualifierRegions(getReferenceQualifiers()[qualName], regionShift);
362 CHECK_SET_ERR(qualValue == expectedVal, QString("Qualifier value has changed unexpectedly. Expected: '%1'. Actual: '%2'").arg(expectedVal).arg(qualValue));
363 }
364
checkQualifierRegionsShift(HI::GUITestOpStatus & os,int shift)365 static void checkQualifierRegionsShift(HI::GUITestOpStatus &os, int shift) {
366 foreach (const QString &qualName, getReferenceQualifiers().keys()) {
367 checkQualifierValue(os, qualName, shift);
368 }
369 }
370
doMagic(HI::GUITestOpStatus & os)371 static void doMagic(HI::GUITestOpStatus &os) {
372 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "Misc. Feature (0, 2)");
373 GTTreeWidget::getItemCenter(os, annotationGroup);
374 for (int i = 0; i < annotationGroup->childCount(); ++i) {
375 GTTreeWidget::getItemCenter(os, annotationGroup->child(i));
376 }
377 }
378
GUI_TEST_CLASS_DEFINITION(test_0013_1)379 GUI_TEST_CLASS_DEFINITION(test_0013_1) {
380 // Check that qualifiers are recalculated on a removal of a subsequence that is located to the left of a region mentioned in a qualifier
381
382 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
383 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
384
385 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
386
387 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "1..10", false));
388 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
389 GTUtilsTaskTreeView::waitTaskFinished(os);
390
391 checkQualifierRegionsShift(os, 0);
392
393 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "1..10", true));
394 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
395 GTUtilsTaskTreeView::waitTaskFinished(os);
396
397 checkQualifierRegionsShift(os, -10);
398 }
399
GUI_TEST_CLASS_DEFINITION(test_0013_1_neg)400 GUI_TEST_CLASS_DEFINITION(test_0013_1_neg) {
401 // Check that qualifiers aren't recalculated on a removal of a subsequence that is located to the right of a region mentioned in a qualifier
402
403 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
404 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
405
406 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
407
408 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "1000..1100", true));
409 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
410 GTUtilsTaskTreeView::waitTaskFinished(os);
411
412 checkQualifierRegionsShift(os, 0);
413 }
414
GUI_TEST_CLASS_DEFINITION(test_0013_2)415 GUI_TEST_CLASS_DEFINITION(test_0013_2) {
416 // Check that a translation qualifier is recalculated on a removal of a subsequence that is located inside an annotated region
417
418 GTFileDialog::openFile(os, dataDir + "samples/Genbank/murine.gb");
419 GTUtilsTaskTreeView::waitTaskFinished(os);
420
421 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "1040..1042", true));
422 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
423 GTUtilsTaskTreeView::waitTaskFinished(os);
424
425 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "CDS (0, 4)");
426 GTTreeWidget::getItemCenter(os, annotationGroup);
427 GTTreeWidget::getItemCenter(os, annotationGroup->child(0));
428 QTreeWidgetItem *qualItem = annotationGroup->child(0)->child(5);
429 CHECK_SET_ERR(qualItem->text(0) == "translation", "Unexpected qualifier found");
430 CHECK_SET_ERR(qualItem->text(2).startsWith("WARLLPLP*V*P*"), "Unexpected 'translation' qualifier value");
431 }
432
GUI_TEST_CLASS_DEFINITION(test_0013_2_neg)433 GUI_TEST_CLASS_DEFINITION(test_0013_2_neg) {
434 // Check that a translation qualifier isn't recalculated on a removal of a subsequence that is located outside an annotated region
435
436 GTFileDialog::openFile(os, dataDir + "samples/Genbank/murine.gb");
437 GTUtilsTaskTreeView::waitTaskFinished(os);
438
439 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "996..1000", true));
440 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
441 GTUtilsTaskTreeView::waitTaskFinished(os);
442
443 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "CDS (0, 4)");
444 GTTreeWidget::getItemCenter(os, annotationGroup);
445 GTTreeWidget::getItemCenter(os, annotationGroup->child(0));
446 QTreeWidgetItem *qualItem = annotationGroup->child(0)->child(5);
447 CHECK_SET_ERR("translation" == qualItem->text(0), "Unexpected qualifier found");
448 CHECK_SET_ERR(qualItem->text(2).startsWith("MGQTVTTPLSLTLDHWKD"), "Unexpected 'translation' qualifier value");
449 }
450
GUI_TEST_CLASS_DEFINITION(test_0014_1)451 GUI_TEST_CLASS_DEFINITION(test_0014_1) {
452 // Check that qualifiers are recalculated on an insertion of a subsequence that is located to the left of a region mentioned in a qualifier
453
454 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
455 GTUtilsTaskTreeView::waitTaskFinished(os);
456 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
457
458 GTUtilsSequenceView::selectSequenceRegion(os, 1, 1);
459
460 GTUtilsDialog::waitForDialog(os, new InsertSequenceFiller(os, "AAAAAAAAAA", InsertSequenceFiller::Resize, 1, "", InsertSequenceFiller::FASTA, false, false, GTGlobals::UseKey, false, false));
461 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseMouse);
462 GTUtilsTaskTreeView::waitTaskFinished(os);
463
464 checkQualifierRegionsShift(os, 0);
465
466 GTUtilsDialog::waitForDialog(os, new InsertSequenceFiller(os, "AAAAAAAAAA", InsertSequenceFiller::Resize, 1, "", InsertSequenceFiller::FASTA, false, false, GTGlobals::UseKey, false, true));
467 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseMouse);
468 GTUtilsTaskTreeView::waitTaskFinished(os);
469
470 checkQualifierRegionsShift(os, 10);
471 }
472
GUI_TEST_CLASS_DEFINITION(test_0014_1_neg)473 GUI_TEST_CLASS_DEFINITION(test_0014_1_neg) {
474 // Check that qualifiers aren't recalculated on an insertion of a subsequence that is located to the right of a region mentioned in a qualifier
475
476 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
477 GTUtilsTaskTreeView::waitTaskFinished(os);
478 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
479
480 GTUtilsSequenceView::selectSequenceRegion(os, 100000, 100000);
481
482 GTUtilsDialog::waitForDialog(os, new InsertSequenceFiller(os, "AAAAAAAAAA", InsertSequenceFiller::Resize, 100000, "", InsertSequenceFiller::FASTA, false, false, GTGlobals::UseKey, false, true));
483 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseMouse);
484 GTUtilsTaskTreeView::waitTaskFinished(os);
485
486 checkQualifierRegionsShift(os, 0);
487 }
488
GUI_TEST_CLASS_DEFINITION(test_0014_2)489 GUI_TEST_CLASS_DEFINITION(test_0014_2) {
490 // Check that a translation qualifier is recalculated on an insertion of a subsequence that is located inside an annotated region
491
492 GTFileDialog::openFile(os, dataDir + "samples/Genbank/murine.gb");
493 GTUtilsTaskTreeView::waitTaskFinished(os);
494
495 GTUtilsSequenceView::selectSequenceRegion(os, 1050, 1050);
496
497 GTUtilsDialog::waitForDialog(os, new InsertSequenceFiller(os, "A", InsertSequenceFiller::Resize, 1050, "", InsertSequenceFiller::FASTA, false, false, GTGlobals::UseKey, false, true));
498 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseMouse);
499 GTUtilsTaskTreeView::waitTaskFinished(os);
500
501 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "CDS (0, 4)");
502 GTTreeWidget::getItemCenter(os, annotationGroup);
503 GTTreeWidget::getItemCenter(os, annotationGroup->child(0));
504 QTreeWidgetItem *qualItem = annotationGroup->child(0)->child(5);
505 CHECK_SET_ERR(qualItem->text(0) == "translation", "Unexpected qualifier found");
506 CHECK_SET_ERR(qualItem->text(2).startsWith("MGQDCYHSLKFDLRSLER"), "Unexpected 'translation' qualifier value");
507 }
508
GUI_TEST_CLASS_DEFINITION(test_0014_2_neg)509 GUI_TEST_CLASS_DEFINITION(test_0014_2_neg) {
510 // Check that a translation qualifier isn't recalculated on an insertion of a subsequence that is located outside an annotated region
511
512 GTFileDialog::openFile(os, dataDir + "samples/Genbank/murine.gb");
513 GTUtilsTaskTreeView::waitTaskFinished(os);
514
515 GTUtilsSequenceView::selectSequenceRegion(os, 1, 1);
516
517 GTUtilsDialog::waitForDialog(os, new InsertSequenceFiller(os, "A", InsertSequenceFiller::Resize, 1, "", InsertSequenceFiller::FASTA, false, false, GTGlobals::UseKey, false, true));
518 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Insert subsequence..."}, GTGlobals::UseMouse);
519 GTUtilsTaskTreeView::waitTaskFinished(os);
520
521 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "CDS (0, 4)");
522 GTTreeWidget::getItemCenter(os, annotationGroup);
523 GTTreeWidget::getItemCenter(os, annotationGroup->child(0));
524 QTreeWidgetItem *qualItem = annotationGroup->child(0)->child(5);
525 CHECK_SET_ERR(qualItem->text(0) == "translation", "Unexpected qualifier found");
526 CHECK_SET_ERR(qualItem->text(2).startsWith("MGQTVTTPLSLTLDHWKD"), "Unexpected 'translation' qualifier value");
527 }
528
GUI_TEST_CLASS_DEFINITION(test_0015_1)529 GUI_TEST_CLASS_DEFINITION(test_0015_1) {
530 // Check that a qualifier is recalculated on a substitution of a subsequence that is located to the left of a region mentioned in the qualifier
531
532 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
533 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
534
535 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
536
537 GTUtilsSequenceView::selectSequenceRegion(os, 1, 10);
538
539 GTUtilsDialog::waitForDialog(os, new ReplaceSubsequenceDialogFiller(os, "AAAAA", false));
540 GTUtilsDialog::waitForDialog(os, new PopupChooserByText(os, {"Edit", "Replace subsequence..."}));
541 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
542 GTUtilsTaskTreeView::waitTaskFinished(os);
543
544 checkQualifierRegionsShift(os, 0);
545
546 GTUtilsSequenceView::selectSequenceRegion(os, 1, 10);
547
548 GTUtilsDialog::waitForDialog(os, new ReplaceSubsequenceDialogFiller(os, "AAAAA", true));
549 GTUtilsDialog::waitForDialog(os, new PopupChooserByText(os, {"Edit", "Replace subsequence..."}));
550 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
551 GTUtilsTaskTreeView::waitTaskFinished(os);
552
553 checkQualifierRegionsShift(os, -5);
554 }
555
GUI_TEST_CLASS_DEFINITION(test_0015_1_neg)556 GUI_TEST_CLASS_DEFINITION(test_0015_1_neg) {
557 // Check that a qualifier isn't recalculated on a substitution of a subsequence that is located to the right of a region mentioned in the qualifier
558
559 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
560 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
561
562 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
563
564 GTUtilsSequenceView::selectSequenceRegion(os, 1000, 1010);
565
566 GTUtilsDialog::waitForDialog(os, new ReplaceSubsequenceDialogFiller(os, "AAAAA", true));
567 GTUtilsDialog::waitForDialog(os, new PopupChooserByText(os, {"Edit", "Replace subsequence..."}));
568 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
569 GTUtilsTaskTreeView::waitTaskFinished(os);
570
571 checkQualifierRegionsShift(os, 0);
572 }
573
GUI_TEST_CLASS_DEFINITION(test_0015_2)574 GUI_TEST_CLASS_DEFINITION(test_0015_2) {
575 // Check that a translation qualifier is recalculated on a substitution of a subsequence that is located inside an annotated region
576
577 GTFileDialog::openFile(os, dataDir + "samples/Genbank/murine.gb");
578 GTUtilsTaskTreeView::waitTaskFinished(os);
579
580 GTUtilsSequenceView::selectSequenceRegion(os, 1050, 1050);
581
582 GTUtilsDialog::waitForDialog(os, new ReplaceSubsequenceDialogFiller(os, "AAA", true));
583 GTUtilsDialog::waitForDialog(os, new PopupChooserByText(os, {"Edit", "Replace subsequence..."}));
584 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
585 GTUtilsTaskTreeView::waitTaskFinished(os);
586
587 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "CDS (0, 4)");
588 GTTreeWidget::getItemCenter(os, annotationGroup);
589 GTTreeWidget::getItemCenter(os, annotationGroup->child(0));
590 QTreeWidgetItem *qualItem = annotationGroup->child(0)->child(5);
591 CHECK_SET_ERR(qualItem->text(0) == "translation", "Unexpected qualifier found");
592 CHECK_SET_ERR(qualItem->text(2).startsWith("MGQKLLPLP*V*P*ITGKMS"), "Unexpected 'translation' qualifier value");
593 }
594
GUI_TEST_CLASS_DEFINITION(test_0015_2_neg)595 GUI_TEST_CLASS_DEFINITION(test_0015_2_neg) {
596 // Check that a translation qualifier isn't recalculated on a substitution of a subsequence that is located outside an annotated region
597
598 GTFileDialog::openFile(os, dataDir + "samples/Genbank/murine.gb");
599 GTUtilsTaskTreeView::waitTaskFinished(os);
600
601 GTUtilsSequenceView::selectSequenceRegion(os, 996, 1000);
602
603 GTUtilsDialog::waitForDialog(os, new ReplaceSubsequenceDialogFiller(os, "AA", true));
604 GTUtilsDialog::waitForDialog(os, new PopupChooserByText(os, {"Edit", "Replace subsequence..."}, GTGlobals::UseMouse));
605 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
606 GTUtilsTaskTreeView::waitTaskFinished(os);
607
608 QTreeWidgetItem *annotationGroup = GTUtilsAnnotationsTreeView::findItem(os, "CDS (0, 4)");
609 GTTreeWidget::getItemCenter(os, annotationGroup);
610 GTTreeWidget::getItemCenter(os, annotationGroup->child(0));
611 QTreeWidgetItem *qualItem = annotationGroup->child(0)->child(5);
612 CHECK_SET_ERR(qualItem->text(0) == "translation", "Unexpected qualifier found");
613 CHECK_SET_ERR(qualItem->text(2).startsWith("MGQTVTTPLSLTLDHWKD"), "Unexpected 'translation' qualifier value");
614 }
615
GUI_TEST_CLASS_DEFINITION(test_0016_1)616 GUI_TEST_CLASS_DEFINITION(test_0016_1) {
617 // Check that a qualifier isn't recalculated on a removal of a subsequence that includes a region mentioned in the qualifier
618
619 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
620 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
621
622 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
623
624 GTUtilsDialog::waitForDialog(os, new RemovePartFromSequenceDialogFiller(os, "1..600", true));
625 GTUtilsNotifications::waitForNotification(os, false);
626 GTMenu::clickMainMenuItem(os, {"Actions", "Edit", "Remove subsequence..."}, GTGlobals::UseMouse);
627
628 GTUtilsTaskTreeView::waitTaskFinished(os);
629
630 GTUtilsMdi::activateWindow(os, "human_T1 [qulifier_rebuilding.gb]");
631
632 checkQualifierRegionsShift(os, 0);
633 }
634
GUI_TEST_CLASS_DEFINITION(test_0016_2)635 GUI_TEST_CLASS_DEFINITION(test_0016_2) {
636 // Check that a qualifier isn't recalculated on a complete replacement of a subsequence that includes a region mentioned in the qualifier
637
638 GTFileDialog::openFile(os, testDir + "_common_data/genbank/qulifier_rebuilding.gb");
639 GTUtilsSequenceView::checkSequenceViewWindowIsActive(os);
640
641 doMagic(os); // for some reason annotation qualifiers are not found without actions done by this function
642
643 GTUtilsSequenceView::selectSequenceRegion(os, 1, 600);
644
645 GTUtilsDialog::waitForDialog(os, new ReplaceSubsequenceDialogFiller(os, "AAAAA", true));
646 GTUtilsDialog::waitForDialog(os, new PopupChooserByText(os, {"Edit", "Replace subsequence..."}));
647 GTUtilsNotifications::waitForNotification(os, false);
648 GTUtilsSequenceView::openPopupMenuOnSequenceViewArea(os);
649 GTUtilsTaskTreeView::waitTaskFinished(os);
650
651 GTUtilsMdi::activateWindow(os, "human_T1 [qulifier_rebuilding.gb]");
652
653 checkQualifierRegionsShift(os, 0);
654 }
655
656 } // namespace GUITest_common_scenarios_sequence_edit
657
658 } // namespace U2
659