/*
 * 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 , c {
  prop: value;
}

aNonBlocker {
  random: other;
}

a {
  foo: bar;
}

b {
  border-left: 1px;
}

bBlocker {
  border: solid;
}

b {
  border-right: 2px;
}

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

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

if {
  if5 : true;
}

if {
  if3-block : false;
}

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

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

media {
  media5 : true;
}

media {
  media3-block : false;
}

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

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