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

import unittest

import minimize_css


class CSSMinimizerTest(unittest.TestCase):

  def test_simple(self):
    source = """
            div {
                color: blue;
            }
        """
    minimized = minimize_css.CSSMinimizer.minimize_css(source)
    self.assertEqual(minimized, "div{color: blue}")

  def test_attribute_selectors(self):
    source = """
            input[type="search" i]::-webkit-textfield-decoration-container {
                direction: ltr;
            }
        """
    minimized = minimize_css.CSSMinimizer.minimize_css(source)
    self.assertEqual(
        minimized,
        # pylint: disable=line-too-long
        """input[type="search" i]::-webkit-textfield-decoration-container{direction: ltr}""")

  def test_strip_comment(self):
    source = """
        /* header */
        html {
            /* inside block */
            display: block;
        }
        /* footer */
        """
    minimized = minimize_css.CSSMinimizer.minimize_css(source)
    self.assertEqual(minimized, "html{ display: block}")

  def test_no_strip_inside_quotes(self):
    source = """div[foo=' bar ']"""
    minimized = minimize_css.CSSMinimizer.minimize_css(source)
    self.assertEqual(minimized, source)

    source = """div[foo=" bar "]"""
    minimized = minimize_css.CSSMinimizer.minimize_css(source)
    self.assertEqual(minimized, source)

  def test_escape_string(self):
    source = """content: " <a onclick=\\\"javascript:  alert  ( 'foobar' ); \\\">";"""
    minimized = minimize_css.CSSMinimizer.minimize_css(source)
    self.assertEqual(minimized, source)
