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