#!/usr/bin/env python3
# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os.path
import subprocess
import unittest
import sys
from presubmit_support import _CheckSemanticColors
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi, MockFile
# CSS variable used throughout the tests as valid.
_CANONICAL_VALID_VARIABLE = '--cros-bg-color'
class CSSVariablePresubmitBase(unittest.TestCase):
def setUp(self):
self.mock_input_api = MockInputApi()
self.mock_input_api.change.RepositoryRoot = lambda: os.path.join(
os.path.dirname(__file__), '..', '..', '..')
self.mock_output_api = MockOutputApi()
def mockFileWithLines(self, file_path, lines):
mock_file = MockFile(file_path, lines)
self.mock_input_api.files.append(mock_file)
class CSSVariableContext(CSSVariablePresubmitBase):
def testUnknownCSSContext(self):
lines = [
'selector {', '\tcolor: var(--unknown-should-be-ignored);', '}'
]
self.mockFileWithLines('some/path/file.css', lines)
errors = _CheckSemanticColors(self.mock_input_api,
self.mock_output_api)
self.assertEqual(0, len(errors))
def testKnownCSSContext(self):
lines = ['selector {', '\tcolor: var(--cros-should-be-flagged);', '}']
self.mockFileWithLines('some/path/file.css', lines)
errors = _CheckSemanticColors(self.mock_input_api,
self.mock_output_api)
self.assertEqual(1, len(errors))
self.assertEqual(1, len(errors[0].items))
class CSSVariableValidity(CSSVariablePresubmitBase):
def testMultipleUnknownVariables(self):
lines = [
'selector {'
'\tcolor: var(--cros-unknown-1);',
'\tbackground-color: var(--cros-unknown-2);',
'\tborder: 1px solid var(--cros-unknown-3);', '}'
]
self.mockFileWithLines('some/path/file.css', lines)
errors = _CheckSemanticColors(self.mock_input_api,
self.mock_output_api)
self.assertEqual(1, len(errors))
self.assertEqual(3, len(errors[0].items))
def testMixKnownUnkownVariables(self):
lines = [
'selector {'
'\tcolor: var(' + _CANONICAL_VALID_VARIABLE + ');',
'\tbackground-color: var(--cros-unknown-2);',
'\tborder: 1px solid var(--cros-unknown-3);', '}'
]
self.mockFileWithLines('some/path/file.css', lines)
errors = _CheckSemanticColors(self.mock_input_api,
self.mock_output_api)
self.assertEqual(1, len(errors))
self.assertEqual(2, len(errors[0].items))
def testMultipleValidatedFilesInvalidVariable(self):
lines = ['selector {' '\tcolor: var(--cros-invalid-variable);', '}']
self.mockFileWithLines('some/path/file.css', lines)
self.mockFileWithLines('some/path/file.html', lines)
self.mockFileWithLines('some/path/file.js', lines)
errors = _CheckSemanticColors(self.mock_input_api,
self.mock_output_api)
self.assertEqual(1, len(errors))
self.assertEqual(3, len(errors[0].items))
def testCLWithOtherFilesAreIgnored(self):
lines = ['selector {' '\tcolor: var(--cros-invalid-variable);', '}']
self.mockFileWithLines('some/path/file.css', lines)
self.mockFileWithLines('some/path/file.cc', lines)
self.mockFileWithLines('some/path/file.h', lines)
self.mockFileWithLines('some/path/file.py', lines)
errors = _CheckSemanticColors(self.mock_input_api,
self.mock_output_api)
self.assertEqual(1, len(errors))
self.assertEqual(1, len(errors[0].items))
self.assertTrue('file.css' in errors[0].items[0])
if __name__ == '__main__':
unittest.main()