/*
 * Copyright (c) 2014, 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.
 */
/**
 * @description Tests background shortand property with background-size
 */
import "dart:html";
import "../../testcommon.dart";


main() {
  document.body.setInnerHtml('''
      <div id="test"> </div>
      ''', treeSanitizer: new NullTreeSanitizer());

  var e = document.getElementById('test');
  var computedStyle = e.getComputedStyle();

  checkStyle() {
    var before = e.style.background;
    e.style.background = 'none';
    e.style.background = before;
    return (e.style.background == before);
  }

  checkComputedStyleValue() {
    var before = e.getComputedStyle().getPropertyValue('background');
    e.style.background = 'none';
    e.style.background = before;
    return (e.getComputedStyle().getPropertyValue('background') == before);
  }

  e.style.background = "center / cover red url(dummy://test.png) no-repeat border-box";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 50% 50% / cover no-repeat border-box border-box red');
  shouldBe(e.style.backgroundSize, 'cover');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) no-repeat scroll 50% 50% / cover border-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'cover');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "red 20px / contain url(dummy://test.png) no-repeat padding-box";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 20px 50% / contain no-repeat padding-box padding-box red');
  shouldBe(e.style.backgroundSize, 'contain');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) no-repeat scroll 20px 50% / contain padding-box padding-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'contain');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "red url(dummy://test.png) 50px 60px / 50% 75% no-repeat";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 50px 60px / 50% 75% no-repeat red');
  shouldBe(e.style.backgroundSize, '50% 75%');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) no-repeat scroll 50px 60px / 50% 75% padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), '50% 75%');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "red url(dummy://test.png) repeat top left / 100px 200px border-box content-box";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 0% 0% / 100px 200px repeat border-box content-box red');
  shouldBe(e.style.backgroundSize, '100px 200px');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) repeat scroll 0% 0% / 100px 200px border-box content-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), '100px 200px');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "red url(dummy://test.png) repeat 50% / auto auto content-box padding-box";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 50% 50% / auto repeat content-box padding-box red');
  shouldBe(e.style.backgroundSize, 'auto');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) repeat scroll 50% 50% / auto content-box padding-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'auto');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "url(dummy://test.png) red 50px 60px / 50% no-repeat fixed";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 50px 60px / 50% no-repeat fixed red');
  shouldBe(e.style.backgroundSize, '50%');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) no-repeat fixed 50px 60px / 50% padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), '50%');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "red repeat scroll padding-box border-box top left / 100px url(dummy://test.png)";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 0% 0% / 100px repeat scroll padding-box border-box red');
  shouldBe(e.style.backgroundSize, '100px');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) repeat scroll 0% 0% / 100px padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), '100px');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "50% / auto fixed url(dummy://test.png) repeat content-box red";
  shouldBe(stripQuotes(e.style.background),
      'url(dummy://test.png) 50% 50% / auto repeat fixed content-box content-box red');
  shouldBe(e.style.backgroundSize, 'auto');
  shouldBe(checkStyle(), true);
  shouldBe(stripQuotes(computedStyle.getPropertyValue("background")),
      'rgb(255, 0, 0) url(dummy://test.png) repeat fixed 50% 50% / auto content-box content-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'auto');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "top left / 50%";
  shouldBe(e.style.background, '0% 0% / 50%');
  shouldBe(e.style.backgroundSize, '50%');
  shouldBe(checkStyle(), true);
  shouldBe(computedStyle.getPropertyValue("background"), 'rgba(0, 0, 0, 0) none repeat scroll 0% 0% / 50% padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), '50%');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "red fixed";
  shouldBe(e.style.background, 'fixed red');
  shouldBe(e.style.backgroundSize, 'initial');
  shouldBe(checkStyle(), true);
  shouldBe(computedStyle.getPropertyValue("background"), 'rgb(255, 0, 0) none repeat fixed 0% 0% / auto padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'auto');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "";
  e.style.background = "red / cover url(dummy://test.png) repeat";
  shouldBe(e.style.background, '');
  shouldBe(e.style.backgroundSize, '');
  shouldBe(checkStyle(), true);
  shouldBe(computedStyle.getPropertyValue("background"), 'rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'auto');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "";
  e.style.background = "red url(dummy://test.png) repeat 25px / contain contain";
  shouldBe(e.style.background, '');
  shouldBe(e.style.backgroundSize, '');
  shouldBe(checkStyle(), true);
  shouldBe(computedStyle.getPropertyValue("background"), 'rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'auto');
  shouldBe(checkComputedStyleValue(), true);

  e.style.background = "";
  e.style.background = "red top left / 100px cover url(dummy://test.png) repeat";
  shouldBe(e.style.background, '');
  shouldBe(e.style.backgroundSize, '');
  shouldBe(checkStyle(), true);
  shouldBe(computedStyle.getPropertyValue("background"), 'rgba(0, 0, 0, 0) none repeat scroll 0% 0% / auto padding-box border-box');
  shouldBe(computedStyle.getPropertyValue("background-size"), 'auto');
  shouldBe(checkComputedStyleValue(), true);
}
