/*
 * Copyright 1999-2011 Alibaba Group.
 *  
 * 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 com.alibaba.dubbo.common.bytecode;

import java.lang.reflect.Field;

import junit.framework.TestCase;

public class ClassGeneratorTest extends TestCase
{
	@SuppressWarnings("unchecked")
	public void testMain() throws Exception
	{
		Bean b = new Bean();
		Field fname = null, fs[] = Bean.class.getDeclaredFields();
		for( Field f : fs )
		{
			f.setAccessible(true);
			if( f.getName().equals("name") )
				fname = f;
		}

		ClassGenerator cg = ClassGenerator.newInstance();
		cg.setClassName(Bean.class.getName() + "$Builder");
		cg.addInterface(Builder.class);

		cg.addField("public static java.lang.reflect.Field FNAME;");

		cg.addMethod("public Object getName("+Bean.class.getName()+" o){ boolean[][][] bs = new boolean[0][][]; return (String)FNAME.get($1); }");
		cg.addMethod("public void setName("+Bean.class.getName()+" o, Object name){ FNAME.set($1, $2); }");

		cg.addDefaultConstructor();
		Class<?> cl = cg.toClass();
		cl.getField("FNAME").set(null, fname);

		System.out.println(cl.getName());
		Builder<String> builder = (Builder<String>)cl.newInstance();
		System.out.println(b.getName());
		builder.setName(b, "ok");
		System.out.println(b.getName());
	}
}

class Bean
{
	int age = 30;

	private String name = "qianlei";

	public int getAge()
	{
		return age;
	}

	public String getName()
	{
		return name;
	}
}

interface Builder<T>
{
	T getName(Bean bean);

	void setName(Bean bean, T name);
}