#############################################################################
##
## Copyright (C) 2015 The Qt Company Ltd.
## Contact: http://www.qt.io/licensing
##
## This file is part of Qt Creator.
##
## Commercial License Usage
## Licensees holding valid commercial Qt licenses may use this file in
## accordance with the commercial license agreement provided with the
## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and The Qt Company. For licensing terms and
## conditions see http://www.qt.io/terms-conditions. For further information
## use the contact form at http://www.qt.io/contact-us.
##
## GNU Lesser General Public License Usage
## Alternatively, this file may be used under the terms of the GNU Lesser
## General Public License version 2.1 or version 3 as published by the Free
## Software Foundation and appearing in the file LICENSE.LGPLv21 and
## LICENSE.LGPLv3 included in the packaging of this file. Please review the
## following information to ensure the GNU Lesser General Public License
## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
# http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
##
## In addition, as a special exception, The Qt Company gives you certain additional
## rights. These rights are described in The Qt Company LGPL Exception
## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
##
#############################################################################
source("../../shared/qtcreator.py")
def main():
global testFolder
cppEditorStr = ":Qt Creator_CppEditor::Internal::CPPEditorWidget"
proEditorStr = ":Qt Creator_TextEditor::TextEditorWidget"
testFolder = prepareTemplate(os.path.abspath(os.path.join(os.getcwd(), "..", "shared",
"simplePlainCPP")))
if testFolder == None:
test.fatal("Could not prepare test files - leaving test")
return
if not changeFilePermissions(testFolder, True, False, "testfiles.pro"):
test.fatal("Could not set permissions for files to read-only - test will likely fail.")
startApplication("qtcreator" + SettingsPath)
if not startedWithoutPluginError():
return
openQmakeProject(os.path.join(testFolder, "testfiles.pro"))
modifiedUnsaved = []
readOnlyFiles = []
currentFile = testModifyFile("testfiles.Sources.main\\.cpp", cppEditorStr, "{", True)
modifiedUnsaved.append(currentFile)
readOnlyFiles.append(currentFile)
currentFile = testModifyFile("testfiles.testfiles\\.pro", proEditorStr, "CONFIG -= qt", False)
modifiedUnsaved.append(currentFile)
currentFile = testModifyFile("testfiles.Headers.testfile\\.h", cppEditorStr, "{", True)
modifiedUnsaved.append(currentFile)
readOnlyFiles.append(currentFile)
invokeMenuItem("File", "Exit")
testSaveChangesAndMakeWritable(modifiedUnsaved, readOnlyFiles)
def testModifyFile(fileName, editor, line, expectWarning):
readOnlyWarningStr = ("{text='Warning: You are changing a read-only file.' type='QLabel'"
" unnamed='1' window=':Qt Creator_Core::Internal::MainWindow'}")
simpleFName = simpleFileName(fileName)
test.log("Opening file '%s'" % simpleFName)
openDocument(fileName)
fileNameCombo = waitForObject(":Qt Creator_FilenameQComboBox")
test.compare(str(fileNameCombo.currentText), simpleFName,
"Verifying content of file name combo box.")
checkOpenDocumentsContains(simpleFName)
if not placeCursorToLine(editor, line):
return
type(editor, "")
try:
waitForObject(readOnlyWarningStr, 3000)
if expectWarning:
test.passes("Warning about changing a read-only file appeared.")
else:
test.fail("Warning about changing a read-only file appeared, although changing "
"a writable file. (%s)" % simpleFName)
except:
if expectWarning:
test.fail("Warning about changing a read-only file missing. (%s)" % simpleFName)
else:
test.passes("Warning about changing a read-only file does not come up "
"(changing a writable file).")
test.compare(str(fileNameCombo.currentText), "%s*" % simpleFName,
"Verifying content of file name combo box.")
return checkOpenDocumentsContains("%s*" % simpleFName)
def testSaveChangesAndMakeWritable(modifiedFiles, readOnlyFiles):
saveDlgStr = ("{name='Core__Internal__SaveItemsDialog' type='Core::Internal::SaveItemsDialog' "
"visible='1' windowTitle='Save Changes'}")
try:
waitForObject(saveDlgStr)
except:
test.fail("Save Changes dialog did not come up, but was expected to appear.")
return
treeWidget = waitForObject("{name='treeWidget' type='QTreeWidget' visible='1' window=%s}"
% saveDlgStr)
checkUnsavedChangesContains(treeWidget.model(), modifiedFiles)
clickButton(waitForObject("{text='Save All' type='QPushButton' unnamed='1' visible='1' "
"window=%s}" % saveDlgStr))
try:
filesTree = waitForObject("{name='treeWidget' type='QTreeWidget' visible='1' "
"window=':WritePermissions_Core::Internal::ReadOnlyFilesDialog'}")
items = map(os.path.expanduser, map(os.path.join, dumpItems(filesTree.model(), column=4),
dumpItems(filesTree.model(), column=3)))
difference = set(readOnlyFiles) ^ set(items)
test.verify(len(difference) == 0, "Verifying whether all modified files without write "
"permission are listed.")
clickButton("{text='Change Permission' type='QPushButton' visible='1' unnamed='1' "
"window=':WritePermissions_Core::Internal::ReadOnlyFilesDialog'}")
except:
test.fatal("Missing dialog regarding missing permission on read only files.")
exitCanceled = False
try:
mBoxStr = "{type='QMessageBox' unnamed='1' visible='1' text?='*Could not save the files.'}"
msgBox = waitForObject(mBoxStr, 3000)
test.fatal("Creator failed to set permissions.", str(msgBox.text))
exitCanceled = True
clickButton(waitForObject("{text='OK' type='QPushButton' unnamed='1' visible='1' "
"window=%s}" % mBoxStr))
except:
for current in readOnlyFiles:
test.verify(isWritable(current),
"Checking whether Creator made '%s' writable again." % current)
if exitCanceled:
invokeMenuItem("File", "Exit")
test.log("Exiting without saving.")
waitForObject(saveDlgStr)
clickButton(waitForObject("{text='Do not Save' type='QPushButton' unnamed='1' "
"visible='1' window=%s}" % saveDlgStr))
def checkOpenDocumentsContains(itemName):
selectFromCombo(":Qt Creator_Core::Internal::NavComboBox", "Open Documents")
openDocsTreeViewModel = waitForObject(":OpenDocuments_Widget").model()
result = None
found = False
for index in dumpIndices(openDocsTreeViewModel):
if str(index.data()) == itemName:
found = True
result = index.toolTip
break
test.verify(found, "Check whether 'Open Documents' contains '%s'" % itemName)
return result
def checkUnsavedChangesContains(model, filePaths):
foundItems = map(lambda x: os.path.join(x[0], x[1]), zip(dumpItems(model,column=1),
dumpItems(model, column=0)))
test.compare(set(foundItems), set(filePaths),
"Verifying whether modified (unsaved) files do match expected.")
def cleanup():
global testFolder
if testFolder:
changeFilePermissions(testFolder, True, True, "testfiles.pro")