- add sources.
[platform/framework/web/crosswalk.git] / src / third_party / closure_linter / closure_linter / fixjsstyle_test.py
1 #!/usr/bin/env python
2 #
3 # Copyright 2008 The Closure Linter Authors. All Rights Reserved.
4 #
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
8 #
9 #      http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS-IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
16
17 """Medium tests for the gpylint auto-fixer."""
18
19 __author__ = 'robbyw@google.com (Robby Walker)'
20
21 import StringIO
22
23 import gflags as flags
24 import unittest as googletest
25 from closure_linter import checker
26 from closure_linter import error_fixer
27
28 _RESOURCE_PREFIX = 'closure_linter/testdata'
29
30 flags.FLAGS.strict = True
31 flags.FLAGS.limited_doc_files = ('dummy.js', 'externs.js')
32 flags.FLAGS.closurized_namespaces = ('goog', 'dummy')
33
34
35 class FixJsStyleTest(googletest.TestCase):
36   """Test case to for gjslint auto-fixing."""
37
38   def testFixJsStyle(self):
39     test_cases = [['fixjsstyle.in.js', 'fixjsstyle.out.js'],
40                   ['indentation.js', 'fixjsstyle.indentation.out.js']]
41     for [running_input_file, running_output_file] in test_cases:
42       input_filename = None
43       golden_filename = None
44       current_filename = None
45       try:
46         input_filename = '%s/%s' % (_RESOURCE_PREFIX, running_input_file)
47         current_filename = input_filename
48
49         golden_filename = '%s/%s' % (_RESOURCE_PREFIX, running_output_file)
50         current_filename = golden_filename
51       except IOError, ex:
52         raise IOError('Could not find testdata resource for %s: %s' %
53                       (current_filename, ex))
54
55       if running_input_file == 'fixjsstyle.in.js':
56         with open(input_filename) as f:
57           for line in f:
58             # Go to last line.
59             pass
60           self.assertTrue(line == line.rstrip(), '%s file should not end '
61                           'with a new line.' % (input_filename))
62
63       # Autofix the file, sending output to a fake file.
64       actual = StringIO.StringIO()
65       style_checker = checker.JavaScriptStyleChecker(
66           error_fixer.ErrorFixer(actual))
67       style_checker.Check(input_filename)
68
69       # Now compare the files.
70       actual.seek(0)
71       expected = open(golden_filename, 'r')
72
73       self.assertEqual(actual.readlines(), expected.readlines())
74
75   def testMissingExtraAndUnsortedRequires(self):
76     """Tests handling of missing extra and unsorted goog.require statements."""
77     original = [
78         "goog.require('dummy.aa');",
79         "goog.require('dummy.Cc');",
80         "goog.require('dummy.Dd');",
81         "",
82         "var x = new dummy.Bb();",
83         "dummy.Cc.someMethod();",
84         "dummy.aa.someMethod();",
85         ]
86
87     expected = [
88         "goog.require('dummy.Bb');",
89         "goog.require('dummy.Cc');",
90         "goog.require('dummy.aa');",
91         "",
92         "var x = new dummy.Bb();",
93         "dummy.Cc.someMethod();",
94         "dummy.aa.someMethod();",
95         ]
96
97     self._AssertFixes(original, expected)
98
99   def testMissingExtraAndUnsortedProvides(self):
100     """Tests handling of missing extra and unsorted goog.provide statements."""
101     original = [
102         "goog.provide('dummy.aa');",
103         "goog.provide('dummy.Cc');",
104         "goog.provide('dummy.Dd');",
105         "",
106         "dummy.Cc = function() {};",
107         "dummy.Bb = function() {};",
108         "dummy.aa.someMethod = function();",
109         ]
110
111     expected = [
112         "goog.provide('dummy.Bb');",
113         "goog.provide('dummy.Cc');",
114         "goog.provide('dummy.aa');",
115         "",
116         "dummy.Cc = function() {};",
117         "dummy.Bb = function() {};",
118         "dummy.aa.someMethod = function();",
119         ]
120
121     self._AssertFixes(original, expected)
122
123   def testNoRequires(self):
124     """Tests positioning of missing requires without existing requires."""
125     original = [
126         "goog.provide('dummy.Something');",
127         "",
128         "dummy.Something = function() {};",
129         "",
130         "var x = new dummy.Bb();",
131         ]
132
133     expected = [
134         "goog.provide('dummy.Something');",
135         "",
136         "goog.require('dummy.Bb');",
137         "",
138         "dummy.Something = function() {};",
139         "",
140         "var x = new dummy.Bb();",
141         ]
142
143     self._AssertFixes(original, expected)
144
145   def testNoProvides(self):
146     """Tests positioning of missing provides without existing provides."""
147     original = [
148         "goog.require('dummy.Bb');",
149         "",
150         "dummy.Something = function() {};",
151         "",
152         "var x = new dummy.Bb();",
153         ]
154
155     expected = [
156         "goog.provide('dummy.Something');",
157         "",
158         "goog.require('dummy.Bb');",
159         "",
160         "dummy.Something = function() {};",
161         "",
162         "var x = new dummy.Bb();",
163         ]
164
165     self._AssertFixes(original, expected)
166
167   def testGoogScopeIndentation(self):
168     """Tests Handling a typical end-of-scope indentation fix."""
169     original = [
170         'goog.scope(function() {',
171         '  // TODO(brain): Take over the world.',
172         '});  // goog.scope',
173         ]
174
175     expected = [
176         'goog.scope(function() {',
177         '// TODO(brain): Take over the world.',
178         '});  // goog.scope',
179         ]
180
181     self._AssertFixes(original, expected)
182
183   def testMissingEndOfScopeComment(self):
184     """Tests Handling a missing comment at end of goog.scope."""
185     original = [
186         'goog.scope(function() {',
187         '});',
188         ]
189
190     expected = [
191         'goog.scope(function() {',
192         '});  // goog.scope',
193         ]
194
195     self._AssertFixes(original, expected)
196
197   def testMissingEndOfScopeCommentWithOtherComment(self):
198     """Tests handling an irrelevant comment at end of goog.scope."""
199     original = [
200         'goog.scope(function() {',
201         "});  // I don't belong here!",
202         ]
203
204     expected = [
205         'goog.scope(function() {',
206         '});  // goog.scope',
207         ]
208
209     self._AssertFixes(original, expected)
210
211   def testMalformedEndOfScopeComment(self):
212     """Tests Handling a malformed comment at end of goog.scope."""
213     original = [
214         'goog.scope(function() {',
215         '});  // goog.scope FTW',
216         ]
217
218     expected = [
219         'goog.scope(function() {',
220         '});  // goog.scope',
221         ]
222
223     self._AssertFixes(original, expected)
224
225   def _AssertFixes(self, original, expected):
226     """Asserts that the error fixer corrects original to expected."""
227     original = self._GetHeader() + original
228     expected = self._GetHeader() + expected
229
230     actual = StringIO.StringIO()
231     style_checker = checker.JavaScriptStyleChecker(
232         error_fixer.ErrorFixer(actual))
233     style_checker.CheckLines('testing.js', original, False)
234     actual.seek(0)
235
236     expected = [x + '\n' for x in expected]
237
238     self.assertListEqual(actual.readlines(), expected)
239
240   def _GetHeader(self):
241     """Returns a fake header for a JavaScript file."""
242     return [
243         "// Copyright 2011 Google Inc. All Rights Reserved.",
244         "",
245         "/**",
246         " * @fileoverview Fake file overview.",
247         " * @author fake@google.com (Fake Person)",
248         " */",
249         ""
250         ]
251
252
253 if __name__ == '__main__':
254   googletest.main()