/*
 * Copyright 2009 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.
 */
 
 /* Tests merging adjacent rules with identical selectors */
a {
  prop: value; foo: bar;
}

c {
  prop: value;
}

aNonBlocker {
  random: other;
}

b {
  border-left: 1px;
}

bBlocker {
  border: solid;
}

b {
  border-right: 2px;
}

/* Test blocking across @if rules. */
if {
  if1 : true;
  if5 : true;
}

@if (true) {
  if {
    if3 : true;
  }
}

if {
  if3-block: false;
}

/* Test blocking across @media rules. */
media {
  media1 : true;
  media5 : true;
}

@media print {
  media {
    media3 : true;
  }
}

media {
  media3-block : false;
}

/* Make sure merging inside sub-contexts works */
@if (true) {
  .a {propOne: one;
      propTwo: one;}
}

@media print {
  .a {propOne: one;
      propTwo: one;}
}
