/*
 * 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 org.apache.commons.proxy2;

import org.apache.commons.proxy2.exception.ProxyFactoryException;
import org.apache.commons.proxy2.invoker.NullInvoker;
import org.apache.commons.proxy2.provider.ConstantProvider;
import org.apache.commons.proxy2.util.AbstractEcho;
import org.apache.commons.proxy2.util.Echo;
import org.apache.commons.proxy2.util.EchoImpl;
import org.junit.Test;

import java.util.Date;

import static org.junit.Assert.*;

/**
 * @author James Carman
 * @since 1.0
 */
@SuppressWarnings("serial")
public abstract class AbstractSubclassingProxyFactoryTestCase extends AbstractProxyFactoryTestCase
{
//----------------------------------------------------------------------------------------------------------------------
// Fields
//----------------------------------------------------------------------------------------------------------------------

    private static final Class<?>[] DATE_ONLY = new Class[]{Date.class};

//----------------------------------------------------------------------------------------------------------------------
// Other Methods
//----------------------------------------------------------------------------------------------------------------------

    @Test
    public void testCanProxy()
    {
        assertTrue(factory.canProxy(new Class[]{Echo.class}));
        assertTrue(factory.canProxy(new Class[]{EchoImpl.class}));
        assertFalse(factory.canProxy(new Class[]{FinalEcho.class}));
        assertTrue(factory.canProxy(new Class[]{FinalMethodEcho.class, Echo.class}));
        assertFalse(factory.canProxy(new Class[]{NoDefaultConstructorEcho.class}));
        assertTrue(factory.canProxy(new Class[]{ProtectedConstructorEcho.class}));
        assertFalse(factory.canProxy(new Class[]{InvisibleEcho.class}));
        assertFalse(factory.canProxy(new Class[]{Echo.class, EchoImpl.class, String.class}));
    }

    @Test
    public void testDelegatorEquals() throws Exception
    {
        final EqualsEcho echo = new EqualsEcho("text");
        final Echo proxy1 = factory.createDelegatorProxy(new ConstantProvider<Echo>(echo),
                new Class[]{EqualsEcho.class});
        final Echo proxy2 = factory.createDelegatorProxy(new ConstantProvider<Echo>(echo),
                new Class[]{EqualsEcho.class});
        assertEquals(proxy1, proxy1);
        assertFalse(proxy1.equals(proxy2));
        assertFalse(proxy2.equals(proxy1));
    }

    @Test(expected = ProxyFactoryException.class)
    public void testDelegatorWithMultipleSuperclasses()
    {
        factory.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()),
                new Class[]{EchoImpl.class, String.class});
    }

    @Test
    public void testDelegatorWithSuperclass()
    {
        final Echo echo = factory
                .createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()), new Class[]{Echo.class, EchoImpl.class});
        assertTrue(echo instanceof EchoImpl);
    }

    @Test
    public void testInterceptorEquals()
    {
        final EqualsEcho echo = new EqualsEcho("text");
        final Echo proxy1 = factory.createInterceptorProxy(echo,
                new NoOpMethodInterceptor(), new Class[]{EqualsEcho.class});
        final Echo proxy2 = factory.createInterceptorProxy(echo,
                new NoOpMethodInterceptor(), new Class[]{EqualsEcho.class});
        assertEquals(proxy1, proxy1);
        assertFalse(proxy1.equals(proxy2));
        assertFalse(proxy2.equals(proxy1));
    }

    @Test(expected = ProxyFactoryException.class)
    public void testInterceptorWithMultipleSuperclasses()
    {
        factory.createInterceptorProxy(new EchoImpl(), new NoOpMethodInterceptor(),
                new Class[]{EchoImpl.class, String.class});
    }

    @Test
    public void testInterceptorWithSuperclass()
    {
        final Echo echo = factory
                .createInterceptorProxy(new EchoImpl(), new NoOpMethodInterceptor(), new Class[]{Echo.class, EchoImpl.class});
        assertTrue(echo instanceof EchoImpl);
    }

    @Test(expected = ProxyFactoryException.class)
    public void testInvocationHandlerWithMultipleSuperclasses()
    {
        factory.createInvokerProxy(new NullInvoker(),
                new Class[]{EchoImpl.class, String.class});
    }

    @Test
    public void testInvokerEquals() throws Exception
    {
        final Date proxy1 = factory.createInvokerProxy(new InvokerTester(), DATE_ONLY);
        final Date proxy2 = factory.createInvokerProxy(new InvokerTester(), DATE_ONLY);
        assertEquals(proxy1, proxy1);
        assertFalse(proxy1.equals(proxy2));
        assertFalse(proxy2.equals(proxy1));
    }

    @Test
    public void testInvokerWithSuperclass()
    {
        final Echo echo = factory
                .createInvokerProxy(new NullInvoker(), new Class[]{Echo.class, EchoImpl.class});
        assertTrue(echo instanceof EchoImpl);
    }

    @Test
    public void testProxiesWithClashingFinalMethodInSuperclass()
    {
        final Class<?>[] proxyClasses = new Class[]{Echo.class, FinalMethodEcho.class};
        Echo proxy = factory.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()), proxyClasses);
        assertEquals("final", proxy.echoBack("echo"));

        proxy = factory.createInterceptorProxy(new EchoImpl(), new NoOpMethodInterceptor(), proxyClasses);
        assertEquals("final", proxy.echoBack("echo"));

        proxy = factory.createInvokerProxy(new NullInvoker(), proxyClasses);
        assertEquals("final", proxy.echoBack("echo"));
    }

    @Test
    public void testWithAbstractSuperclass()
    {
        final Echo echo = factory.createDelegatorProxy(new ConstantProvider<EchoImpl>(new EchoImpl()), new Class[]{AbstractEcho.class});
        assertEquals("hello", echo.echoBack("hello"));
        assertEquals("helloworld", echo.echoBack("hello", "world"));
    }

//----------------------------------------------------------------------------------------------------------------------
// Inner Classes
//----------------------------------------------------------------------------------------------------------------------

    public static class EqualsEcho extends EchoImpl
    {
        @SuppressWarnings("unused")
        private final String text;

        protected EqualsEcho()
        {
            this("testing");
        }

        public EqualsEcho(String text)
        {
            this.text = text;
        }
    }

    public static final class FinalEcho extends EchoImpl
    {
    }

    public static class FinalMethodEcho extends EchoImpl
    {
        public final String echoBack(String message)
        {
            return "final";
        }
    }

    private static class InvisibleEcho extends EchoImpl
    {
    }

    public static class NoDefaultConstructorEcho extends EchoImpl
    {
        public NoDefaultConstructorEcho(String param)
        {
        }
    }

    public static class ProtectedConstructorEcho extends EchoImpl
    {
        protected ProtectedConstructorEcho()
        {
        }
    }
}
