/*
 * Copyright 2008 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
@def BIG 50px;
@def DIRECTION ltr;
@eval RED com.google.gwt.resources.client.CSSResourceTest.red();
@url BACKGROUND dataMethod;
@url NESTEDBACKGROUND nested.dataMethod;

/* Check @def expansion */
@def SPRITEWIDTH value("spriteMethod.getWidth", "px");
@def SPRITESIZE SPRITEWIDTH value("spriteMethod.getHeight", "px");
@def NESTEDSPRITEWIDTH value("nested.spriteMethod.getWidth", "px");

/*
 * We'll use the token FAIL to indicate text that should never be seen in the output.
 */

/* Test @sprite expansion */
@sprite .spriteClass, .extraSpriteClass {
  gwt-image: "spriteMethod";
  more: properties;
}

@sprite .nestedSprite {
  gwt-image: "nested.spriteMethod";
}

.affectedBySprite {
    offset-left: "guard" SPRITEWIDTH !important;
    offset: SPRITESIZE;
}

.blahA {
	background-color: #000;
}

.blahA[someAttribute="foo"][beer="baz"] {
	background-color: #fff;
}

/* Test value substitution */
div {
    border: BIG solid RED;
    direction: DIRECTION;
    backgroundTopLevel: BACKGROUND;
    backgroundNested: NESTEDBACKGROUND;
}

div[foo="bar"] {
    content: 'bar';
}

/* Test structural modifications */
@if (false) {
  div {
    runtime: FAIL;
  }
} @elif (true) {
  div {
    runtime: PASSED;
  }
} @else {
  div {
    runtime: FAIL;
  }
}

@if CssResource.style obf OBF {
  div {
    static: PASSED;
  }
} @elif CssResource.style pretty PRETTY {
  div {
    static: PASSED;
  }
} @else {
  div {
    static: FAIL;
  }
}

/* Test named classes */
.replacement {
  color: red;
}

.replacement:after {
  content: "Hello\\\" world";
}

.replacement-not-java-ident {
  color: blue;
}

/* Test unusual tag, class, and property names and values */
div {
  \-some-wacky-extension : boo;
  another-extension: \-bar;
  -unescaped-hyphen: -is-better;
  with_underscore: _is_better;
}

div {
  filter: "alpha(opacity = 30)";
}

div-with-literal {
  top: literal("expression(document.compatMode==\"CSS1Compat\" ? documentElement.scrollTop:document.body.scrollTop \\ 2)");
}

ns\:tag {
  border: red;
}

ns\:tag:pseudo {
  content : "blah";
}

/* Test merging / promotion functions*/

.may-merge {
  border: 0;
}

.may-combine {
  border: 0;
}

/* Test merging around empty rules */
.FAIL {}

/* Make sure rules in @if and @media are respected */
@media blah {
  @if (true) {
    .this-does-not-matter {
      after: merge;
    }
  }
}

.may-merge {
  before: merge;
}

.may-combine2 {
  border: 0;
}

.may-not-merge {
  merge: merge;
}

.may-not-combine {
  combine: combine;
  prevent-combine: true;
}

/* Make sure rules in @if and @media are respected */
@media blah {
  @if (true) {
    .may-not-merge-or-combine-because-of-this {
      prevent: true;
    }
  }
}
.may-not-merge {
  prevent-merge: true;
}

.may-not-combine2 {
  combine: combine;
  prevent-combine: true;
}

/* Ensure preservation of standard @rules */

@MEDIA print {
  div {
    media: no-merge;
  }
}

@page {
  margin: 3cm;
}

@page :left {
  margin: 4cm;
}

/* Ensure multi-class selectors fully obfuscate */
.multiClassA {
  border: 1px solid red;
}

.multiClassB {
  border: 1px solid blue;
}

.multiClassA.multiClassB {
  border: 1px solid blue;
}

.css3Color {
  background-color: rgba(0, 0, 0, 0.5); 
}

/* The @external parser attempts to be flexible */
@external externalA, .externalB externalC;
.externalA .replacement, .externalB, .externalC {border: GREEN;}

/* Check unknown at-rules */
@dontIgnoreThis;
@dontIgnoreThis { /* the space between the name and the { is important */ }
@dontIgnoreThisToo{ some { random : content } }
