chromium/tools/web_dev_style/html_checker_test.py

#!/usr/bin/env python3
# Copyright 2015 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from . import html_checker
from os import path as os_path
import re
from sys import path as sys_path
from . import test_util
import unittest

_HERE = os_path.dirname(os_path.abspath(__file__))
sys_path.append(os_path.join(_HERE, '..', '..'))

from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi


class HtmlCheckerTest(unittest.TestCase):
  def setUp(self):
    super(HtmlCheckerTest, self).setUp()

    self.checker = html_checker.HtmlChecker(MockInputApi(), MockOutputApi())

  def ShouldFailCheck(self, line, checker):
    """Checks that the |checker| flags |line| as a style error."""
    error = checker(1, line)
    self.assertNotEqual('', error, 'Should be flagged as style error: ' + line)
    highlight = test_util.GetHighlight(line, error).strip()

  def ShouldPassCheck(self, line, checker):
    """Checks that the |checker| doesn't flag |line| as a style error."""
    error = checker(1, line)
    self.assertEqual('', error, 'Should not be flagged as style error: ' + line)

  def testClassesUseDashFormCheckFails(self):
    lines = [
      ' <a class="Foo-bar" href="classBar"> ',
      '<b class="foo-Bar"> ',
      '<i class="foo_bar" >',
      ' <hr class="fooBar"> ',
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.ClassesUseDashFormCheck)

  def testClassesUseDashFormCheckPasses(self):
    lines = [
      ' class="abc" ',
      'class="foo-bar"',
      '<div class="foo-bar" id="classBar"',
      '<div class="foo $i18n{barBazQux}" id="classBar"',
    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.ClassesUseDashFormCheck)

  def testSingleQuoteCheckFails(self):
    lines = [
      """ <a href='classBar'> """,
      """<a foo$="bar" href$='classBar'>""",
      """<a foo="bar" less="more" href='classBar' kittens="cats">""",
      """<a cats href='classBar' dogs>""",
      """<a cats\n href='classBat\nclassBaz'\n dogs>""",
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.DoNotUseSingleQuotesCheck)

  def testSingleQuoteCheckPasses(self):
    lines = [
      """<b id="super-valid">SO VALID!</b>""",
      """<a text$="i ain't got invalid quotes">i don't</a>""",
      """<span>[[i18n('blah')]]</span> """,
      """<a cats href="classBar" dogs>""",
      """<a cats\n href="classBar"\n dogs>""",
    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.DoNotUseSingleQuotesCheck)

  def testDoNotCloseSingleTagsCheckFails(self):
    lines = [
      "<input/>",
      ' <input id="a" /> ',
      "<div/>",
      "<br/>",
      "<br />",
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.DoNotCloseSingleTagsCheck)

  def testDoNotCloseSingleTagsCheckPasses(self):
    lines = [
      "<input>",
      "<link>",
      "<div></div>",
      '<input text="/">',
    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.DoNotCloseSingleTagsCheck)

  def testDoNotUseBrElementCheckFails(self):
    lines = [
      " <br>",
      "<br  >  ",
      "<br\>",
      '<br name="a">',
    ]
    for line in lines:
      self.ShouldFailCheck(
          line, self.checker.DoNotUseBrElementCheck)

  def testDoNotUseBrElementCheckPasses(self):
    lines = [
      "br",
      "br>",
      "<browser-switch-app></browser-switch-app>",
      "give me a break"
    ]
    for line in lines:
      self.ShouldPassCheck(
          line, self.checker.DoNotUseBrElementCheck)

  def testDoNotUseInputTypeButtonCheckFails(self):
    lines = [
      '<input type="button">',
      ' <input id="a" type="button" >',
      '<input type="button" id="a"> ',
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.DoNotUseInputTypeButtonCheck)

  def testDoNotUseInputTypeButtonCheckPasses(self):
    lines = [
      "<input>",
      '<input type="text">',
      '<input type="result">',
      '<input type="submit">',
      "<button>",
      '<button type="button">',
      '<button type="reset">',
      '<button type="submit">',

    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.DoNotUseInputTypeButtonCheck)

  def testI18nContentJavaScriptCaseCheckFails(self):
    lines = [
      ' i18n-content="foo-bar" ',
      'i18n-content="foo_bar"',
      'i18n-content="FooBar"',
      'i18n-content="_foo"',
      'i18n-content="foo_"',
      'i18n-content="-foo"',
      'i18n-content="foo-"',
      'i18n-content="Foo"',
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.I18nContentJavaScriptCaseCheck)

  def testI18nContentJavaScriptCaseCheckPasses(self):
    lines = [
      ' i18n-content="abc" ',
      'i18n-content="fooBar"',
      'i18n-content="validName" attr="invalidName_"',
      '<div i18n-content="exampleTitle"',
    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.I18nContentJavaScriptCaseCheck)

  def testLabelCheckFails(self):
    lines = [
      ' <label for="abc"',
      " <label for=    ",
      " <label\tfor=    ",
      ' <label\n blah="1" blee="3"\n for="goop"',
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.LabelCheck)

  def testLabelCheckPasses(self):
    lines = [
      ' my-for="abc" ',
      ' myfor="abc" ',
      " <for",
      ' <paper-tooltip for="id-name"',
    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.LabelCheck)

  def testQuotePolymerBindingsFails(self):
    lines = [
      "<a href=[[blah]]>",
      "<div class$=[[class_]]>",
      "<settings-checkbox prefs={{prefs}}",
      "<paper-button actionable$=[[isActionable_(a,b)]]>",
    ]
    for line in lines:
      self.ShouldFailCheck(line, self.checker.QuotePolymerBindings)

  def testQuotePolymerBindingsPasses(self):
    lines = [
      '<a href="[[blah]]">',
      '<span id="blah">[[text]]</span>',
      '<setting-checkbox prefs="{{prefs}}">',
      '<paper-input tab-index="[[tabIndex_]]">',
      '<div style="font: [[getFont_(item)]]">',
    ]
    for line in lines:
      self.ShouldPassCheck(line, self.checker.QuotePolymerBindings)


if __name__ == '__main__':
  unittest.main()