package com.alibaba.json.bvt.date;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import junit.framework.TestCase;
import org.junit.Assert;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;


public class DateFormatPriorityTest extends TestCase {
    Calendar calendar = Calendar.getInstance();

    protected void setUp() {
        calendar.set(1995, Calendar.OCTOBER, 26);
    }

    public void test_for_fastJsonConfig() throws IOException {
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM.dd");

        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converter.setFastJsonConfig(config);

        converter.canRead(VO.class, MediaType.APPLICATION_JSON_UTF8);
        converter.canWrite(VO.class, MediaType.APPLICATION_JSON_UTF8);

        final ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        HttpOutputMessage out = new HttpOutputMessage() {
            public HttpHeaders getHeaders() {
                return new HttpHeaders() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public MediaType getContentType() {
                        return MediaType.APPLICATION_JSON;
                    }
                };
            }

            public OutputStream getBody() throws IOException {
                return byteOut;
            }
        };

        VO vo = new VO();
        vo.setDate(calendar.getTime());
        converter.write(vo, VO.class, MediaType.APPLICATION_JSON_UTF8, out);

        byte[] bytes = byteOut.toByteArray();
        String jsonString = new String(bytes, "UTF-8");

        Assert.assertEquals("{\"date\":\"1995-10.26\"}", jsonString);
    }

    public void test_for_toJSONStringWithDateFormat() {
        VO vo = new VO();
        vo.setDate(calendar.getTime());

        String jsonString = JSON.toJSONStringWithDateFormat(vo, "yyyy.MM.dd");

        assertEquals("{\"date\":\"1995.10.26\"}", jsonString);
    }

    public void test_for_Annotation() {
        VO2 vo2 = new VO2();
        vo2.setDate(calendar.getTime());

        String jsonString = JSON.toJSONString(vo2);

        assertEquals("{\"date\":\"1995.10-26\"}", jsonString);
    }

    public void test_for_DEFFAULT_DATE_FORMAT() {
        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;

        JSON.DEFFAULT_DATE_FORMAT = "MM-dd";
        VO vo = new VO();
        vo.setDate(calendar.getTime());

        String jsonString = JSON.toJSONString(vo, SerializerFeature.WriteDateUseDateFormat);
        JSON.DEFFAULT_DATE_FORMAT = defaultDateFormat;

        assertEquals("{\"date\":\"10-26\"}", jsonString);
    }

    //Annotation + FastJsonConfig （Annotation优先)
    public void test_priority_01() throws Exception {
        //FastJsonConfig
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM.dd");
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converter.setFastJsonConfig(config);
        converter.canRead(VO.class, MediaType.APPLICATION_JSON_UTF8);
        converter.canWrite(VO.class, MediaType.APPLICATION_JSON_UTF8);
        final ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        HttpOutputMessage out = new HttpOutputMessage() {
            public HttpHeaders getHeaders() {
                return new HttpHeaders() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public MediaType getContentType() {
                        return MediaType.APPLICATION_JSON;
                    }
                };
            }
            public OutputStream getBody() throws IOException {
                return byteOut;
            }
        };

        VO2 vo = new VO2();
        vo.setDate(calendar.getTime());
        converter.write(vo, VO.class, MediaType.APPLICATION_JSON_UTF8, out);

        byte[] bytes = byteOut.toByteArray();
        String jsonString = new String(bytes, "UTF-8");

        assertEquals("{\"date\":\"1995.10-26\"}", jsonString);
    }

    //toJSONStringWithDateFormat + Annotation (toJSONStringWithDateFormat优先)
    public void test_priority_02() throws Exception {
        VO2 vo = new VO2();
        vo.setDate(calendar.getTime());

        String jsonString = JSON.toJSONStringWithDateFormat(vo, "yyyy.MM.dd");

        assertEquals("{\"date\":\"1995.10.26\"}", jsonString);
    }

    //Annotation + DEFFAULT_DATE_FORMAT (Annotation优先)
    public void test_priority_03() throws Exception {
        String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;

        JSON.DEFFAULT_DATE_FORMAT = "MM-dd";
        VO2 vo = new VO2();
        vo.setDate(calendar.getTime());

        String jsonString = JSON.toJSONString(vo, SerializerFeature.WriteDateUseDateFormat);
        JSON.DEFFAULT_DATE_FORMAT = defaultDateFormat;

        assertEquals("{\"date\":\"1995.10-26\"}", jsonString);
    }

    public static class VO {
        private Date date;

        public Date getDate() {
            return date;
        }

        public void setDate(Date date) {
            this.date = date;
        }
    }

    public static class VO2 {
        @JSONField(format = "yyyy.MM-dd")
        private Date date;

        public Date getDate() {
            return date;
        }

        public void setDate(Date date) {
            this.date = date;
        }
    }
}

@@ -646,16 +646,68 @@
 l.Date;%0A
+import java.util.Locale;%0Aimport java.util.TimeZone;%0A
 %0A%0Apublic
@@ -780,33 +780,8 @@
 ndar
- = Calendar.getInstance()
 ;%0A%0A 
@@ -804,24 +804,201 @@
 d setUp() %7B%0A
+        JSON.defaultTimeZone = TimeZone.getTimeZone(%22Asia/Shanghai%22);%0A        JSON.defaultLocale = Locale.CHINA;%0A%0A        calendar = Calendar.getInstance(JSON.defaultTimeZone);%0A
         cale

fix testcase