/*
 * Copyright (c) 2010, Rickard Öberg. All Rights Reserved.
 *
 * 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 org.apache.zest.runtime.composite;

import org.junit.Test;
import org.apache.zest.api.composite.TransientComposite;
import org.apache.zest.api.mixin.Mixins;
import org.apache.zest.bootstrap.AssemblyException;
import org.apache.zest.bootstrap.ModuleAssembly;
import org.apache.zest.test.AbstractQi4jTest;

/**
 * JAVADOC
 */
public class QI256Test
    extends AbstractQi4jTest
{

    public static class TestException
        extends RuntimeException
    {
        public TestException()
        {
            super( "Test" );
        }
    }

    @Mixins( { TestTransient.TestTransientMixin.class } )
    public static interface TestTransient
        extends TransientComposite
    {
        public void declaredMethodThatThrowsCustomException();

        public void invokeDeclaredPublicMethodThatThrowsCustomException();

        public void invokePrivateMethodThatThrowsCustomException();

        public void invokeProtectedMethodThatThrowsCustomException();

        public void invokeUndeclaredPublicMethodThatThrowsCustomException();

        public void declaredMethodThatThrowsBuiltinInheritedException();

        public void invokeDeclaredPublicMethodThatThrowsBuiltinInheritedException();

        public void invokePrivateMethodThatThrowsBuiltinInheritedException();

        public void invokeProtectedMethodThatThrowsBuiltinInheritedException();

        public void invokeUndeclaredPublicMethodThatThrowsBuiltinInheritedException();

        public void declaredMethodThatThrowsBuiltinException();

        public void invokeDeclaredPublicMethodThatThrowsBuiltinException();

        public void invokePrivateMethodThatThrowsBuiltinException();

        public void invokeProtectedMethodThatThrowsBuiltinException();

        public void invokeUndeclaredPublicMethodThatThrowsBuiltinException();

        public abstract class TestTransientMixin
            implements TestTransient
        {
            public void declaredMethodThatThrowsCustomException()
            {
                throw new TestException();
            }

            public void invokeDeclaredPublicMethodThatThrowsCustomException()
            {
                this.declaredMethodThatThrowsCustomException();
            }

            public void invokePrivateMethodThatThrowsCustomException()
            {
                this.privateThrowException( TestException.class );
            }

            public void invokeProtectedMethodThatThrowsCustomException()
            {
                this.protectedThrowException( TestException.class );
            }

            public void invokeUndeclaredPublicMethodThatThrowsCustomException()
            {
                this.publicThrowException( TestException.class );
            }

            public void declaredMethodThatThrowsBuiltinInheritedException()
            {
                throw new IllegalArgumentException();
            }

            public void invokeDeclaredPublicMethodThatThrowsBuiltinInheritedException()
            {
                this.declaredMethodThatThrowsBuiltinInheritedException();
            }

            public void invokePrivateMethodThatThrowsBuiltinInheritedException()
            {
                this.privateThrowException( IllegalArgumentException.class );
            }

            public void invokeProtectedMethodThatThrowsBuiltinInheritedException()
            {
                this.protectedThrowException( IllegalArgumentException.class );
            }

            public void invokeUndeclaredPublicMethodThatThrowsBuiltinInheritedException()
            {
                this.publicThrowException( IllegalArgumentException.class );
            }

            public void declaredMethodThatThrowsBuiltinException()
            {
                throw new RuntimeException();
            }

            public void invokeDeclaredPublicMethodThatThrowsBuiltinException()
            {
                this.declaredMethodThatThrowsBuiltinException();
            }

            public void invokePrivateMethodThatThrowsBuiltinException()
            {
                this.privateThrowException( RuntimeException.class );
            }

            public void invokeProtectedMethodThatThrowsBuiltinException()
            {
                this.protectedThrowException( RuntimeException.class );
            }

            public void invokeUndeclaredPublicMethodThatThrowsBuiltinException()
            {
                this.publicThrowException( RuntimeException.class );
            }

            private void privateThrowException( Class<? extends RuntimeException> clazz )
            {
                try
                {
                    throw clazz.newInstance();
                }
                catch( Throwable t )
                {
                    if( clazz.isInstance( t ) )
                    {
                        throw clazz.cast( t );
                    }
                    // Ignore
                }
            }

            protected void protectedThrowException( Class<? extends RuntimeException> clazz )
            {
                try
                {
                    throw clazz.newInstance();
                }
                catch( Throwable t )
                {
                    if( clazz.isInstance( t ) )
                    {
                        throw clazz.cast( t );
                    }
                    // Ignore
                }
            }

            public void publicThrowException( Class<? extends RuntimeException> clazz )
            {
                try
                {
                    throw clazz.newInstance();
                }
                catch( Throwable t )
                {
                    if( clazz.isInstance( t ) )
                    {
                        throw clazz.cast( t );
                    }
                    // Ignore
                }
            }
        }
    }

    public void assemble( ModuleAssembly module )
        throws AssemblyException
    {
        module.transients( TestTransient.class );
    }

    @Test( expected = TestException.class )
    public void invokeCustomExceptionThrowingMethod()
        throws Throwable
    {
        this.module.newTransient( TestTransient.class ).declaredMethodThatThrowsCustomException();
    }

    @Test( expected = TestException.class )
    public void invokeDeclaredPublicMethodWhichInvokesCustomExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeDeclaredPublicMethodThatThrowsCustomException();
    }

    @Test( expected = TestException.class )
    public void invokeUndeclaredPublicMethodWhichInvokesCustomExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeUndeclaredPublicMethodThatThrowsCustomException();
    }

    @Test( expected = TestException.class )
    public void invokePrivateMethodWhichInvokesCustomExceptionThrowingMethod()
        throws Throwable
    {
        this.module.newTransient( TestTransient.class ).invokePrivateMethodThatThrowsCustomException();
    }

    @Test( expected = TestException.class )
    public void invokeProtectedMethodWhichInvokesCustomExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeProtectedMethodThatThrowsCustomException();
    }

    @Test( expected = IllegalArgumentException.class )
    public void invokeBuiltinInheritedExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .declaredMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = IllegalArgumentException.class )
    public void invokeDeclaredPublicMethodWhichInvokesBuiltinInheritedExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeDeclaredPublicMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = IllegalArgumentException.class )
    public void invokeUndeclaredPublicMethodWhichInvokesBuiltinInheritedExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeUndeclaredPublicMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = IllegalArgumentException.class )
    public void invokePrivateMethodWhichInvokesBuiltinInheritedExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokePrivateMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = IllegalArgumentException.class )
    public void invokeProtectedMethodWhichInvokesBuiltinInheritedExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeProtectedMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = RuntimeException.class )
    public void invokeBuiltinExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .declaredMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = RuntimeException.class )
    public void invokeDeclaredPublicMethodWhichInvokesBuiltinExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeDeclaredPublicMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = RuntimeException.class )
    public void invokeUndeclaredPublicMethodWhichInvokesBuiltinExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeUndeclaredPublicMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = RuntimeException.class )
    public void invokePrivateMethodWhichInvokesBuiltinExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokePrivateMethodThatThrowsBuiltinInheritedException();
    }

    @Test( expected = RuntimeException.class )
    public void invokeProtectedMethodWhichInvokesBuiltinExceptionThrowingMethod()
        throws Throwable
    {
        this.module
            .newTransient( TestTransient.class )
            .invokeProtectedMethodThatThrowsBuiltinInheritedException();
    }
}
