/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you 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 gls.annotations.closures;

import java.lang.reflect.Constructor;

import groovy.lang.Closure;

// Uses annotation type declared in Java,
// instantiates annotation closure using pure Java APIs (no GDK),
// triggers stub generation for class JavaCompatibility
public class AnnotationClosureJavaCompatibilityTest extends AnnotationClosureExhaustiveTestSupport {
    public Class<?> getAnnotationClass() {
        return JavaAnnotationWithClassElement.class;
    }

    public Class<?> getAnnotatedClass() {
        return JavaCompatibility.class;
    }

    public void verify(Class closureClass) {
        try {
            Constructor ctor = closureClass.getConstructor(Object.class, Object.class);
            Closure closure = (Closure) ctor.newInstance(null, null);
            assertEquals(3, closure.call());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

