package com.jsoniter.output;

import junit.framework.TestCase;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Arrays;

public class TestNative extends TestCase {

    static {
//        JsonStream.setMode(EncodingMode.REFLECTION_MODE);
    }

    private ByteArrayOutputStream baos;
    private JsonStream stream;

    public void setUp() {
        baos = new ByteArrayOutputStream();
        stream = new JsonStream(baos, 4096);
    }

    public void test_string() throws IOException {
        stream = new JsonStream(baos, 32);
        stream.writeVal("1234567890123456789012345678901234567890");
        stream.close();
        assertEquals("'1234567890123456789012345678901234567890'".replace('\'', '"'), baos.toString());
    }

    public void test_slash() throws IOException {
        stream.writeVal("/\\");
        stream.close();
        assertEquals("\"/\\\\\"", baos.toString());
    }

    public void test_escape() throws IOException {
        stream.writeVal("hel\nlo");
        stream.close();
        assertEquals("'hel\\nlo'".replace('\'', '"'), baos.toString());
    }

    public void test_utf8() throws IOException {
        stream.writeVal("中文");
        stream.close();
        assertEquals("\"\\u4e2d\\u6587\"", baos.toString());
    }

    public void test_int() throws IOException {
        stream.writeVal(100);
        stream.close();
        assertEquals("100", baos.toString());
    }

    public void test_boxed_int() throws IOException {
        Object val = Integer.valueOf(100);
        stream.writeVal(val);
        stream.close();
        assertEquals("100", baos.toString());
    }

    public void test_negative_int() throws IOException {
        stream.writeVal(-100);
        stream.close();
        assertEquals("-100", baos.toString());
    }

    public void test_small_int() throws IOException {
        stream.writeVal(3);
        stream.close();
        assertEquals("3", baos.toString());
    }

    public void test_large_int() throws IOException {
        stream.writeVal(31415926);
        stream.close();
        assertEquals("31415926", baos.toString());
    }

    public void test_long() throws IOException {
        stream.writeVal(100L);
        stream.close();
        assertEquals("100", baos.toString());
    }

    public void test_negative_long() throws IOException {
        stream.writeVal(-100L);
        stream.close();
        assertEquals("-100", baos.toString());
    }

    public void test_short() throws IOException {
        stream.writeVal(((short)555));
        stream.close();
        assertEquals("555", baos.toString());
        assertEquals("555", JsonStream.serialize(new Short((short)555)));
    }

    public void test_no_decimal_float() throws IOException {
        stream.writeVal(100f);
        stream.close();
        assertEquals("100", baos.toString());
    }

    public void test_float2() throws IOException {
        stream.writeVal(0.000001f);
        stream.close();
        assertEquals("0.000001", baos.toString());
    }

    public void test_float3() throws IOException {
        stream.writeVal(0.00001f);
        stream.close();
        assertEquals("0.00001", baos.toString());
    }

    public void test_big_float() throws IOException {
        stream.writeVal((float)0x4ffffff);
        stream.close();
        assertEquals("83886080", baos.toString());
    }

    public void test_double() throws IOException {
        stream.writeVal(1.001d);
        stream.close();
        assertEquals("1.001", baos.toString());
    }

    public void test_large_double() throws IOException {
        stream.writeVal(Double.MAX_VALUE);
        stream.close();
        assertEquals("1.7976931348623157E308", baos.toString());
    }

    public void test_boolean() throws IOException {
        stream.writeVal(true);
        stream.writeVal(false);
        stream.close();
        assertEquals("truefalse".replace('\'', '"'), baos.toString());
    }

    public void test_big_decimal() throws IOException {
        stream.writeVal(new BigDecimal("12.34"));
        stream.close();
        assertEquals("12.34".replace('\'', '"'), baos.toString());
    }

    public void test_big_integer() throws IOException {
        stream.writeVal(new BigInteger("1234"));
        stream.close();
        assertEquals("1234".replace('\'', '"'), baos.toString());
    }

    public void test_raw() throws IOException {
        stream = new JsonStream(baos, 32);
        String val = "Hello world!";
        stream.writeRaw(val, val.length());
        stream.close();
        assertEquals(val.replace('\'', '"'), baos.toString());
    }

    public void test_raw2() throws IOException {
        stream = new JsonStream(null, 32);
        String val = "Hello world!";
        stream.writeRaw(val, val.length());
        stream.close();
        assertEquals("", baos.toString());
    }

    public void test_raw3() throws IOException {
        stream = new JsonStream(baos, 32);
        String val = "12345678901234567890";
        stream.writeRaw(val, val.length());
        stream.close();
        assertEquals(val.replace('\'', '"'), baos.toString());
    }

    public void test_raw4() throws IOException {
        stream = new JsonStream(baos, 32);
        String val = "12345678901234567890123456789012";
        stream.writeRaw(val, val.length());
        stream.close();
        assertEquals(val.replace('\'', '"'), baos.toString());
    }

    public void test_raw5() throws IOException {
        stream = new JsonStream(baos, 32);
        String val = "1234567890123456789012345678901234567890";
        stream.writeRaw(val, val.length());
        stream.close();
        assertEquals(val.replace('\'', '"'), baos.toString());
    }
}
