/*
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * @test
 * @summary Smoke test for repeating annotations
 * @bug 7151010
 *
 * @run clean BasicRepeatingAnnotations BasicRepeatingAnnos BasicNonRepeatingAnno Foo Foos Bar
 * @run compile BasicRepeatingAnnotations.java
 * @run main BasicRepeatingAnnotations
 */

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Foos.class)
@interface Foo {}

@Retention(RetentionPolicy.RUNTIME)
@interface Foos {
    Foo[] value();
}

@interface Bar {}

@Foo @Foo
@Foo
@Bar
@Foo
@Foo
@Foo
@Foo
@Foo @Foo
@Foo
class BasicRepeatingAnnos {}

@Foo
class BasicNonRepeatingAnno {}

public class BasicRepeatingAnnotations {
    public static void main(String[] args) throws Exception {
        Annotation a = BasicRepeatingAnnos.class.getAnnotation(Foos.class);
        if (a == null) {
            throw new RuntimeException("Container annotation missing");
        }

        // verify that container not present on nonrepeating
        a = BasicNonRepeatingAnno.class.getAnnotation(Foos.class);
        if (a != null) {
            throw new RuntimeException("Container annotation present");
        }
        a = BasicNonRepeatingAnno.class.getAnnotation(Foo.class);
        if (a == null) {
            throw new RuntimeException("Repeated annoation not directly present");
        }
    }
}
