/*
 *  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 metaprogramming

import groovy.test.GroovyTestCase

class StaticPropertyMissingAndMethodMissingTest extends GroovyTestCase {

    void testStaticMethodMissing() {
        assertScript '''
            // tag::static_method_missing[]
            class Foo {
                static def $static_methodMissing(String name, Object args) {
                    return "Missing static method name is $name"
                }
            }

            assert Foo.bar() == 'Missing static method name is bar'
            // end::static_method_missing[]
        '''
    }

    void testStaticPropertyMissing() {
        assertScript '''
            // tag::static_property_missing[]
            class Foo {
                static def $static_propertyMissing(String name) {
                    return "Missing static property name is $name"
                }
            }

            assert Foo.foobar == 'Missing static property name is foobar'
            // end::static_property_missing[]
        '''
    }
}
