package com.alibaba.json.bvt.parser;
import org.junit.Assert;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.json.bvt.util.ThreadLocalCacheTest;
import junit.framework.TestCase;
public class TestUTF8_2 extends TestCase {
public void test_utf_1() throws Exception {
String content = new String(decodeHex("F0A4ADA2".toCharArray()), "UTF-8");
JSONObject json = new JSONObject();
json.put("content", content);
JSONObject obj = (JSONObject) JSON.parse(json.toJSONString().getBytes("UTF-8"));
Assert.assertEquals(1, obj.size());
Assert.assertEquals(content, obj.get("content"));
}
public void test_utf_2() throws Exception {
String content = new String(decodeHex("E282AC".toCharArray()), "UTF-8");
JSONObject json = new JSONObject();
json.put("content", content);
JSONObject obj = (JSONObject) JSON.parse(json.toJSONString().getBytes("UTF-8"));
Assert.assertEquals(1, obj.size());
Assert.assertEquals(content, obj.get("content"));
}
public void test_utf_3() throws Exception {
byte[] bytes = decodeHex("C2A2".toCharArray());
String content = new String(bytes, "UTF-8");
JSONObject json = new JSONObject();
json.put("content", content);
JSONObject obj = (JSONObject) JSON.parse(json.toJSONString().getBytes("UTF-8"));
Assert.assertEquals(1, obj.size());
Assert.assertEquals(content, obj.get("content"));
}
public void test_utf_4() throws Exception {
ThreadLocalCacheTest.clearChars();
byte[] bytes = decodeHex("C2FF".toCharArray());
String content = new String(bytes, "UTF-8");
JSONObject json = new JSONObject();
json.put("content", content);
JSONObject obj = (JSONObject) JSON.parse(json.toJSONString().getBytes("UTF-8"));
Assert.assertEquals(1, obj.size());
Assert.assertEquals(content, obj.get("content"));
}
public static byte[] decodeHex(char[] data) throws Exception {
int len = data.length;
if ((len & 0x01) != 0) {
throw new Exception("Odd number of characters.");
}
byte[] out = new byte[len >> 1];
// two characters form the hex value.
for (int i = 0, j = 0; j < len; i++) {
int f = toDigit(data[j], j) << 4;
j++;
f = f | toDigit(data[j], j);
j++;
out[i] = (byte) (f & 0xFF);
}
return out;
}
protected static int toDigit(char ch, int index) throws Exception {
int digit = Character.digit(ch, 16);
if (digit == -1) {
throw new Exception("Illegal hexadecimal character " + ch + " at index " + index);
}
return digit;
}
}