/*
 * 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 {
  group: one;
}

.b {
  group: one;
}

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

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

.e , .e2 {
  group: five;
}

.f {
  unrelated: six;
}

.g {
  group: five;
}

.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 {
  group2: ifOk;
}

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

.ifOk2 {
  group2: ifOk;
}

.if3 {
  group: if;
}

.media {
  group: media;
}

.mediaOk {
  group2: mediaOk;
}

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

.mediaOk2 {
  group2: mediaOk;
}

.media3 {
  group: media;
}

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

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