Index: pkg/polymer/test/build/linter_test.dart |
=================================================================== |
--- pkg/polymer/test/build/linter_test.dart (revision 37373) |
+++ pkg/polymer/test/build/linter_test.dart (working copy) |
@@ -16,8 +16,16 @@ |
}, []); |
group('must have proper initialization imports', () { |
- _testLinter('nothing to report', { |
+ _testLinter('nothing to report (no polymer use)', { |
'a|web/test.html': '<!DOCTYPE html><html>' |
+ '<script type="application/dart" src="foo.dart">' |
+ '</script>' |
+ '<script src="packages/browser/dart.js"></script>' |
+ '</html>', |
+ }, []); |
+ |
+ _testLinter('nothing to report (no polymer use with import)', { |
+ 'a|web/test.html': '<!DOCTYPE html><html>' |
'<link rel="import" href="packages/polymer/polymer.html">' |
'<script type="application/dart" src="foo.dart">' |
'</script>' |
@@ -25,16 +33,83 @@ |
'</html>', |
}, []); |
- _testLinter('missing polymer.html', { |
+ _testLinter('nothing to report (polymer used)', { |
'a|web/test.html': '<!DOCTYPE html><html>' |
+ '<link rel="import" href="packages/polymer/polymer.html">' |
+ '<polymer-element name="x-a"></polymer-element>' |
'<script type="application/dart" src="foo.dart">' |
'</script>' |
'<script src="packages/browser/dart.js"></script>' |
'</html>', |
+ }, []); |
+ |
+ _testLinter('nothing to report (polymer imported transitively)', { |
+ 'a|lib/lib.html': '<!DOCTYPE html><html>' |
+ '<link rel="import" href="../../packages/polymer/polymer.html">', |
+ 'a|web/test.html': '<!DOCTYPE html><html>' |
+ '<link rel="import" href="packages/a/lib.html">' |
+ '<polymer-element name="x-a"></polymer-element>' |
+ '<script type="application/dart" src="foo.dart">' |
+ '</script>' |
+ '<script src="packages/browser/dart.js"></script>' |
+ '</html>', |
+ }, []); |
+ |
+ test('usePolymerHtmlMessage looks right', () { |
+ _check(int i, String url) { |
+ expect(usePolymerHtmlMessage(i), |
+ contains('<link rel="import" href="$url">')); |
+ } |
+ _check(0, 'packages/polymer/polymer.html'); |
+ _check(1, '../packages/polymer/polymer.html'); |
+ _check(2, '../../packages/polymer/polymer.html'); |
+ _check(3, '../../../packages/polymer/polymer.html'); |
+ }); |
+ |
+ _testLinter('missing polymer.html in web', { |
+ 'a|web/test.html': '<!DOCTYPE html><html>\n' |
+ '<polymer-element name="x-a"></polymer-element>' |
+ '<script type="application/dart" src="foo.dart">' |
+ '</script>' |
+ '<script src="packages/browser/dart.js"></script>' |
+ '</html>', |
}, [ |
- 'warning: $USE_POLYMER_HTML', |
+ 'warning: ${usePolymerHtmlMessage(0)} (web/test.html 1 0)', |
]); |
+ _testLinter('missing polymer.html in web/foo', { |
+ 'a|web/foo/test.html': '<!DOCTYPE html><html>\n' |
+ '<polymer-element name="x-a"></polymer-element>' |
+ '<script type="application/dart" src="foo.dart">' |
+ '</script>' |
+ '<script src="packages/browser/dart.js"></script>' |
+ '</html>', |
+ }, [ |
+ 'warning: ${usePolymerHtmlMessage(1)} (web/foo/test.html 1 0)', |
+ ]); |
+ |
+ _testLinter('missing polymer.html in lib', { |
+ 'a|lib/test.html': '<!DOCTYPE html><html>\n' |
+ '<polymer-element name="x-a"></polymer-element>' |
+ '<script type="application/dart" src="foo.dart">' |
+ '</script>' |
+ '<script src="packages/browser/dart.js"></script>' |
+ '</html>', |
+ }, [ |
+ 'warning: ${usePolymerHtmlMessage(2)} (lib/test.html 1 0)', |
+ ]); |
+ |
+ _testLinter('missing polymer.html in lib/foo/bar', { |
+ 'a|lib/foo/bar/test.html': '<!DOCTYPE html><html>\n' |
+ '<polymer-element name="x-a"></polymer-element>' |
+ '<script type="application/dart" src="foo.dart">' |
+ '</script>' |
+ '<script src="packages/browser/dart.js"></script>' |
+ '</html>', |
+ }, [ |
+ 'warning: ${usePolymerHtmlMessage(4)} (lib/foo/bar/test.html 1 0)', |
+ ]); |
+ |
_testLinter('missing Dart code', { |
'a|web/test.html': '<!DOCTYPE html><html>' |
'<link rel="import" href="packages/polymer/polymer.html">' |
@@ -67,7 +142,6 @@ |
_testLinter('missing Dart code and polymer.html', { |
'a|web/test.html': '<!DOCTYPE html><html></html>', |
}, [ |
- 'warning: $USE_POLYMER_HTML', |
'warning: $USE_INIT_DART', |
]); |
}); |
@@ -120,7 +194,6 @@ |
}, [ |
'warning: Unexpected start tag (html). Expected DOCTYPE. ' |
'(web/test.html 0 0)', |
- 'warning: $USE_POLYMER_HTML', |
'warning: $USE_INIT_DART', |
]); |
@@ -132,18 +205,20 @@ |
group('duplicate polymer-elements,', () { |
_testLinter('same file', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"></polymer-element> |
<polymer-element name="x-a"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, [ |
'warning: duplicate definition for custom tag "x-a". ' |
- '(lib/test.html 1 0)', |
+ '(lib/test.html 2 0)', |
'warning: duplicate definition for custom tag "x-a" ' |
- '(second definition). (lib/test.html 2 0)' |
+ '(second definition). (lib/test.html 3 0)' |
]); |
_testLinter('other file', { |
'a|lib/b.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
'a|lib/test.html': '''<html> |
@@ -152,23 +227,25 @@ |
</html>'''.replaceAll(' ', ''), |
}, [ |
'warning: duplicate definition for custom tag "x-a". ' |
- '(lib/b.html 1 0)', |
+ '(lib/b.html 2 0)', |
'warning: duplicate definition for custom tag "x-a" ' |
'(second definition). (lib/test.html 2 0)' |
]); |
_testLinter('non existing file', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<link rel="import" href="b.html"> |
<polymer-element name="x-a"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, [ |
- 'error: couldn\'t find imported asset "lib/b.html" in package ' |
- '"a". (lib/test.html 1 0)' |
+ 'warning: couldn\'t find imported asset "lib/b.html" in package ' |
+ '"a". (lib/test.html 2 0)' |
]); |
_testLinter('other package', { |
'b|lib/b.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
'a|lib/test.html': '''<html> |
@@ -177,7 +254,7 @@ |
</html>'''.replaceAll(' ', ''), |
}, [ |
'warning: duplicate definition for custom tag "x-a". ' |
- '(package:b/b.html 1 0)', |
+ '(package:b/b.html 2 0)', |
'warning: duplicate definition for custom tag "x-a" ' |
'(second definition). (lib/test.html 2 0)' |
]); |
@@ -207,6 +284,7 @@ |
_testLinter('do not nest <polymer-element>', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"> |
<template><div> |
<polymer-element name="b"></polymer-element> |
@@ -215,41 +293,59 @@ |
</html>'''.replaceAll(' ', ''), |
}, [ |
'error: Nested polymer element definitions are not allowed.' |
- ' (lib/test.html 3 4)' |
+ ' (lib/test.html 4 4)' |
]); |
+ _testLinter('do put import inside <polymer-element>', { |
+ 'a|lib/b.html': '<html></html>', |
+ 'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
+ <polymer-element name="x-a"> |
+ <link rel="import" href="b.html"> |
+ <template><div> |
+ </div></template> |
+ </polymer-element> |
+ </html>'''.replaceAll(' ', ''), |
+ }, [ |
+ 'error: $NO_IMPORT_WITHIN_ELEMENT (lib/test.html 3 2)' |
+ ]); |
+ |
_testLinter('need a name for <polymer-element>', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element></polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, [ |
'error: Missing tag name of the custom element. Please include an ' |
- 'attribute like \'name="your-tag-name"\'. (lib/test.html 1 0)' |
+ 'attribute like \'name="your-tag-name"\'. (lib/test.html 2 0)' |
]); |
_testLinter('name for <polymer-element> should have dashes', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="a"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, [ |
'error: Invalid name "a". Custom element names must have at least one' |
' dash and can\'t be any of the following names: annotation-xml, ' |
'color-profile, font-face, font-face-src, font-face-uri, ' |
- 'font-face-format, font-face-name, missing-glyph. (lib/test.html 1 0)' |
+ 'font-face-format, font-face-name, missing-glyph. (lib/test.html 2 0)' |
]); |
_testLinter('extend is a valid element or existing tag', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a" extends="li"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, []); |
_testLinter('extend is a valid element or existing tag', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a" extends="x-b"></polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, [ |
- 'warning: custom element with name "x-b" not found. (lib/test.html 1 0)' |
+ 'warning: custom element with name "x-b" not found. (lib/test.html 2 0)' |
]); |
@@ -265,17 +361,19 @@ |
_testLinter('in polymer-element, .dart url', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"> |
<script src="foo.dart"></script> |
</polymer-element> |
</html>'''.replaceAll(' ', ''), |
}, [ |
'warning: Wrong script type, expected type="application/dart".' |
- ' (lib/test.html 2 0)' |
+ ' (lib/test.html 3 0)' |
]); |
_testLinter('in polymer-element, .js url', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"> |
<script src="foo.js"></script> |
</polymer-element> |
@@ -284,6 +382,7 @@ |
_testLinter('in polymer-element, inlined', { |
'a|lib/test.html': '''<html> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"> |
<script>foo...</script> |
</polymer-element> |
@@ -316,17 +415,11 @@ |
]); |
group('event handlers', () { |
- _testLinter('onfoo is not polymer', { |
+ _testLinter('no longer warn about inline onfoo (Javascript)', { |
'a|lib/test.html': '''<html><body> |
<div onfoo="something"></div> |
'''.replaceAll(' ', ''), |
- }, [ |
- 'warning: Event handler "onfoo" will be interpreted as an inline ' |
- 'JavaScript event handler. Use the form ' |
- 'on-event-name="{{handlerName}}" if you want a Dart handler ' |
- 'that will automatically update the UI based on model changes. ' |
- '(lib/test.html 1 5)' |
- ]); |
+ }, []); |
_testLinter('on-foo is only supported in polymer elements', { |
'a|lib/test.html': '''<html><body> |
@@ -340,6 +433,7 @@ |
_testLinter('on-foo is not an expression', { |
'a|lib/test.html': '''<html><body> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"><div on-foo="{{bar()}}"></div> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -347,11 +441,12 @@ |
'warning: Invalid event handler body "{{bar()}}". Declare a method ' |
'in your custom element "void handlerName(event, detail, target)" ' |
'and use the form on-foo="{{handlerName}}". ' |
- '(lib/test.html 1 33)' |
+ '(lib/test.html 2 33)' |
]); |
_testLinter('on-foo can\'t be empty', { |
'a|lib/test.html': '''<html><body> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"><div on-foo="{{}}"></div> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -359,11 +454,12 @@ |
'warning: Invalid event handler body "{{}}". Declare a method ' |
'in your custom element "void handlerName(event, detail, target)" ' |
'and use the form on-foo="{{handlerName}}". ' |
- '(lib/test.html 1 33)' |
+ '(lib/test.html 2 33)' |
]); |
- _testLinter('on-foo can\'t be empty', { |
+ _testLinter('on-foo can\'t be just space', { |
'a|lib/test.html': '''<html><body> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"><div on-foo="{{ }}"></div> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -371,11 +467,12 @@ |
'warning: Invalid event handler body "{{ }}". Declare a method ' |
'in your custom element "void handlerName(event, detail, target)" ' |
'and use the form on-foo="{{handlerName}}". ' |
- '(lib/test.html 1 33)' |
+ '(lib/test.html 2 33)' |
]); |
_testLinter('on-foo-bar is supported as a custom event name', { |
'a|lib/test.html': '''<html><body> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"><div on-foo-bar="{{quux}}"></div> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -399,6 +496,7 @@ |
_testLinter('used correctly (no base tag)', { |
'a|lib/test.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"></polymer-element> |
<x-a></x-a> |
'''.replaceAll(' ', ''), |
@@ -406,6 +504,7 @@ |
_testLinter('used incorrectly (no base tag)', { |
'a|lib/test.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a"></polymer-element> |
<div is="x-a"></div> |
'''.replaceAll(' ', ''), |
@@ -413,11 +512,13 @@ |
'warning: custom element "x-a" doesn\'t declare any type ' |
'extensions. To fix this, either rewrite this tag as ' |
'<x-a> or add \'extends="div"\' to ' |
- 'the custom element declaration. (lib/test.html 1 0)' |
+ 'the custom element declaration. (lib/test.html 2 0)' |
]); |
_testLinter('used incorrectly, imported def (no base tag)', { |
- 'a|lib/b.html': '<polymer-element name="x-a"></polymer-element>', |
+ 'a|lib/b.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
+ <polymer-element name="x-a"></polymer-element>''', |
'a|lib/test.html': ''' |
<link rel="import" href="b.html"> |
<div is="x-a"></div> |
@@ -431,6 +532,7 @@ |
_testLinter('used correctly (base tag)', { |
'a|lib/b.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a" extends="div"> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -442,6 +544,7 @@ |
_testLinter('used incorrectly (missing base tag)', { |
'a|lib/b.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a" extends="div"> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -458,6 +561,7 @@ |
_testLinter('used incorrectly (wrong base tag)', { |
'a|lib/b.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a" extends="div"> |
</polymer-element> |
'''.replaceAll(' ', ''), |
@@ -472,36 +576,40 @@ |
_testLinter('used incorrectly (wrong base tag, transitive)', { |
'a|lib/c.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-c" extends="li"> |
</polymer-element> |
<polymer-element name="x-b" extends="x-c"> |
</polymer-element> |
'''.replaceAll(' ', ''), |
'a|lib/b.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<link rel="import" href="c.html"> |
<polymer-element name="x-a" extends="x-b"> |
</polymer-element> |
'''.replaceAll(' ', ''), |
'a|lib/test.html': ''' |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<link rel="import" href="b.html"> |
<span is="x-a"></span> |
'''.replaceAll(' ', ''), |
}, [ |
'warning: custom element "x-a" extends from "li". Did you mean ' |
- 'to write <li is="x-a">? (lib/test.html 1 0)' |
+ 'to write <li is="x-a">? (lib/test.html 2 0)' |
]); |
}); |
group('custom attributes', () { |
_testLinter('foo-bar is no longer supported in attributes', { |
'a|lib/test.html': '''<html><body> |
+ <link rel="import" href="../../packages/polymer/polymer.html"> |
<polymer-element name="x-a" attributes="foo-bar"> |
</polymer-element> |
'''.replaceAll(' ', ''), |
}, [ |
'warning: PolymerElement no longer recognizes attribute names with ' |
'dashes such as "foo-bar". Use "fooBar" or "foobar" instead (both ' |
- 'forms are equivalent in HTML). (lib/test.html 1 28)' |
+ 'forms are equivalent in HTML). (lib/test.html 2 28)' |
]); |
}); |