/*
 * Copyright 2011 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.junit;

import com.google.gwt.resources.client.CssResource;

import junit.framework.TestCase;

/**
 * Tests of FakeCssMaker.
 */
public class FakeCssMakerTest extends TestCase {
  interface MyCss extends CssResource {
    String myFirstStyleName();
    String mySecondStyleName();
  }
  
  public void testCreate() {
    MyCss css = FakeCssMaker.create(MyCss.class);
    css.ensureInjected();
    assertEquals("myFirstStyleName", css.myFirstStyleName());
    assertEquals("mySecondStyleName", css.mySecondStyleName());
  }
}
