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

import com.google.gwt.junit.JUnitFatalLaunchException;
import com.google.gwt.junit.client.ExpectedFailure;
import com.google.gwt.junit.client.GWTTestCase;

/**
 * Tests {@code GWTTestCase} behaves properly with compilation errors.
 * <p>
 * This class is not under junit/client package so that it will not poison rest of the tests.
 */
public final class GWTTestCaseCompileErrorTest extends GWTTestCase {

  @Override
  public String getModuleName() {
    return "com.google.gwt.junit.JUnitTestWithCompileError";
  }

  @ExpectedFailure(withType = JUnitFatalLaunchException.class, withMessage = "had compile errors")
  public void testCompileError() throws Exception {
    System.mapLibraryName(""); // Not emulated so this should not compile.
  }
}
