/*
 * Copyright 2010 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.validation.testing.constraints;

import com.google.gwt.validation.client.constraints.AssertFalseValidator;

import javax.validation.constraints.AssertFalse;

/**
 * Tests for {@link AssertFalseValidator}.
 */
public class AssertFalseValidatorTest extends
    ConstraintValidatorTestCase<AssertFalse, Boolean> {

  @SuppressWarnings("unused")
  @AssertFalse
  private Boolean defaultField;

  @Override
  protected AssertFalseValidator createValidator() {
    return new AssertFalseValidator();
  }

  public void testIsValid_false() {
    Boolean value = Boolean.FALSE;
    boolean expected = true;
    assertConstraintValidator(value, expected);
  }

  public void testIsValid_true() {
    assertConstraintValidator(Boolean.TRUE, false);
  }

  @Override
  protected Class<AssertFalse> getAnnotationClass() {
    return AssertFalse.class;
  }
}
