package testapp;

import com.alibaba.fastjson.JSON;

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;

public class FastJson37Issue {

    public static class BoolVal {
        private boolean v;
        public void setV(boolean v) {
            this.v = v;
        }

        @Override
        public String toString() {
            return String.valueOf(v);
        }
    }

    public static class LongVal {
        private long v;
        public void setV(long v) {
            this.v = v;
        }

        @Override
        public String toString() {
            return String.valueOf(v);
        }
    }

    public static class IntegerVal {
        private int v;

        public void setV(int v) {
            this.v = v;
        }

        @Override
        public String toString() {
            return String.valueOf(v);
        }
    }

    public static class FloatVal {
        private float v;

        public void setV(float v) {
            this.v = v;
        }

        @Override
        public String toString() {
            return String.valueOf(v);
        }
    }

    public static void gh1422() {
        String strOk = "{\"v\": 111}";
        BoolVal ok = JSON.parseObject(strOk, BoolVal.class);
        System.out.println("ok:" + ok);

        String strBad = "{\"v\":111}";
        BoolVal bad = JSON.parseObject(strBad, BoolVal.class);
        System.out.println("bad" + bad);
    }

    public static void gh1423() {
        BigInteger n = new BigInteger(String.valueOf(Long.MAX_VALUE)).add(new BigInteger("1"));
        Map<String, BigInteger> map = new HashMap<>();
        map.put("v", n);
        String strBad = JSON.toJSONString(map);
        System.out.println("prepare to parse: " + strBad);

        System.out.println("We expect the following line to raise NumberFormatException, but it will print out something:");
        System.out.println(JSON.parseObject(strBad, LongVal.class));

        System.out.println("While Long.parseLong(String) call does raise NumberFormatException:");
        System.out.println(Long.parseLong(n.toString()));
    }

    public static void main(String[] args) {
        String fastJsonVersion = JSON.VERSION;
        System.out.println("fastjson version: " + fastJsonVersion);

        Map<String, Long> intOverflowMap = new HashMap<>();
        long intOverflow = Integer.MAX_VALUE;
        intOverflowMap.put("v", intOverflow + 1);
        String sIntOverflow = JSON.toJSONString(intOverflowMap);
        System.out.println("prepare to parse overflow int val: " + sIntOverflow);
        try {
            JSON.parseObject(sIntOverflow, IntegerVal.class);
        } catch (Exception e) {
            System.out.println("We captured the Exception: " + e.getMessage());
        }

        Map<String, Double> floatOverflowMap = new HashMap<>();
        double floatOverflow = Float.MAX_VALUE;
        floatOverflowMap.put("v", floatOverflow + floatOverflow);
        String sFloatOverflow = JSON.toJSONString(floatOverflowMap);
        System.out.println("prepare to parse overflow float val: " + sIntOverflow);
        FloatVal floatVal = JSON.parseObject(sFloatOverflow, FloatVal.class);
        System.out.println("We expect an exception raised, but found it parsed out an invalid value: " + floatVal);
    }

}