<!doctype html>
<!--
@license
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>

  <meta charset="utf-8">
  <script src="./test-flags.js"></script>
  <script src="../node_modules/wct-browser-legacy/browser.js"></script>
  <script src="module/generated/css-parse.js"></script>

  <title>css-parse</title>

</head>
<body>

  <style id="test">
    :host {
      background: red;
    }

    .foo .bar .baz, zonk[happy]:focus {
      font-family: sans-serif;
      font-size: 15px;
    }

    @-webkit-keyframes fill-unfill-rotate {
      12.5% { transform: rotate(135deg);  }
      25%   { transform: rotate(270deg);  }
      37.5% { transform: rotate(405deg);  }
      50%   { transform: rotate(540deg);  }
      62.5% { transform: rotate(675deg);  }
      75%   { transform: rotate(810deg);  }
      87.5% { transform: rotate(945deg);  }
      to    { transform: rotate(1080deg); }
    }

    @media (max-width: 400px) {
      div {
        margin-left: 0 !important;
      }
    }
  </style>

  <style id="test-ignore">
    @import '';

    /* comment */
    .stuff {
      background: red;
    }
    /* comment */

    /*
      This is a multi-line comment
    */

    /*.aclassThatShouldBeIgnored {
      someProperty: thatMustNotShowUp
    }*/
  </style>

  <style id="short-escape-sequence">
    .\33 d-model {
      border-top: 3px solid red;
    }
    .\a33 d-model {
      border-top: 3px solid red;
    }
    .\b333 d-model {
      border-top: 3px solid red;
    }
    .\c3333 d-model {
      border-top: 3px solid red;
    }
    .\d33333 d-model {
      border-top: 3px solid red;
    }
    .\e33333d-model {
      border-top: 3px solid red;
    }
  </style>

  <style id="multiple-spaces">
    .foo  .bar {}
    .foo    .bar {}
    .foo


    .bar {}
  </style>

  <style id="empty"></style>
<script>

  function sanitizeCss(text) {
    return text.replace(/[\s]+/g, ' ').trim();
  }

  suite('css-parse', function() {
    var s, tree;

    setup(function() {
      s = document.querySelector('style#test');
      tree = window.CssParse.parse(s.textContent);
    });

    test('window.CssParse rules parse', function() {
      assert.equal(tree.rules.length, 4, 'unexpected number of rules');
      assert.equal(tree.rules[2].rules.length, 8, 'unexpected number of rules in keyframes');
      assert.equal(tree.rules[3].rules.length, 1, 'unexpected number of rules in @media');
    });

    test('rule selectors parse', function() {
      assert.equal(tree.rules[0].selector, ':host', 'unexpected selector');
      assert.equal(tree.rules[2].selector, '@-webkit-keyframes fill-unfill-rotate', 'unexpected selector in keyframes');
      assert.equal(tree.rules[3].selector, '@media (max-width: 400px)', 'unexpected selector in @media');
    });

    test('rule cssText parse', function() {
      assert.equal(tree.rules[0].cssText, 'background: red;', 'unexpected cssText');
      assert.match(tree.rules[2].cssText, /^12.5%/, 'unexpected cssText in keyframes');
      assert.equal(tree.rules[2].rules[2].cssText, 'transform: rotate(405deg);', 'unexpected cssText in keyframes');
      assert.match(tree.rules[3].cssText, /^div/, 'unexpected cssText in @media');
      assert.equal(tree.rules[3].rules[0].cssText, 'margin-left: 0 !important;', 'unexpected cssText in @media');
    });

    test('rule types', function() {
      assert.equal(tree.rules[0].type, window.CssParse.types.STYLE_RULE);
      assert.equal(tree.rules[1].type, window.CssParse.types.STYLE_RULE);
      assert.equal(tree.rules[2].type, window.CssParse.types.KEYFRAMES_RULE);
      assert.equal(tree.rules[3].type, window.CssParse.types.MEDIA_RULE);
      assert.equal(tree.rules[3].rules[0].type, window.CssParse.types.STYLE_RULE);

    });

    test('rules stringify', function() {
      var orig = sanitizeCss(s.textContent);
      var result = sanitizeCss(window.CssParse.stringify(tree));
      assert.equal(result, orig, 'unexpected stringified output');
    });

    test('parse correctly ignores @import and comments', function() {
      var s2 = document.querySelector('#test-ignore');
      var t = window.CssParse.parse(s2.textContent);
      assert.equal(t.rules[0].selector, '.stuff', 'unexpected rule selector');
      assert.equal(t.rules[0].cssText, 'background: red;', 'unexpected rule cssText');
      var result = sanitizeCss(window.CssParse.stringify(t));
      assert.equal(result, '.stuff { background: red; }', 'unexpected stringified output');
    });

    test('short escape sequences', function() {
      var s3 = document.querySelector('#short-escape-sequence');
      var t = window.CssParse.parse(s3.textContent);
      assert.equal(t.rules[0].selector, '.\\000033d-model');
      assert.equal(t.rules[1].selector, '.\\000a33d-model');
      assert.equal(t.rules[2].selector, '.\\00b333d-model');
      assert.equal(t.rules[3].selector, '.\\0c3333d-model');
      assert.equal(t.rules[4].selector, '.\\d33333d-model');
      assert.equal(t.rules[5].selector, '.\\e33333d-model');
    });

    test('multiple consequent spaces in CSS selector', function() {
      var s4 = document.querySelector('#multiple-spaces');
      var t = window.CssParse.parse(s4.textContent);
      assert.equal(t.rules[0].selector, '.foo .bar');
      assert.equal(t.rules[1].selector, '.foo .bar');
      assert.equal(t.rules[2].selector, '.foo .bar');
    });

    test('empty styles are are handled', function() {
      var s = document.querySelector('#empty');
      var t = window.CssParse.parse(s.textContent);
      window.CssParse.stringify(t);
    });

  });
</script>

</body>
</html>
