aboutsummaryrefslogtreecommitdiffstats
path: root/tests/testextension/__init__.py
blob: 0c3f9881c7b9d0f5a56f3c970438ed5e61cb402a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#############################################################################
##
## Copyright (C) 2018 The Qt Company Ltd.
## Contact: http://www.qt.io/licensing/
##
## This file is part of the Python Extensions Plugin for QtCreator.
##
## $QT_BEGIN_LICENSE:BSD$
## You may use this file under the terms of the BSD license as follows:
##
## "Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions are
## met:
##   * Redistributions of source code must retain the above copyright
##     notice, this list of conditions and the following disclaimer.
##   * Redistributions in binary form must reproduce the above copyright
##     notice, this list of conditions and the following disclaimer in
##     the documentation and/or other materials provided with the
##     distribution.
##   * Neither the name of The Qt Company Ltd nor the names of its
##     contributors may be used to endorse or promote products derived
##     from this software without specific prior written permission.
##
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
##
## $QT_END_LICENSE$
##
#############################################################################

# Unit tests for the Python Extensions Plugins
# behavior from the view of an extension.
# To use simply install as an extension and run
# QtCreator. (Outputs to terminal)

import unittest
import os, sys, io

# NOTE: Done here, because the unit-test stuff imports math
math_imported = "math" in sys.modules

# Test Cases

class TestRequirements(unittest.TestCase):

    def test_installed(self):
        """
        Test if numpy was installed as expected
        """
        try:
            import numpy
        except ImportError:
            self.assertTrue(False, msg="Install failed.")

    def test_marked(self):
        """
        Test whether the extensions requirements were
        marked as installed
        """
        self.assertTrue(os.path.exists("{}/requirements.txt.installed".format(sys.path[0])), msg="Install was not marked.")

class TestPath(unittest.TestCase):

    def test_clean(self):
        """
        The sys.path should be sanitized after every script
        is run. This also applies to setup.py
        """
        self.assertFalse("test/path" in sys.path, msg="Sys path not sanitized.")

class TestModules(unittest.TestCase):

    def test_clean(self):
        """
        The imported modules should be cleaned after every
        script. This also applies to setup.py
        """
        self.assertFalse(math_imported, msg="Modules not sanitized.")

    def test_exists_builtin(self):
        """
        Test if the bindings for Core, Utils, ExtensionSystem, and PluginInstance
        exist. These are the bindings that currently ship with the main C++ plugin
        and are non-optional.
        """
        try:
            from PythonExtension import QtCreator
        except ImportError:
            self.assertTrue(False, msg="QtCreator binding module missing.")
        self.assertTrue("Core" in dir(QtCreator), msg="Core module missing.")
        self.assertTrue("Utils" in dir(QtCreator), msg="Utils module missing.")
        self.assertTrue("ExtensionSystem" in dir(QtCreator), msg="ExtensionSystem module missing.")

    def test_exists_optional(self):
        """
        These tests may fail, even if everything is setup correctly, depending on
        which QtCreator plugins are enabled.
        """
        try:
            from PythonExtension import PluginInstance
            from PythonExtension.QtCreator import ProjectExplorer
            from PythonExtension.QtCreator import TextEditor
        except ImportError:
            self.assertTrue(False, msg="Optional binding modules missing.")


# Run Unit Tests

def add_tests(test_case, suite):
    for case in dir(test_case):
        if case[:5] == "test_":
            suite.addTest(test_case(case))

def suite():
    suite = unittest.TestSuite()
    add_tests(TestRequirements, suite)
    add_tests(TestPath, suite)
    add_tests(TestModules, suite)
    return suite

out = io.StringIO()
runner = unittest.TextTestRunner(out)
runner.run(suite())

print(out.getvalue())

# Make test output available from ui

from PythonExtension import QtCreator

QtCreator.Core.MessageManager.write("Python Extensions: Unit test results:\n{}".format(out.getvalue()))