/*
 * Copyright 2014 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.
 */

package com.google.gwt.resources.client.gss;

import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.CssResource.Import;
import com.google.gwt.resources.client.CssResource.NotStrict;
import com.google.gwt.resources.client.DataResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.gss.ScopeResource.SharedParent;

/**
 * Contains various CssResource used to test the CssResource system with GSS.
 */
public interface TestResources extends ClientBundle {
  /**
   * Inner ClientBundle with a reference to an ImageResource.
   */
  public interface ImageResources extends ClientBundle {
        @Source("someImageResource.png")
        ImageResource someResource();
  }

  /**
   * Simple CssResource.
   */
  interface SomeGssResource extends CssResource {
    String someClass();
  }

  /**
   * Used to test sprite definition.
   */
  interface SpriteGssResource extends CssResource {
    String someClassWithSprite();

    String embeddedSprite();

    // define a style class having the same name than another resource in the ClientBundle
    // test possible conflict
    String someImageResource();
  }

  /**
   * Used to test {@code @external} at-rule.
   */
  interface ExternalClasses extends CssResource {
    String obfuscatedClass();

    String externalClass();

    String externalClass2();

    String unobfuscated();

    String unobfuscated2();
  }

  /**
   * Used to test that GSS file can contains empty style class definition.
   */
  interface EmptyClass extends CssResource {
    String empty();
  }

  /**
   * Used to test constant definition.
   */
  interface WithConstant extends CssResource {
    String constantOne();

    String classOne();
  }

  /**
   * Used to test {@link ClassName} annotation.
   */
  interface ClassNameAnnotation extends CssResource {
    @ClassName("renamed-class")
    String renamedClass();

    String nonRenamedClass();
  }

  /**
   * Used to test {@link Import} annotation.
   */
  interface TestImportCss extends CssResource {
    String other();
  }

  /**
   * Used to test shared annotation between clientBundle.
   */
  interface SharedChild3 extends SharedParent {
    String nonSharedClassName();
  }

  /**
   * Used to test conflict between style class name and constant name.
   */
  interface CssWithConstant extends CssResource {
    String constantOne();

    int constantTwo();

    String CONSTANT_THREE();

    String className1();

    String conflictConstantClass();
  }

  /**
   * Used to test conditional nodes containing conditions evaluated at runtime.
   */
  interface RuntimeConditional extends CssResource {
    String foo();
  }

  /**
   * Used to test that the generator accepts non standard at-rules if they are defined in the
   * module file.
   */
  interface NonStandardAtRules extends CssResource {
    String foo();
  }

  /**
   * Used to test that the generator accepts non standard css function if they are defined in the
   * module file.
   */
  interface NonStandardFunctions extends CssResource {
    String foo();
  }

  ClassNameAnnotation classNameAnnotation();

  SomeGssResource mixin();

  SomeGssResource add();

  SomeGssResource eval();

  SomeGssResource resourceUrl();

  SpriteGssResource sprite();

  ExternalClasses externalClasses();

  EmptyClass emptyClass();

  WithConstant withConstant();

  ImageResource someImageResource();

  @Source("bananaguitar.ani")
  DataResource someDataResource();

  @Import({ImportResource.ImportWithPrefixCss.class, ImportResource.ImportCss.class})
  TestImportCss testImportCss();

  SharedChild3 sharedChild3();

  CssWithConstant cssWithConstant();

  @NotStrict
  SomeGssResource notstrict();

  RuntimeConditional runtimeConditional();

  ImageResources embeddedImageResources();

  NonStandardAtRules nonStandardAtRules();

  NonStandardFunctions nonStandardFunctions();
}
