// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library polymer.test.linter_test;

import 'package:polymer/src/build/common.dart';
import 'package:polymer/src/build/linter.dart';
import 'package:source_maps/span.dart';
import 'package:unittest/compact_vm_config.dart';
import 'package:unittest/unittest.dart';

import 'common.dart';

void main() {
  useCompactVMConfiguration();
  _testLinter('nothing to report', {
      'a|lib/test.html': '<!DOCTYPE html><html></html>',
    }, {
      'a|lib/test.html.messages': ''
    });

  group('must use init.dart, dart.js, not boot.js', () {
    _testLinter('nothing to report', {
        'a|web/test.html': '<!DOCTYPE html><html>'
            '<script type="application/dart" src="packages/polymer/init.dart">'
            '</script>'
            '<script src="packages/browser/dart.js"></script>'
            '</html>',
      }, {
        'a|web/test.html.messages': '',
      });

    _testLinter('missing init.dart and dart.js', {
        'a|web/test.html': '<!DOCTYPE html><html></html>',
      }, {
        'a|web/test.html.messages': 'error: $USE_INIT_DART\n'
                                    'error: $USE_DART_JS',
      });

    _testLinter('using deprecated boot.js', {
        'a|web/test.html': '<!DOCTYPE html><html>\n'
            '<script src="packages/polymer/boot.js"></script>'
            '<script type="application/dart" src="packages/polymer/init.dart">'
            '</script>'
            '<script src="packages/browser/dart.js"></script>'
            '</html>',
      }, {
        'a|web/test.html.messages': 'warning: $BOOT_JS_DEPRECATED '
                                    '(web/test.html 1 0)',
      });
  });

  group('doctype warning', () {
    _testLinter('in web', {
        'a|web/test.html': '<html></html>',
      }, {
        'a|web/test.html.messages':
            'warning: Unexpected start tag (html). Expected DOCTYPE. '
            '(web/test.html 0 0)\n'
            'error: $USE_INIT_DART\n'
            'error: $USE_DART_JS',
      });

    _testLinter('in lib', {
        'a|lib/test.html': '<html></html>',
      }, {
        'a|lib/test.html.messages': '',
      });
  });

  group('duplicate polymer-elements,', () {
    _testLinter('same file', {
        'a|lib/test.html': '''<html>
            <polymer-element name="x-a"></polymer-element>
            <polymer-element name="x-a"></polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: duplicate definition for custom tag "x-a". '
            '(lib/test.html 1 0)\n'
            'warning: duplicate definition for custom tag "x-a"  '
            '(second definition). (lib/test.html 2 0)'
      });

    _testLinter('other file', {
        'a|lib/b.html': '''<html>
            <polymer-element name="x-a"></polymer-element>
            </html>'''.replaceAll('            ', ''),
        'a|lib/test.html': '''<html>
            <link rel="import" href="b.html">
            <polymer-element name="x-a"></polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: duplicate definition for custom tag "x-a". '
            '(lib/b.html 1 0)\n'
            '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="b.html">
            <polymer-element name="x-a"></polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'error: couldn\'t find imported asset "lib/b.html" in package '
            '"a". (lib/test.html 1 0)'
      });

    _testLinter('other package', {
        'b|lib/b.html': '''<html>
            <polymer-element name="x-a"></polymer-element>
            </html>'''.replaceAll('            ', ''),
        'a|lib/test.html': '''<html>
            <link rel="import" href="packages/b/b.html">
            <polymer-element name="x-a"></polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: duplicate definition for custom tag "x-a". '
            '(package:b/b.html 1 0)\n'
            'warning: duplicate definition for custom tag "x-a"  '
            '(second definition). (lib/test.html 2 0)'
      });
  });

  _testLinter('bad link-rel tag (href missing)', {
      'a|lib/test.html': '''<html>
          <link rel="import">
          <link rel="stylesheet">
          <link rel="foo">
          <link rel="import" href="">
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages':
          'warning: link rel="import" missing href. (lib/test.html 1 0)\n'
          'warning: link rel="stylesheet" missing href. (lib/test.html 2 0)\n'
          'warning: link rel="import" missing href. (lib/test.html 4 0)'
    });

  _testLinter('<element> is not supported', {
      'a|lib/test.html': '''<html>
          <element name="x-a"></element>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages':
          'warning: <element> elements are not supported, use <polymer-element>'
          ' instead (lib/test.html 1 0)'
    });

  _testLinter('do not nest <polymer-element>', {
      'a|lib/test.html': '''<html>
          <polymer-element name="x-a">
            <template><div>
              <polymer-element name="b"></polymer-element>
            </div></template>
          </polymer-element>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages':
          'error: Nested polymer element definitions are not allowed.'
          ' (lib/test.html 3 4)'
    });

  _testLinter('need a name for <polymer-element>', {
      'a|lib/test.html': '''<html>
          <polymer-element></polymer-element>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages':
          'error: Missing tag name of the custom element. Please include an '
          'attribute like \'name="your-tag-name"\'. (lib/test.html 1 0)'
    });

  _testLinter('name for <polymer-element> should have dashes', {
      'a|lib/test.html': '''<html>
          <polymer-element name="a"></polymer-element>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages':
          '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)'
    });

  _testLinter('extend is a valid element or existing tag', {
      'a|lib/test.html': '''<html>
          <polymer-element name="x-a" extends="li"></polymer-element>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages': ''
    });

  _testLinter('extend is a valid element or existing tag', {
      'a|lib/test.html': '''<html>
          <polymer-element name="x-a" extends="x-b"></polymer-element>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages': ''
          'warning: custom element with name "x-b" not found. '
          '(lib/test.html 1 0)'
    });


  group('script type matches code', () {
    _testLinter('top-level, .dart url', {
        'a|lib/test.html': '''<html>
            <script src="foo.dart"></script>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: script tag with .dart source file but no type will be '
            'treated as JavaScript. Did you forget type="application/dart"?'
            ' (lib/test.html 1 0)'
      });

    _testLinter('in polymer-element, .dart url', {
        'a|lib/test.html': '''<html>
            <polymer-element name="x-a">
            <script src="foo.dart"></script>
            </polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: script tag with .dart source file but no type will be '
            'treated as JavaScript. Did you forget type="application/dart"?'
            ' (lib/test.html 2 0)'
      });

    _testLinter('in polymer-element, .js url', {
        'a|lib/test.html': '''<html>
            <polymer-element name="x-a">
            <script src="foo.js"></script>
            </polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
      });

    _testLinter('in polymer-element, inlined', {
        'a|lib/test.html': '''<html>
            <polymer-element name="x-a">
            <script>foo...</script>
            </polymer-element>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: script tag in polymer element with no type will '
            'be treated as JavaScript. Did you forget type="application/dart"?'
            ' (lib/test.html 2 0)'
      });

    _testLinter('top-level, dart type & .dart url', {
        'a|lib/test.html': '''<html>
            <script type="applicatino/dart" src="foo.dart"></script>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
      });

    _testLinter('top-level, dart type & .js url', {
        'a|lib/test.html': '''<html>
            <script type="application/dart" src="foo.js"></script>
            </html>'''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: "application/dart" scripts should use the .dart file '
            'extension. (lib/test.html 1 0)'
      });
  });

  _testLinter('script tags should have only src url or inline code', {
      'a|lib/test.html': '''<html>
          <script type="application/dart" src="foo.dart">more</script>
          </html>'''.replaceAll('          ', ''),
    }, {
      'a|lib/test.html.messages':
          'warning: script tag has "src" attribute and also has script text. '
          '(lib/test.html 1 0)'
    });

  group('event handlers', () {
    _testLinter('onfoo is not polymer', {
        'a|lib/test.html': '''<html><body>
            <div onfoo="something"></div>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            '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>
            <div on-foo="something"></div>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: Inline event handlers are only supported inside '
            'declarations of <polymer-element>. '
            '(lib/test.html 1 5)'
      });

    _testLinter('on-foo is not an expression', {
        'a|lib/test.html': '''<html><body>
            <polymer-element name="x-a"><div on-foo="bar()"></div>
            </polymer-element>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            '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)'
      });

    _testLinter('on-foo-bar is no longer supported', {
        'a|lib/test.html': '''<html><body>
            <polymer-element name="x-a"><div on-foo-bar="quux"></div>
            </polymer-element>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            'warning: Invalid event name "on-foo-bar". After the "on-" the '
            'event name should not use dashes. For example use "on-fooBar" or '
            '"on-foobar" (both forms are equivalent in HTML). '
            '(lib/test.html 1 33)'
      });
  });

  group('using custom tags', () {
    _testLinter('tag exists (x-tag)', {
        'a|lib/test.html': '<x-foo></x-foo>',
      }, {
        'a|lib/test.html.messages':
            'warning: definition for Polymer element with tag name "x-foo" not '
            'found. (lib/test.html 0 0)'
      });

    _testLinter('tag exists (type extension)', {
        'a|lib/test.html': '<div is="x-foo"></div>',
      }, {
        'a|lib/test.html.messages':
            'warning: definition for Polymer element with tag name "x-foo" not '
            'found. (lib/test.html 0 0)'
      });

    _testLinter('used correctly (no base tag)', {
        'a|lib/test.html': '''
            <polymer-element name="x-a"></polymer-element>
            <x-a></x-a>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
      });

    _testLinter('used incorrectly (no base tag)', {
        'a|lib/test.html': '''
            <polymer-element name="x-a"></polymer-element>
            <div is="x-a"></div>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            '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)'
      });

    _testLinter('used incorrectly, imported def (no base tag)', {
        'a|lib/b.html': '<polymer-element name="x-a"></polymer-element>',
        'a|lib/test.html': '''
            <link rel="import" href="b.html">
            <div is="x-a"></div>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            '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)'
      });

    _testLinter('used correctly (base tag)', {
        'a|lib/b.html': '''
            <polymer-element name="x-a" extends="div">
            </polymer-element>
            '''.replaceAll('            ', ''),
        'a|lib/test.html': '''
            <link rel="import" href="b.html">
            <div is="x-a"></div>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
      });

    _testLinter('used incorrectly (missing base tag)', {
        'a|lib/b.html': '''
            <polymer-element name="x-a" extends="div">
            </polymer-element>
            '''.replaceAll('            ', ''),
        'a|lib/test.html': '''
            <link rel="import" href="b.html">
            <x-a></x-a>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
            'warning: custom element "x-a" extends from "div", but this tag '
            'will not include the default properties of "div". To fix this, '
            'either write this tag as <div is="x-a"> or remove the "extends" '
            'attribute from the custom element declaration. (lib/test.html 1 0)'
      });

    _testLinter('used incorrectly (wrong base tag)', {
        'a|lib/b.html': '''
            <polymer-element name="x-a" extends="div">
            </polymer-element>
            '''.replaceAll('            ', ''),
        'a|lib/test.html': '''
            <link rel="import" href="b.html">
            <span is="x-a"></span>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
            'warning: custom element "x-a" extends from "div". Did you mean '
            'to write <div is="x-a">? (lib/test.html 1 0)'
      });

    _testLinter('used incorrectly (wrong base tag, transitive)', {
        'a|lib/c.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="c.html">
            <polymer-element name="x-a" extends="x-b">
            </polymer-element>
            '''.replaceAll('            ', ''),
        'a|lib/test.html': '''
            <link rel="import" href="b.html">
            <span is="x-a"></span>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages': ''
            'warning: custom element "x-a" extends from "li". Did you mean '
            'to write <li is="x-a">? (lib/test.html 1 0)'
      });
  });

  group('custom attributes', () {
    _testLinter('foo-bar is no longer supported in attributes', {
        'a|lib/test.html': '''<html><body>
            <polymer-element name="x-a" attributes="foo-bar">
            </polymer-element>
            '''.replaceAll('            ', ''),
      }, {
        'a|lib/test.html.messages':
            '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)'
      });
  });
}

_testLinter(String name, Map inputFiles, Map outputMessages) {
  var linter = new Linter(new TransformOptions(), _testFormatter);
  var outputFiles = {};
  inputFiles.forEach((k, v) => outputFiles[k] = v);
  outputMessages.forEach((k, v) => outputFiles[k] = v);
  var keys = inputFiles.keys.toSet();
  keys.retainAll(outputMessages.keys);
  expect(keys, isEmpty);
  testPhases(name, [[linter]], inputFiles, outputFiles);
}


_testFormatter(String kind, String message, Span span) {
  var formattedMessage = '$kind: $message';
  if (span != null) {
    formattedMessage = '$formattedMessage '
        '(${span.sourceUrl} ${span.start.line} ${span.start.column})';
  }
  return formattedMessage;
}
