Index: third_party/closure_linter/closure_linter/fixjsstyle_test.py |
diff --git a/third_party/closure_linter/closure_linter/fixjsstyle_test.py b/third_party/closure_linter/closure_linter/fixjsstyle_test.py |
index 5096568ded24af03960f85efe2a79a203c1e8de4..37eca9f1ab1e72fa0dd7affd661baa518dbd72d0 100755 |
--- a/third_party/closure_linter/closure_linter/fixjsstyle_test.py |
+++ b/third_party/closure_linter/closure_linter/fixjsstyle_test.py |
@@ -1,5 +1,4 @@ |
#!/usr/bin/env python |
-# |
# Copyright 2008 The Closure Linter Authors. All Rights Reserved. |
# |
# Licensed under the Apache License, Version 2.0 (the "License"); |
@@ -22,8 +21,9 @@ import StringIO |
import gflags as flags |
import unittest as googletest |
-from closure_linter import checker |
from closure_linter import error_fixer |
+from closure_linter import runner |
+ |
_RESOURCE_PREFIX = 'closure_linter/testdata' |
@@ -36,8 +36,10 @@ class FixJsStyleTest(googletest.TestCase): |
"""Test case to for gjslint auto-fixing.""" |
def testFixJsStyle(self): |
- test_cases = [['fixjsstyle.in.js', 'fixjsstyle.out.js'], |
- ['indentation.js', 'fixjsstyle.indentation.out.js']] |
+ test_cases = [ |
+ ['fixjsstyle.in.js', 'fixjsstyle.out.js'], |
+ ['indentation.js', 'fixjsstyle.indentation.out.js'], |
+ ['fixjsstyle.html.in.html', 'fixjsstyle.html.out.html']] |
for [running_input_file, running_output_file] in test_cases: |
input_filename = None |
golden_filename = None |
@@ -48,7 +50,7 @@ class FixJsStyleTest(googletest.TestCase): |
golden_filename = '%s/%s' % (_RESOURCE_PREFIX, running_output_file) |
current_filename = golden_filename |
- except IOError, ex: |
+ except IOError as ex: |
raise IOError('Could not find testdata resource for %s: %s' % |
(current_filename, ex)) |
@@ -62,9 +64,7 @@ class FixJsStyleTest(googletest.TestCase): |
# Autofix the file, sending output to a fake file. |
actual = StringIO.StringIO() |
- style_checker = checker.JavaScriptStyleChecker( |
- error_fixer.ErrorFixer(actual)) |
- style_checker.Check(input_filename) |
+ runner.Run(input_filename, error_fixer.ErrorFixer(actual)) |
# Now compare the files. |
actual.seek(0) |
@@ -72,50 +72,134 @@ class FixJsStyleTest(googletest.TestCase): |
self.assertEqual(actual.readlines(), expected.readlines()) |
+ def testUnsortedRequires(self): |
+ """Tests handling of unsorted goog.require statements without header. |
+ |
+ Bug 8398202. |
+ """ |
+ original = [ |
+ 'goog.require(\'dummy.aa\');', |
+ 'goog.require(\'dummy.Cc\');', |
+ 'goog.require(\'dummy.Dd\');', |
+ '', |
+ 'function a() {', |
+ ' dummy.aa.i = 1;', |
+ ' dummy.Cc.i = 1;', |
+ ' dummy.Dd.i = 1;', |
+ '}', |
+ ] |
+ |
+ expected = [ |
+ 'goog.require(\'dummy.Cc\');', |
+ 'goog.require(\'dummy.Dd\');', |
+ 'goog.require(\'dummy.aa\');', |
+ '', |
+ 'function a() {', |
+ ' dummy.aa.i = 1;', |
+ ' dummy.Cc.i = 1;', |
+ ' dummy.Dd.i = 1;', |
+ '}', |
+ ] |
+ |
+ self._AssertFixes(original, expected, include_header=False) |
+ |
def testMissingExtraAndUnsortedRequires(self): |
"""Tests handling of missing extra and unsorted goog.require statements.""" |
original = [ |
- "goog.require('dummy.aa');", |
- "goog.require('dummy.Cc');", |
- "goog.require('dummy.Dd');", |
- "", |
- "var x = new dummy.Bb();", |
- "dummy.Cc.someMethod();", |
- "dummy.aa.someMethod();", |
+ 'goog.require(\'dummy.aa\');', |
+ 'goog.require(\'dummy.Cc\');', |
+ 'goog.require(\'dummy.Dd\');', |
+ '', |
+ 'var x = new dummy.Bb();', |
+ 'dummy.Cc.someMethod();', |
+ 'dummy.aa.someMethod();', |
] |
expected = [ |
- "goog.require('dummy.Bb');", |
- "goog.require('dummy.Cc');", |
- "goog.require('dummy.aa');", |
- "", |
- "var x = new dummy.Bb();", |
- "dummy.Cc.someMethod();", |
- "dummy.aa.someMethod();", |
+ 'goog.require(\'dummy.Bb\');', |
+ 'goog.require(\'dummy.Cc\');', |
+ 'goog.require(\'dummy.aa\');', |
+ '', |
+ 'var x = new dummy.Bb();', |
+ 'dummy.Cc.someMethod();', |
+ 'dummy.aa.someMethod();', |
] |
self._AssertFixes(original, expected) |
+ def testExtraRequireOnFirstLine(self): |
+ """Tests handling of extra goog.require statement on the first line. |
+ |
+ There was a bug when fixjsstyle quits with an exception. It happened if |
+ - the first line of the file is an extra goog.require() statement, |
+ - goog.require() statements are not sorted. |
+ """ |
+ original = [ |
+ 'goog.require(\'dummy.aa\');', |
+ 'goog.require(\'dummy.cc\');', |
+ 'goog.require(\'dummy.bb\');', |
+ '', |
+ 'var x = new dummy.bb();', |
+ 'var y = new dummy.cc();', |
+ ] |
+ |
+ expected = [ |
+ 'goog.require(\'dummy.bb\');', |
+ 'goog.require(\'dummy.cc\');', |
+ '', |
+ 'var x = new dummy.bb();', |
+ 'var y = new dummy.cc();', |
+ ] |
+ |
+ self._AssertFixes(original, expected, include_header=False) |
+ |
+ def testUnsortedProvides(self): |
+ """Tests handling of unsorted goog.provide statements without header. |
+ |
+ Bug 8398202. |
+ """ |
+ original = [ |
+ 'goog.provide(\'dummy.aa\');', |
+ 'goog.provide(\'dummy.Cc\');', |
+ 'goog.provide(\'dummy.Dd\');', |
+ '', |
+ 'dummy.aa = function() {};' |
+ 'dummy.Cc = function() {};' |
+ 'dummy.Dd = function() {};' |
+ ] |
+ |
+ expected = [ |
+ 'goog.provide(\'dummy.Cc\');', |
+ 'goog.provide(\'dummy.Dd\');', |
+ 'goog.provide(\'dummy.aa\');', |
+ '', |
+ 'dummy.aa = function() {};' |
+ 'dummy.Cc = function() {};' |
+ 'dummy.Dd = function() {};' |
+ ] |
+ |
+ self._AssertFixes(original, expected, include_header=False) |
+ |
def testMissingExtraAndUnsortedProvides(self): |
"""Tests handling of missing extra and unsorted goog.provide statements.""" |
original = [ |
- "goog.provide('dummy.aa');", |
- "goog.provide('dummy.Cc');", |
- "goog.provide('dummy.Dd');", |
- "", |
- "dummy.Cc = function() {};", |
- "dummy.Bb = function() {};", |
- "dummy.aa.someMethod = function();", |
+ 'goog.provide(\'dummy.aa\');', |
+ 'goog.provide(\'dummy.Cc\');', |
+ 'goog.provide(\'dummy.Dd\');', |
+ '', |
+ 'dummy.Cc = function() {};', |
+ 'dummy.Bb = function() {};', |
+ 'dummy.aa.someMethod = function();', |
] |
expected = [ |
- "goog.provide('dummy.Bb');", |
- "goog.provide('dummy.Cc');", |
- "goog.provide('dummy.aa');", |
- "", |
- "dummy.Cc = function() {};", |
- "dummy.Bb = function() {};", |
- "dummy.aa.someMethod = function();", |
+ 'goog.provide(\'dummy.Bb\');', |
+ 'goog.provide(\'dummy.Cc\');', |
+ 'goog.provide(\'dummy.aa\');', |
+ '', |
+ 'dummy.Cc = function() {};', |
+ 'dummy.Bb = function() {};', |
+ 'dummy.aa.someMethod = function();', |
] |
self._AssertFixes(original, expected) |
@@ -123,21 +207,21 @@ class FixJsStyleTest(googletest.TestCase): |
def testNoRequires(self): |
"""Tests positioning of missing requires without existing requires.""" |
original = [ |
- "goog.provide('dummy.Something');", |
- "", |
- "dummy.Something = function() {};", |
- "", |
- "var x = new dummy.Bb();", |
+ 'goog.provide(\'dummy.Something\');', |
+ '', |
+ 'dummy.Something = function() {};', |
+ '', |
+ 'var x = new dummy.Bb();', |
] |
expected = [ |
- "goog.provide('dummy.Something');", |
- "", |
- "goog.require('dummy.Bb');", |
- "", |
- "dummy.Something = function() {};", |
- "", |
- "var x = new dummy.Bb();", |
+ 'goog.provide(\'dummy.Something\');', |
+ '', |
+ 'goog.require(\'dummy.Bb\');', |
+ '', |
+ 'dummy.Something = function() {};', |
+ '', |
+ 'var x = new dummy.Bb();', |
] |
self._AssertFixes(original, expected) |
@@ -145,25 +229,35 @@ class FixJsStyleTest(googletest.TestCase): |
def testNoProvides(self): |
"""Tests positioning of missing provides without existing provides.""" |
original = [ |
- "goog.require('dummy.Bb');", |
- "", |
- "dummy.Something = function() {};", |
- "", |
- "var x = new dummy.Bb();", |
+ 'goog.require(\'dummy.Bb\');', |
+ '', |
+ 'dummy.Something = function() {};', |
+ '', |
+ 'var x = new dummy.Bb();', |
] |
expected = [ |
- "goog.provide('dummy.Something');", |
- "", |
- "goog.require('dummy.Bb');", |
- "", |
- "dummy.Something = function() {};", |
- "", |
- "var x = new dummy.Bb();", |
+ 'goog.provide(\'dummy.Something\');', |
+ '', |
+ 'goog.require(\'dummy.Bb\');', |
+ '', |
+ 'dummy.Something = function() {};', |
+ '', |
+ 'var x = new dummy.Bb();', |
] |
self._AssertFixes(original, expected) |
+ def testOutputOkayWhenFirstTokenIsDeleted(self): |
+ """Tests that autofix output is is correct when first token is deleted. |
+ |
+ Regression test for bug 4581567 |
+ """ |
+ original = ['"use strict";'] |
+ expected = ["'use strict';"] |
+ |
+ self._AssertFixes(original, expected, include_header=False) |
+ |
def testGoogScopeIndentation(self): |
"""Tests Handling a typical end-of-scope indentation fix.""" |
original = [ |
@@ -222,15 +316,68 @@ class FixJsStyleTest(googletest.TestCase): |
self._AssertFixes(original, expected) |
- def _AssertFixes(self, original, expected): |
+ def testEndsWithIdentifier(self): |
+ """Tests Handling case where script ends with identifier. Bug 7643404.""" |
+ original = [ |
+ 'goog.provide(\'xyz\');', |
+ '', |
+ 'abc' |
+ ] |
+ |
+ expected = [ |
+ 'goog.provide(\'xyz\');', |
+ '', |
+ 'abc;' |
+ ] |
+ |
+ self._AssertFixes(original, expected) |
+ |
+ def testFileStartsWithSemicolon(self): |
+ """Tests handling files starting with semicolon. |
+ |
+ b/10062516 |
+ """ |
+ original = [ |
+ ';goog.provide(\'xyz\');', |
+ '', |
+ 'abc;' |
+ ] |
+ |
+ expected = [ |
+ 'goog.provide(\'xyz\');', |
+ '', |
+ 'abc;' |
+ ] |
+ |
+ self._AssertFixes(original, expected, include_header=False) |
+ |
+ def testCodeStartsWithSemicolon(self): |
+ """Tests handling code in starting with semicolon after comments. |
+ |
+ b/10062516 |
+ """ |
+ original = [ |
+ ';goog.provide(\'xyz\');', |
+ '', |
+ 'abc;' |
+ ] |
+ |
+ expected = [ |
+ 'goog.provide(\'xyz\');', |
+ '', |
+ 'abc;' |
+ ] |
+ |
+ self._AssertFixes(original, expected) |
+ |
+ def _AssertFixes(self, original, expected, include_header=True): |
"""Asserts that the error fixer corrects original to expected.""" |
- original = self._GetHeader() + original |
- expected = self._GetHeader() + expected |
+ if include_header: |
+ original = self._GetHeader() + original |
+ expected = self._GetHeader() + expected |
actual = StringIO.StringIO() |
- style_checker = checker.JavaScriptStyleChecker( |
- error_fixer.ErrorFixer(actual)) |
- style_checker.CheckLines('testing.js', original, False) |
+ runner.Run('testing.js', error_fixer.ErrorFixer(actual), original) |
actual.seek(0) |
expected = [x + '\n' for x in expected] |
@@ -240,13 +387,13 @@ class FixJsStyleTest(googletest.TestCase): |
def _GetHeader(self): |
"""Returns a fake header for a JavaScript file.""" |
return [ |
- "// Copyright 2011 Google Inc. All Rights Reserved.", |
- "", |
- "/**", |
- " * @fileoverview Fake file overview.", |
- " * @author fake@google.com (Fake Person)", |
- " */", |
- "" |
+ '// Copyright 2011 Google Inc. All Rights Reserved.', |
+ '', |
+ '/**', |
+ ' * @fileoverview Fake file overview.', |
+ ' * @author fake@google.com (Fake Person)', |
+ ' */', |
+ '' |
] |