Completed
Pull Request — master (#2423)
by
unknown
01:53
created

GeneralDocumentationCommentTest   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 63
rs 10
wmc 8

3 Methods

Rating   Name   Duplication   Size   Complexity  
B test_fields() 0 34 1
A test_not_implemented() 0 7 2
B test_from_metadata() 0 18 5
1
import unittest
2
3
from coalib.bearlib.languages.documentation.DocstyleDefinition import (
4
    DocstyleDefinition)
5
from coalib.bearlib.languages.documentation.DocumentationComment import (
6
    DocumentationComment)
7
from coalib.bearlib.languages.documentation.DocumentationExtraction import (
8
    extract_documentation)
9
from tests.bearlib.languages.documentation.TestUtils import (
10
    load_testdata)
11
12
13
class DocumentationCommentTest(unittest.TestCase):
14
15
    Description = DocumentationComment.Description
16
    Parameter = DocumentationComment.Parameter
17
    ReturnValue = DocumentationComment.ReturnValue
18
19
    Metadata = DocstyleDefinition.Metadata
20
21
22
class GeneralDocumentationCommentTest(DocumentationCommentTest):
23
24
    def test_fields(self):
25
        c_doxygen = DocstyleDefinition.load("C", "doxygen")
26
        uut = DocumentationComment("my doc",
27
                                   c_doxygen,
28
                                   " ",
29
                                   ("/**", "*", "*/"),
30
                                   (25, 45))
31
32
        self.assertEqual(uut.documentation, "my doc")
33
        self.assertEqual(uut.language, "c")
34
        self.assertEqual(uut.docstyle, "doxygen")
35
        self.assertEqual(uut.indent, " ")
36
        self.assertEqual(str(uut), "my doc")
37
        self.assertEqual(uut.marker, ("/**", "*", "*/"))
38
        self.assertEqual(uut.range, (25, 45))
39
40
        python_doxygen = DocstyleDefinition.load("python", "doxygen")
41
42
        python_doxygen_metadata = self.Metadata("@param ", " ", "@return ")
43
44
        uut = DocumentationComment("qwertzuiop",
45
                                   python_doxygen,
46
                                   "\t",
47
                                   ("##", "#", "#"),
48
                                   None)
49
50
        self.assertEqual(uut.documentation, "qwertzuiop")
51
        self.assertEqual(uut.language, "python")
52
        self.assertEqual(uut.docstyle, "doxygen")
53
        self.assertEqual(uut.indent, "\t")
54
        self.assertEqual(str(uut), "qwertzuiop")
55
        self.assertEqual(uut.marker, ("##", "#", "#"))
56
        self.assertEqual(uut.range, None)
57
        self.assertEqual(uut.metadata, python_doxygen_metadata)
58
59
    def test_not_implemented(self):
60
        raw_docstyle = DocstyleDefinition("nolang", "nostyle", ('', '', ''),
61
                                          self.Metadata('', '', ''))
62
        not_implemented = DocumentationComment(
63
            "some docs", raw_docstyle, None, None, None)
64
        with self.assertRaises(NotImplementedError):
65
            not_implemented.parse()
66
67
    def test_from_metadata(self):
68
69
        data = load_testdata("default.py")
70
71
        original = [doc.documentation for doc in
72
                    extract_documentation(data, "python", "default")]
73
74
        parsed_docs = [(doc.parse(), doc.marker, doc.indent, doc.range)
75
                       for doc in
76
                       extract_documentation(data, "python", "default")]
77
78
        docstyle_definition = DocstyleDefinition.load("python", "default")
79
80
        assembled_docs = [DocumentationComment.from_metadata(
81
                          doc[0], docstyle_definition, doc[1], doc[2], doc[3])
82
                          for doc in parsed_docs]
83
84
        self.assertEqual([str(doc) for doc in assembled_docs], original)
85
86
87
class PythonDocumentationCommentTest(DocumentationCommentTest):
88
89
    def check_docstring(self, docstring, expected=[]):
90
        self.assertIsInstance(docstring,
91
                              str,
92
                              "expected needs to be a string for this test.")
93
94
        self.assertIsInstance(expected,
95
                              list,
96
                              "expected needs to be a list for this test.")
97
98
        python_default = DocstyleDefinition.load("python", "default")
99
100
        doc_comment = DocumentationComment(docstring, python_default,
101
                                           None, None, None)
102
        parsed_metadata = doc_comment.parse()
103
        self.assertEqual(parsed_metadata, expected)
104
105
    def test_empty_docstring(self):
106
        self.check_docstring("", [])
107
108
    def test_description(self):
109
        doc = " description only "
110
        self.check_docstring(doc, [self.Description(desc=' description only ')])
111
112
    def test_params_default(self):
113
        self.maxDiff = None
114
        doc = (" :param test:  test description1 \n"
115
               " :param test:  test description2 \n")
116
        expected = [self.Parameter(name='test', desc='  test description1 \n'),
117
                    self.Parameter(name='test', desc='  test description2 \n')]
118
        self.check_docstring(doc, expected)
119
120
    def test_return_values_default(self):
121
        doc = (" :return: something1 \n"
122
               " :return: something2 ")
123
        expected = [self.ReturnValue(desc=' something1 \n'),
124
                    self.ReturnValue(desc=' something2 ')]
125
        self.check_docstring(doc, expected)
126
127 View Code Duplication
    def test_python_default(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
128
        data = load_testdata("default.py")
129
130
        parsed_docs = [doc.parse() for doc in
131
                       extract_documentation(data, "python", "default")]
132
133
        expected = [
134
            [self.Description(desc='\nModule description.\n\n'
135
                                   'Some more foobar-like text.\n')],
136
            [self.Description(desc='\nA nice and neat way of '
137
                                   'documenting code.\n'),
138
             self.Parameter(name='radius', desc=' The explosion radius. ')],
139
            [self.Description(desc='A function that returns 55.')],
140
            [self.Description(desc='\nDocstring with layouted text.\n\n    '
141
                                   'layouts inside docs are preserved.'
142
                                   '\nthis is intended.\n')],
143
            [self.Description(desc=' Docstring inline with triple quotes.\n'
144
                                   '    Continues here. ')],
145
            [self.Description(desc='\nThis is the best docstring ever!\n\n'),
146
             self.Parameter(name='param1',
147
                            desc='\n    Very Very Long Parameter '
148
                                 'description.\n'),
149
             self.Parameter(name='param2',
150
                            desc='\n    Short Param description.\n\n'),
151
             self.ReturnValue(desc=' Long Return Description That Makes No '
152
                                   'Sense And Will\n         Cut to the Next'
153
                                   ' Line.\n')]]
154
155
        self.assertEqual(parsed_docs, expected)
156
157 View Code Duplication
    def test_python_doxygen(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
158
        data = load_testdata("doxygen.py")
159
160
        parsed_docs = [doc.parse() for doc in
161
                       extract_documentation(data, "python", "doxygen")]
162
163
        expected = [
164
            [self.Description(desc=' @package pyexample\n  Documentation for'
165
                                   ' this module.\n\n  More details.\n')],
166
            [self.Description(
167
                desc=' Documentation for a class.\n\n More details.\n')],
168
            [self.Description(desc=' The constructor.\n')],
169
            [self.Description(desc=' Documentation for a method.\n'),
170
             self.Parameter(name='self', desc='The object pointer.\n')],
171
            [self.Description(desc=' A class variable.\n')],
172
            [self.Description(desc=' @var _memVar\n  a member variable\n')],
173
            [self.Description(desc=' This is the best docstring ever!\n\n'),
174
             self.Parameter(name='param1', desc='Parameter 1\n'),
175
             self.Parameter(name='param2', desc='Parameter 2\n'),
176
             self.ReturnValue(desc='Nothing\n')]]
177
178
        self.assertEqual(parsed_docs, expected)
179
180
181
class JavaDocumentationCommentTest(DocumentationCommentTest):
182
183
    def test_java_default(self):
184
        data = load_testdata("default.java")
185
186
        parsed_docs = [doc.parse() for doc in
187
                       extract_documentation(data, "java", "default")]
188
189
        expected = [[self.Description(
190
                     desc='\n Returns an String that says Hello with the name'
191
                          ' argument.\n\n'),
192
                     self.Parameter(name='name',
193
                                    desc='the name to which to say hello\n'),
194
                     self.ReturnValue(
195
                         desc='     the concatenated string\n')]]
196
197
        self.assertEqual(expected, parsed_docs)
198
199
200
class DocumentationAssemblyTest(unittest.TestCase):
201
202
    def test_python_assembly(self):
203
204
        data = load_testdata("default.py")
205
        docs = "".join(data)
206
207
        for doc in extract_documentation(data, "python", "default"):
208
            self.assertIn(doc.assemble(), docs)
209
210
    def test_c_assembly(self):
211
212
        data = load_testdata("default.c")
213
        docs = "".join(data)
214
215
        for doc in extract_documentation(data, "c", "doxygen"):
216
            self.assertIn(doc.assemble(), docs)
217