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