/*
 * 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.serialize.serialization;

import org.junit.Ignore;
import org.junit.Test;

import com.alibaba.dubbo.common.serialize.support.json.JsonSerialization;

/**
 * FIXME Json Serialization的失败，被暂时被忽略
 * 
 * @author ding.lid
 *
 */
public class JsonSerializationTest extends AbstractSerializationPersionOkTest {
    {
        serialization = new JsonSerialization();
    }
    
    // FIXME
    @Ignore
    @Test
    public void test_BytesRange() throws Exception {}
    
    @Ignore("bool[] type missing to List<Boolean>")
    @Test
    public void test_boolArray() throws Exception {}
    
    @Ignore("char[] type missing to List<Charator>")
    @Test
    public void test_charArray() throws Exception {}
    
    @Ignore("short[] type missing to List<Short>")
    @Test
    public void test_shortArray() throws Exception {}
    
    @Ignore("int[] type missing to List<Integer>")
    @Test
    public void test_intArray() throws Exception {}
    
    @Ignore("long[] type missing to List<Long>")
    @Test
    public void test_longArray() throws Exception {}
    
    @Ignore
    @Test
    public void test_floatArray() throws Exception {}
    
    @Ignore
    @Test
    public void test_doubleArray() throws Exception {}
    
    @Ignore("String[] type missing to List<String>")
    @Test
    public void test_StringArray() throws Exception {}
    
    @Ignore("Integer[] type missing to List<Integer>")
    @Test
    public void test_IntegerArray() throws Exception {}
    
    @Ignore
    @Test
    public void test_EnumArray() throws Exception {}
    
    @Ignore
    @Test
    public void test_Date() throws Exception {}
    
    @Ignore("毫秒部分丢失成0")
    @Test
    public void test_Date_withType() throws Exception {}
    
    @Ignore
    @Test
    public void test_Time() throws Exception {}

    @Ignore
    @Test
    public void test_Time_withType() throws Exception {}
    
    @Ignore("Byte type missing to Long")
    @Test
    public void test_ByteWrap() throws Exception {}
    
    @Ignore("BigInteger type missing to Long")
    @Test
    public void test_BigInteger() throws Exception {}

    @Ignore
    @Test
    public void test_BigDecimal() throws Exception {}
    
    @Ignore
    @Test
    public void test_BigDecimal_withType() throws Exception {}
    
    @Ignore("BizException type missing")
    @Test
    public void test_BizException() throws Exception {}
    
    @Ignore("BizExceptionNoDefaultConstructor type missing")
    @Test
    public void test_BizExceptionNoDefaultConstructor() throws Exception {}
    
    @Ignore("NoDefaultConstructor")
    @Test
    public void test_BizExceptionNoDefaultConstructor_WithType() throws Exception {}
    
    @Ignore("Enum type missing")
    @Test
    public void test_enum() throws Exception {}
    
    @Ignore("Set type missing to Map")
    @Test
    public void test_StringSet() throws Exception {}
    
    @Ignore("LinkedHashMap type missing to Map")
    @Test
    public void test_LinkedHashMap() throws Exception {}
    
    // 
    
    @Ignore("SPerson type missing")
    @Test
    public void test_SPerson() throws Exception {}
    
    @Ignore("SPerson type missing")
    @Test
    public void test_SPersonList() throws Exception {}
    
    @Ignore("SPerson type missing")
    @Test
    public void test_SPersonSet() throws Exception {}
    
    @Ignore("SPerson type missing")
    @Test
    public void test_IntSPersonMap() throws Exception {}
    
    @Ignore("SPerson type missing")
    @Test
    public void test_StringSPersonMap() throws Exception {}
    
    @Ignore("SPerson type missing")
    @Test
    public void test_StringSPersonListMap() throws Exception {}
    
    @Ignore("SPerson type missing")
    @Test
    public void test_SPersonListList() throws Exception {}
    
    @Ignore("type missing")
    @Test
    public void test_BigPerson() throws Exception {}
    
    @Ignore("type missing")
    @Test
    public void test_BigPerson_WithType() throws Exception {}
    
    @Ignore("type missing")
    @Test
    public void test_MediaContent() throws Exception {}
    
    @Ignore("type missing")
    @Test
    public void test_MediaContent_WithType() throws Exception {}
    
    @Ignore("type missing")
    @Test
    public void test_MultiObject() throws Exception {}
    
    @Ignore("type missing")
    @Test
    public void test_MultiObject_WithType() throws Exception {}
    
    @Ignore
    @Test
    public void test_LoopReference() throws Exception {}
    
    // FIXME DUBBO-63
    @Ignore
    @Test
    public void test_URL_mutable_withType() throws Exception {}
    
    // Person
    
    @Ignore("person type missing")
    @Test
    public void test_Person() throws Exception {}
    
    @Ignore("person type missing")
    @Test
    public void test_PersonList() throws Exception {}
    
    @Ignore("person type missing")
    @Test
    public void test_PersonSet() throws Exception {}
    
    @Ignore("person type missing")
    @Test
    public void test_IntPersonMap() throws Exception {}
    
    @Ignore("person type missing")
    @Test
    public void test_StringPersonMap() throws Exception {}
    
    @Ignore("person type missing")
    @Test
    public void test_StringPersonListMap() throws Exception {}
    
    @Ignore("person type missing")
    @Test
    public void test_PersonListList() throws Exception {}
}