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 <base_dialogs/GTFileDialog.h>
23 #include <base_dialogs/MessageBoxFiller.h>
24 #include <drivers/GTKeyboardDriver.h>
25 #include <drivers/GTMouseDriver.h>
26 #include <primitives/GTLineEdit.h>
27 #include <primitives/GTMenu.h>
28 #include <primitives/GTWidget.h>
29 
30 #include <QDir>
31 #include <QDragEnterEvent>
32 #include <QDropEvent>
33 #include <QFileInfo>
34 #include <QHeaderView>
35 #include <QMainWindow>
36 #include <QTreeView>
37 #include <QUrl>
38 
39 #include <U2Core/AppContext.h>
40 #include <U2Core/ProjectModel.h>
41 
42 #include <U2Gui/ObjectViewModel.h>
43 
44 #include <U2View/ADVConstants.h>
45 #include <U2View/ADVSingleSequenceWidget.h>
46 
47 #include "GTUtilsAnnotationsTreeView.h"
48 #include "GTUtilsProject.h"
49 #include "GTUtilsProjectTreeView.h"
50 #include "GTUtilsSequenceView.h"
51 #include "GTUtilsTaskTreeView.h"
52 #include "api/GTSequenceReadingModeDialogUtils.h"
53 #include "runnables/ugene/ugeneui/CreateNewProjectWidgetFiller.h"
54 #include "runnables/ugene/ugeneui/SaveProjectDialogFiller.h"
55 #include "runnables/ugene/ugeneui/SequenceReadingModeSelectorDialogFiller.h"
56 
57 namespace U2 {
58 
59 #define GT_CLASS_NAME "GTUtilsProject"
60 
openFiles(HI::GUITestOpStatus & os,const QList<QUrl> & urls,const OpenFileSettings & s,ProjectCheckType checkType)61 void GTUtilsProject::openFiles(HI::GUITestOpStatus &os, const QList<QUrl> &urls, const OpenFileSettings &s, ProjectCheckType checkType) {
62     switch (s.openMethod) {
63         case OpenFileSettings::DragDrop:
64             openFilesDrop(os, urls);
65             break;
66         case OpenFileSettings::Dialog:
67             openFilesWithDialog(os, urls);
68             break;
69     }
70     checkProject(os, checkType);
71 }
72 
openFile(HI::GUITestOpStatus & os,const GUrl & path,const OpenFileSettings & s,ProjectCheckType checkType)73 void GTUtilsProject::openFile(HI::GUITestOpStatus &os, const GUrl &path, const OpenFileSettings &s, ProjectCheckType checkType) {
74     openFiles(os, QList<QUrl>() << path.getURLString(), s, checkType);
75     GTUtilsTaskTreeView::waitTaskFinished(os);
76 }
77 
openFileExpectNoProject(HI::GUITestOpStatus & os,const GUrl & path,const OpenFileSettings & s)78 void GTUtilsProject::openFileExpectNoProject(HI::GUITestOpStatus &os, const GUrl &path, const OpenFileSettings &s) {
79     GTUtilsProject::openFile(os, path, s, NotExists);
80 }
81 
82 #define GT_METHOD_NAME "checkProject"
checkProject(HI::GUITestOpStatus & os,ProjectCheckType checkType)83 void GTUtilsProject::checkProject(HI::GUITestOpStatus &os, ProjectCheckType checkType) {
84     GTGlobals::sleep(500);
85 
86     Project *project = AppContext::getProject();
87     if (checkType == NotExists) {
88         GT_CHECK(project == nullptr, "checkProject: There is a project");
89         return;
90     }
91 
92     GT_CHECK(project != nullptr, "There is no project");
93     if (checkType == Empty) {
94         GT_CHECK(project->getDocuments().isEmpty(), "Project is not empty");
95     }
96 }
97 #undef GT_METHOD_NAME
98 
openFilesDrop(HI::GUITestOpStatus & os,const QList<QUrl> & urls)99 void GTUtilsProject::openFilesDrop(HI::GUITestOpStatus &os, const QList<QUrl> &urls) {
100     QWidget *widget = AppContext::getMainWindow()->getQMainWindow();
101     QPoint widgetPos(widget->width() / 2, widget->height() / 2);
102 
103     QMimeData *mimeData = new QMimeData();
104     mimeData->setUrls(urls);
105 
106     Qt::DropActions dropActions = Qt::DropActions(Qt::CopyAction | Qt::MoveAction | Qt::LinkAction);
107     Qt::MouseButtons mouseButtons = Qt::LeftButton;
108 
109     if (urls.size() > 1) {
110         GTUtilsDialog::waitForDialog(os, new GTSequenceReadingModeDialogUtils(os));
111     }
112 
113     QDragEnterEvent *dragEnterEvent = new QDragEnterEvent(widgetPos, dropActions, mimeData, mouseButtons, 0);
114     GTGlobals::sendEvent(widget, dragEnterEvent);
115 
116     QDropEvent *dropEvent = new QDropEvent(widgetPos, dropActions, mimeData, mouseButtons, 0);
117     GTGlobals::sendEvent(widget, dropEvent);
118 }
119 
openFilesWithDialog(HI::GUITestOpStatus & os,const QList<QUrl> & urls)120 void GTUtilsProject::openFilesWithDialog(HI::GUITestOpStatus &os, const QList<QUrl> &urls) {
121     GTUtilsDialog::waitForDialogWhichMayRunOrNot(os, new GTSequenceReadingModeDialogUtils(os));
122     GTUtilsDialog::waitForDialog(os, new GTFileDialogUtils_list(os, QUrl::toStringList(urls)));
123     GTMenu::clickMainMenuItem(os, QStringList() << "File"
124                                                 << "Open...");
125     GTGlobals::sleep(2000);
126     GTUtilsTaskTreeView::waitTaskFinished(os);
127 }
128 
129 #define GT_METHOD_NAME "openFileExpectSequence"
openFileExpectSequence(HI::GUITestOpStatus & os,const QString & dirPath,const QString & fileName,const QString & seqName)130 ADVSingleSequenceWidget *GTUtilsProject::openFileExpectSequence(HI::GUITestOpStatus &os,
131                                                                 const QString &dirPath,
132                                                                 const QString &fileName,
133                                                                 const QString &seqName) {
134     return openFileExpectSequence(os, dirPath + "/" + fileName, seqName);
135 }
136 #undef GT_METHOD_NAME
137 
138 #define GT_METHOD_NAME "openFileExpectSequence"
openFileExpectSequence(GUITestOpStatus & os,const QString & filePath,const QString & seqName)139 ADVSingleSequenceWidget *GTUtilsProject::openFileExpectSequence(GUITestOpStatus &os,
140                                                                 const QString &filePath,
141                                                                 const QString &seqName) {
142     GTFileDialog::openFile(os, filePath);
143     GTUtilsTaskTreeView::waitTaskFinished(os);
144     GT_CHECK_OP_RESULT(os, "Error opening file!", nullptr);
145 
146     GTGlobals::sleep(200);
147 
148     int seqWidgetNum = GTUtilsSequenceView::getSeqWidgetsNumber(os);
149     GT_CHECK_OP_RESULT(os, "Error getting the number of sequence widgets!", nullptr);
150     GT_CHECK_RESULT(1 == seqWidgetNum, QString("Number of sequences is %1").arg(seqWidgetNum), nullptr);
151 
152     ADVSingleSequenceWidget *seqWidget = GTUtilsSequenceView::getSeqWidgetByNumber(os);
153     GT_CHECK_OP_RESULT(os, "Error grtting sequence widget!", nullptr);
154 
155     QString actualName = GTUtilsSequenceView::getSeqName(os, seqWidget);
156     GT_CHECK_OP_RESULT(os, "Error getting sequence widget name!", nullptr);
157     GT_CHECK_RESULT(actualName == seqName, QString("Expected sequence name: %1, actual: %2!").arg(seqName).arg(actualName), nullptr);
158 
159     return seqWidget;
160 }
161 #undef GT_METHOD_NAME
162 
163 #define GT_METHOD_NAME "openFileExpectRawSequence"
openFileExpectRawSequence(HI::GUITestOpStatus & os,const QString & dirPath,const QString & fileName,const QString & seqName)164 ADVSingleSequenceWidget *GTUtilsProject::openFileExpectRawSequence(HI::GUITestOpStatus &os,
165                                                                    const QString &dirPath,
166                                                                    const QString &fileName,
167                                                                    const QString &seqName) {
168     return openFileExpectRawSequence(os, dirPath + "/" + fileName, seqName);
169 }
170 #undef GT_METHOD_NAME
171 
172 #define GT_METHOD_NAME "openFileExpectRawSequence"
openFileExpectRawSequence(GUITestOpStatus & os,const QString & filePath,const QString & seqName)173 ADVSingleSequenceWidget *GTUtilsProject::openFileExpectRawSequence(GUITestOpStatus &os,
174                                                                    const QString &filePath,
175                                                                    const QString &seqName) {
176     GTUtilsDialog::waitForDialog(os, new MessageBoxDialogFiller(os, QMessageBox::Ok));
177     return openFileExpectSequence(os, filePath, seqName);
178 }
179 #undef GT_METHOD_NAME
180 
181 #define GT_METHOD_NAME "openFileExpectSequences"
openFileExpectSequences(HI::GUITestOpStatus & os,const QString & path,const QString & fileName,const QList<QString> & seqNames)182 QList<ADVSingleSequenceWidget *> GTUtilsProject::openFileExpectSequences(HI::GUITestOpStatus &os,
183                                                                          const QString &path,
184                                                                          const QString &fileName,
185                                                                          const QList<QString> &seqNames) {
186     QList<ADVSingleSequenceWidget *> result;
187     GTUtilsDialog::waitForDialog(os, new SequenceReadingModeSelectorDialogFiller(os, SequenceReadingModeSelectorDialogFiller::Separate));
188     GTUtilsProject::openFile(os, path + fileName);
189     GTUtilsTaskTreeView::waitTaskFinished(os);
190     GT_CHECK_OP_RESULT(os, "Error opening file!", QList<ADVSingleSequenceWidget *>());
191 
192     GTGlobals::sleep(200);
193 
194     int seqWidgetNum = GTUtilsSequenceView::getSeqWidgetsNumber(os);
195     GT_CHECK_OP_RESULT(os, "Error getting the number of sequence widgets!", QList<ADVSingleSequenceWidget *>());
196     GT_CHECK_RESULT(seqWidgetNum == seqNames.size(), QString("Expected number of sequences: %1, actual: %2!").arg(seqNames.size()).arg(seqWidgetNum), QList<ADVSingleSequenceWidget *>());
197 
198     for (int i = 0; i < seqNames.size(); ++i) {
199         ADVSingleSequenceWidget *seqWidget = GTUtilsSequenceView::getSeqWidgetByNumber(os, i);
200         GT_CHECK_OP_RESULT(os, QString("Error grtting sequence widget: %1!").arg(i), QList<ADVSingleSequenceWidget *>());
201 
202         QString actualName = GTUtilsSequenceView::getSeqName(os, seqWidget);
203         GT_CHECK_RESULT(seqNames.at(i) == actualName,
204                         QString("Unexpected sequence widget at position %1. Expected sequence name: %2, actual: %3!").arg(i).arg(seqNames.at(i)).arg(actualName),
205                         QList<ADVSingleSequenceWidget *>());
206         result << seqWidget;
207     }
208 
209     return result;
210 }
211 #undef GT_METHOD_NAME
212 
213 #define GT_METHOD_NAME "openMultiSequenceFileAsSequences"
openMultiSequenceFileAsSequences(HI::GUITestOpStatus & os,const QString & path,const QString & fileName)214 void GTUtilsProject::openMultiSequenceFileAsSequences(HI::GUITestOpStatus &os, const QString &path, const QString &fileName) {
215     openMultiSequenceFileAsSequences(os, path + "/" + fileName);
216 }
217 #undef GT_METHOD_NAME
218 
219 #define GT_METHOD_NAME "openMultiSequenceFileAsSequences"
openMultiSequenceFileAsSequences(HI::GUITestOpStatus & os,const QString & filePath)220 void GTUtilsProject::openMultiSequenceFileAsSequences(HI::GUITestOpStatus &os, const QString &filePath) {
221     GTUtilsDialog::waitForDialog(os, new SequenceReadingModeSelectorDialogFiller(os, SequenceReadingModeSelectorDialogFiller::Separate));
222     GTUtilsProject::openFile(os, filePath);
223     GTUtilsTaskTreeView::waitTaskFinished(os);
224 }
225 #undef GT_METHOD_NAME
226 
227 #define GT_METHOD_NAME "openMultiSequenceFileAsMergedSequence"
openMultiSequenceFileAsMergedSequence(HI::GUITestOpStatus & os,const QString & filePath)228 void GTUtilsProject::openMultiSequenceFileAsMergedSequence(HI::GUITestOpStatus &os, const QString &filePath) {
229     GTUtilsDialog::waitForDialog(os, new SequenceReadingModeSelectorDialogFiller(os, SequenceReadingModeSelectorDialogFiller::Merge));
230     GTUtilsProject::openFile(os, filePath);
231     GTUtilsTaskTreeView::waitTaskFinished(os);
232 }
233 #undef GT_METHOD_NAME
234 
235 #define GT_METHOD_NAME "openMultiSequenceFileAsMalignment"
openMultiSequenceFileAsMalignment(HI::GUITestOpStatus & os,const QString & dirPath,const QString & fileName)236 void GTUtilsProject::openMultiSequenceFileAsMalignment(HI::GUITestOpStatus &os, const QString &dirPath, const QString &fileName) {
237     openMultiSequenceFileAsMalignment(os, dirPath + "/" + fileName);
238 }
239 #undef GT_METHOD_NAME
240 
241 #define GT_METHOD_NAME "openMultiSequenceFileAsMalignment"
openMultiSequenceFileAsMalignment(HI::GUITestOpStatus & os,const QString & filePath)242 void GTUtilsProject::openMultiSequenceFileAsMalignment(HI::GUITestOpStatus &os, const QString &filePath) {
243     GTUtilsDialog::waitForDialog(os, new SequenceReadingModeSelectorDialogFiller(os, SequenceReadingModeSelectorDialogFiller::Join));
244     GTUtilsProject::openFile(os, filePath);
245     GTUtilsTaskTreeView::waitTaskFinished(os);
246 }
247 #undef GT_METHOD_NAME
248 
249 #define GT_METHOD_NAME "saveProjectAs"
saveProjectAs(HI::GUITestOpStatus & os,const QString & path)250 void GTUtilsProject::saveProjectAs(HI::GUITestOpStatus &os, const QString &path) {
251     const QFileInfo info(path);
252     GTUtilsDialog::waitForDialog(os, new SaveProjectAsDialogFiller(os, "New Project", info.absoluteFilePath()));
253     GTMenu::clickMainMenuItem(os, QStringList() << "File"
254                                                 << "Save project as...");
255 }
256 #undef GT_METHOD_NAME
257 
258 #define GT_METHOD_NAME "closeProjectDeprecated"
closeProject(HI::GUITestOpStatus & os)259 void GTUtilsProject::closeProject(HI::GUITestOpStatus &os) {
260     GTUtilsDialog::waitForDialogWhichMayRunOrNot(os, new SaveProjectDialogFiller(os, QDialogButtonBox::No));
261     GTUtilsDialog::waitForDialogWhichMayRunOrNot(os, new AppCloseMessageBoxDialogFiller(os));
262     GTGlobals::sleep(500);
263     GTMenu::clickMainMenuItem(os, QStringList() << "File"
264                                                 << "Close project");
265 }
266 #undef GT_METHOD_NAME
267 
268 #define GT_METHOD_NAME "closeProject"
closeProject(HI::GUITestOpStatus & os,bool isExpectSaveProjectDialog)269 void GTUtilsProject::closeProject(HI::GUITestOpStatus &os, bool isExpectSaveProjectDialog) {
270     if (isExpectSaveProjectDialog) {
271         GTUtilsDialog::waitForDialog(os, new SaveProjectDialogFiller(os, QDialogButtonBox::No));
272     }
273     GTMenu::clickMainMenuItem(os, {"File", "Close project"});
274 }
275 #undef GT_METHOD_NAME
276 
OpenFileSettings()277 GTUtilsProject::OpenFileSettings::OpenFileSettings()
278     : openMethod(Dialog) {
279 }
280 
281 #undef GT_CLASS_NAME
282 
283 }  // namespace U2
284