/*
 * 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 selectors with identical properties */
.a , .b {
  group: one;
}
.c {
  group: two;
  border: green;
}

.d{
  border: green;
  group: two;
}

.e , .e2 , .g {
  group: five;
}

.f {
  unrelated: six;
}

.noMergeImportant1 {
  property: is;
}

.noMergeImportant2 {
  property: is !important;
}

.noMergeExact1 {
  group: three;
  border: blue;
}

.noMergeExactBlocker {
  group: three;
  border: thin;
}

.noMergeExact2 {
  group: three;
  border: blue;
}

.noMergePrefix1 {
  group: four;
  border: blue;
}

.noMergePrefixBlocker {
  group: four;
  border-top: thin;
}

.noMergePrefix2 {
  group: four;
  border: blue;
}


/* Should not merge across @if or @media blocks */
.if {
  group: if;
}

.ifOk, .ifOk2 {
  group2: ifOk;
}

@if (ignored) {
  .if2 {
    group: if;
  }
}

.if3 {
  group: if;
}

.media {
  group: media;
}

.mediaOk , .mediaOk2 {
  group2: mediaOk;
}

@media print {
  .media2 {
    group: media;
  }
}

.media3 {
  group: media;
}

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

@media print {
  .a , .b {group: one;}
}
