package com.fasterxml.jackson.databind.interop;

import java.lang.reflect.*;

import com.fasterxml.jackson.databind.*;

// mostly for [Issue#57]
public class TestJDKProxy extends BaseMapTest
{
    final ObjectMapper MAPPER = new ObjectMapper();

    public interface IPlanet {
        String getName();
        String setName(String s);
    }

    // bit silly example; usually wouldn't implement interface (no need to proxy if it did)
    static class Planet implements IPlanet {
        private String name;

        public Planet() { }
        public Planet(String s) { name = s; }
        
        @Override
        public String getName(){return name;}
        @Override
        public String setName(String iName) {name = iName;
            return name;
        }
    }    
    
    /*
    /********************************************************
    /* Test methods
    /********************************************************
     */
    
    public void testSimple() throws Exception
    {
        IPlanet input = getProxy(IPlanet.class, new Planet("Foo"));
        String json = MAPPER.writeValueAsString(input);
        assertEquals("{\"name\":\"Foo\"}", json);
        
        // and just for good measure
        Planet output = MAPPER.readValue(json, Planet.class);
        assertEquals("Foo", output.getName());
    }

    /*
    /********************************************************
    /* Helper methods
    /********************************************************
     */

    public static <T> T getProxy(Class<T> type, Object obj) {
        class ProxyUtil implements InvocationHandler {
            Object _obj;
            public ProxyUtil(Object o) {
                _obj = o;
            }
            @Override
            public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
                Object result = null;
                result = m.invoke(_obj, args);
                return result;
            }
        }
        @SuppressWarnings("unchecked")
        T proxy = (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type },
                new ProxyUtil(obj));
        return proxy;
    }
}
