package com.alibaba.fastjson2.v1issues.issue_1700;

import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Issue1763 {
    @Test
    public void test_for_issue() throws Exception {
        String s = "{\"result\":{\"modelList\":[{\"sourceId\":\"81900002\"},{\"sourceId\":\"81900002\"},{\"sourceId\":\"81892012\"},{\"sourceId\":\"2062014\"},{\"sourceId\":\"2082007\"},{\"sourceId\":\"2082007\"},{\"sourceId\":\"2082007\"}]}}";

        Method method = ProcurementOrderInteractiveServiceForCloud.class.getMethod("queryOrderMateriel", Map.class);
        Type type = method.getGenericReturnType();

        BaseResult<InteractiveOrderMaterielQueryResult> baseResult = JSON.parseObject(s, type);
        InteractiveOrderMaterielQueryResult result = baseResult.getResult();

        assertEquals(7, result.getModelList().size());
        assertEquals(InteractiveOrderMaterielModel.class, result.getModelList().get(0).getClass());
    }

    public static class BaseResult<T> {
        private T result;

        public T getResult() {
            return result;
        }

        public void setResult(T result) {
            this.result = result;
        }
    }

    public static class BasePageQueryResult<T>
            extends BaseResult<T> {
        private List<T> modelList;

        public List<T> getModelList() {
            return modelList;
        }

        public void setModelList(List<T> modelList) {
            this.modelList = modelList;
        }
    }

    public static class InteractiveOrderMaterielModel {
        private String sourceId;

        public String getSourceId() {
            return sourceId;
        }

        public void setSourceId(String sourceId) {
            this.sourceId = sourceId;
        }
    }

    public static class InteractiveOrderMaterielQueryResult<T extends InteractiveOrderMaterielModel>
            extends BasePageQueryResult<T> {
    }

    public interface ProcurementOrderInteractiveServiceForCloud {
        BaseResult<InteractiveOrderMaterielQueryResult> queryOrderMateriel(Map param);
    }
}
