content: package com.alibaba.json.bvt.parser;
  
  import java.lang.reflect.Field;
  import java.net.URL;
  import java.util.Collections;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.concurrent.ConcurrentMap;
  
  import com.alibaba.fastjson.parser.ParserConfig;
  import org.junit.Assert;
  
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.serializer.JSONSerializer;
  import com.alibaba.fastjson.serializer.JavaBeanSerializer;
  import com.alibaba.fastjson.serializer.SerializeConfig;
  import com.alibaba.fastjson.serializer.SerializeWriter;
  import com.alibaba.fastjson.util.TypeUtils;
  
  import junit.framework.TestCase;
  
  public class TypeUtilsTest_castToJavaBean extends TestCase {
      protected void setUp() throws Exception {
          ParserConfig.global.addAccept("com.alibaba.json.bvt.parser.TypeUtilsTest_castToJavaBean.");
      }
  
      public void test_castToJavaBean_StackTraceElement() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("className", "java.lang.Object");
          map.put("methodName", "hashCode");
          StackTraceElement element = TypeUtils.castToJavaBean(map, StackTraceElement.class, null);
          Assert.assertEquals("java.lang.Object", element.getClassName());
          Assert.assertEquals("hashCode", element.getMethodName());
          Assert.assertEquals(null, element.getFileName());
      }
  
      public void test_castToJavaBean_StackTraceElement_1() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("className", "java.lang.Object");
          map.put("methodName", "hashCode");
          map.put("lineNumber", 12);
          StackTraceElement element = TypeUtils.castToJavaBean(map, StackTraceElement.class, null);
          Assert.assertEquals("java.lang.Object", element.getClassName());
          Assert.assertEquals("hashCode", element.getMethodName());
          Assert.assertEquals(null, element.getFileName());
          Assert.assertEquals(12, element.getLineNumber());
      }
  
      public void test_castToJavaBean_type() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("@type", "java.lang.StackTraceElement");
          map.put("className", "java.lang.Object");
          map.put("methodName", "hashCode");
          map.put("lineNumber", 12);
          StackTraceElement element = (StackTraceElement) TypeUtils.castToJavaBean(map, Object.class, null);
          Assert.assertEquals("java.lang.Object", element.getClassName());
          Assert.assertEquals("hashCode", element.getMethodName());
          Assert.assertEquals(null, element.getFileName());
          Assert.assertEquals(12, element.getLineNumber());
      }
  
      public void test_error() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("@type", "xxx");
          Exception error = null;
          try {
              TypeUtils.castToJavaBean(map, Object.class, null);
          } catch (Exception ex) {
              error = ex;
          }
          Assert.assertNotNull(error);
      }
  
      public void test_error2() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("@type", "");
          Exception error = null;
          try {
              TypeUtils.castToJavaBean(map, Object.class, null);
          } catch (Exception ex) {
              error = ex;
          }
          Assert.assertNotNull(error);
      }
  
      public void test_mapping() throws Exception {
          addClassMapping("my_xxx", VO.class);
          addClassMapping(null, VO.class);
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("@type", "my_xxx");
          map.put("id", 123);
          VO vo = (VO) TypeUtils.castToJavaBean(map, Object.class);
          Assert.assertEquals(123, vo.getId());
          TypeUtils.clearClassMapping();
      }
      
      public static void addClassMapping(String className, Class<?> clazz) throws Exception {
          Field field = TypeUtils.class.getDeclaredField("mappings");
          field.setAccessible(true);
          field.get(null);
          
          ConcurrentMap<String, Class<?>> mappings = (ConcurrentMap<String, Class<?>>) field.get(null);
          
          if (className == null) {
              className = clazz.getName();
          }
  
          mappings.put(className, clazz);
      }
  
      public void test_interface() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("id", 123);
          VO vo = TypeUtils.castToJavaBean(map, VO.class);
          Assert.assertEquals(123, vo.getId());
      }
  
      public void test_bean() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("id", 123);
          Entity vo = TypeUtils.castToJavaBean(map, Entity.class);
          Assert.assertEquals(123, vo.getId());
  
          Assert.assertEquals("{\"id\":123}", JSON.toJSONString(vo));
      }
  
      public void test_loadClass() throws Exception {
          Assert.assertNull(TypeUtils.loadClass(null));
          Assert.assertNull(TypeUtils.loadClass(""));
      }
  
      public void test_loadClass_1() throws Exception {
          TypeUtils.clearClassMapping();
          ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
          Thread.currentThread().setContextClassLoader(new TestLoader());
          try {
              Assert.assertEquals(VO.class,
                                  TypeUtils.loadClass("com.alibaba.json.bvt.parser.TypeUtilsTest_castToJavaBean$VO"));
          } finally {
              Thread.currentThread().setContextClassLoader(contextClassLoader);
          }
      }
  
      public void test_loadClass_2() throws Exception {
          TypeUtils.clearClassMapping();
          ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
          Thread.currentThread().setContextClassLoader(new TestLoader());
          try {
              Assert.assertNull(TypeUtils.loadClass("xxx_xx"));
          } finally {
              Thread.currentThread().setContextClassLoader(contextClassLoader);
          }
      }
      
      public void test_bean_2() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("id", 123);
          PO vo = TypeUtils.castToJavaBean(map, PO.class);
          Assert.assertEquals(123, vo.id);
          
          SerializeWriter out = new SerializeWriter();
  
          try {
              SerializeConfig config = new SerializeConfig();
              JSONSerializer serializer = new JSONSerializer(out, config);
              config.put(PO.class, new JavaBeanSerializer(PO.class, Collections.singletonMap("id", "ID")));
  
              serializer.write(vo);
  
              Assert.assertEquals("{\"ID\":123}", out.toString());
          } finally {
              out.close();
          }
  
          
      }
      
      public void test_bean_3() throws Exception {
          Map<String, Object> map = new HashMap<String, Object>();
          map.put("id", 123);
          PO vo = TypeUtils.castToJavaBean(map, PO.class);
          Assert.assertEquals(123, vo.id);
          
          SerializeWriter out = new SerializeWriter();
  
          try {
              SerializeConfig config = new SerializeConfig();
              JSONSerializer serializer = new JSONSerializer(out, config);
              config.put(PO.class, new JavaBeanSerializer(PO.class, Collections.singletonMap("id", (String) null)));
  
              serializer.write(vo);
  
              Assert.assertEquals("{}", out.toString());
          } finally {
              out.close();
          }
  
          
      }
  
      public static interface VO {
  
          void setId(int value);
  
          int getId();
  
          ClassLoader getClassLoader();
      }
  
      public static class Entity {
  
          private int    id;
          protected String name;
  
          public int getId() {
              return id;
          }
  
          public void setId(int id) {
              this.id = id;
          }
  
          protected String getName() {
              return name;
          }
  
          protected void setName(String name) {
              this.name = name;
          }
  
          public ClassLoader getClassLoader() {
              return Entity.class.getClassLoader();
          }
      }
      
      private static class PO {
          public int id;
      }
  
      public static class TestLoader extends ClassLoader {
  
          public TestLoader(){
              super(null);
          }
  
          public URL getResource(String name) {
              return null;
          }
  
          public Class<?> loadClass(String name) throws ClassNotFoundException {
              throw new ClassNotFoundException();
          }
      }
  }
  