You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/04/28 06:53:51 UTC

[23/48] incubator-weex git commit: * [android] Merge WeexCore-master to master.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java b/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java
deleted file mode 100644
index 85d740f..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/wson/Wson.java
+++ /dev/null
@@ -1,820 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.wson;
-
-
-import android.support.v4.util.LruCache;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.annotation.JSONField;
-import com.taobao.weex.utils.WXLogUtils;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * fast binary json format for parse map and serialize map
- * Created by efurture on 2017/8/16.
- */
-public class Wson {
-
-    /**
-     * skip map null values
-     * */
-    public static final boolean WriteMapNullValue = false;
-    /**
-     * wson data type
-     * */
-    private static final byte NULL_TYPE = '0';
-
-    private static final byte STRING_TYPE = 's';
-
-    private static final byte BOOLEAN_TYPE_TRUE = 't';
-
-    private static final byte BOOLEAN_TYPE_FALSE = 'f';
-
-    private static final byte NUMBER_INT_TYPE = 'i';
-
-    private static final byte NUMBER_LONG_TYPE = 'l';
-
-    private static final byte NUMBER_BIG_INTEGER_TYPE = 'g';
-
-    private static final byte NUMBER_BIG_DECIMAL_TYPE = 'e';
-
-    private static final byte NUMBER_DOUBLE_TYPE = 'd';
-
-    private static final byte NUMBER_FLOAT_TYPE = 'F';
-
-    private static final byte ARRAY_TYPE = '[';
-
-    private static final byte MAP_TYPE = '{';
-
-    /**
-     * StringUTF-16, byte order with native byte order
-     * */
-    private static final boolean IS_NATIVE_LITTLE_ENDIAN = (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN);
-
-
-    /**
-     * parse wson data  to object, please use WXJsonUtils.parseWson
-     * @param  data  byte array
-     * */
-    public static final Object parse(byte[] data){
-        if(data == null){
-            return  null;
-        }
-        try{
-            Parser parser =  new Parser(data);
-            Object object = parser.parse();
-            parser.close();
-            return object;
-        }catch (Exception e){
-            WXLogUtils.e("parseWson", e);
-            return  null;
-        }
-    }
-
-
-    /**
-     * serialize object to wson data, please use WXJsonUtils.wsonWXJSObject
-     * */
-    public static final byte[] toWson(Object object){
-        if(object == null){
-            return  null;
-        }
-        Builder builder = new Builder();
-        byte[]  bts  = builder.toWson(object);
-        builder.close();
-        return bts;
-    }
-
-
-    /**
-     * wson data parser
-     * */
-    private static final class Parser {
-
-        private int position = 0;
-        private byte[] buffer;
-        private char[]  charsBuffer;
-
-        private Parser(byte[] buffer) {
-            this.buffer = buffer;
-            charsBuffer = localCharsBufferCache.get();
-            if(charsBuffer != null){
-                localCharsBufferCache.set(null);
-            }else{
-                charsBuffer = new char[512];
-            }
-        }
-
-
-        private   final Object parse(){
-            return  readObject();
-        }
-
-        private final void close(){
-            position = 0;
-            buffer = null;
-            if(charsBuffer != null){
-                localCharsBufferCache.set(charsBuffer);
-            }
-            charsBuffer = null;
-        }
-
-        private final Object readObject(){
-            byte type  = readType();
-            switch (type){
-                case STRING_TYPE:
-                    return readUTF16String();
-                case NUMBER_INT_TYPE :
-                    return  readVarInt();
-                case NUMBER_FLOAT_TYPE :
-                    return  readFloat();
-                case MAP_TYPE:
-                    return readMap();
-                case ARRAY_TYPE:
-                    return readArray();
-                case NUMBER_DOUBLE_TYPE :
-                    return readDouble();
-                case NUMBER_LONG_TYPE :
-                    return  readLong();
-                case NUMBER_BIG_INTEGER_TYPE :
-                    return  new BigInteger(readUTF16String());
-                case NUMBER_BIG_DECIMAL_TYPE :
-                    return  new BigDecimal(readUTF16String());
-                case BOOLEAN_TYPE_FALSE:
-                    return  Boolean.FALSE;
-                case BOOLEAN_TYPE_TRUE:
-                    return  Boolean.TRUE;
-                case NULL_TYPE:
-                    return  null;
-                default:
-                    throw new RuntimeException("wson unhandled type " + type + " " +
-                            position  +  " length " + buffer.length);
-            }
-        }
-
-
-
-        private final Object readMap(){
-            int size = readUInt();
-            Map<String, Object> object = new JSONObject();;
-            for(int i=0; i<size; i++){
-                String key = readMapKeyUTF16();
-                Object value = readObject();
-                object.put(key, value);
-            }
-            return object;
-        }
-
-        private final Object readArray(){
-            int length = readUInt();
-            List<Object> array = new JSONArray(length);
-            for(int i=0; i<length; i++){
-                array.add(readObject());
-            }
-            return  array;
-        }
-
-        private  final byte readType(){
-            byte type = buffer[position];
-            position ++;
-            return  type;
-        }
-
-
-        private final String readMapKeyUTF16() {
-            int length = readUInt();
-            length = length/2;
-            if(charsBuffer.length < length){
-                charsBuffer = new char[length];
-            }
-            int hash = 5381;
-            if(IS_NATIVE_LITTLE_ENDIAN){
-                for(int i=0; i<length; i++){
-                    char ch = (char) ((buffer[position] & 0xFF) +
-                            (buffer[position + 1] << 8));
-                    charsBuffer[i] = (ch);
-                    hash = ((hash << 5) + hash)  + ch;
-                    position+=2;
-                }
-            }else{
-                for(int i=0; i<length; i++){
-                    char ch = (char) ((buffer[position + 1] & 0xFF) +
-                            (buffer[position] << 8));
-                    charsBuffer[i] = (ch);
-                    hash = ((hash << 5) + hash)  + ch;
-                    position+=2;
-                }
-            }
-            int globalIndex = (globalStringBytesCache.length - 1)&hash;
-            String cache = globalStringBytesCache[globalIndex];
-            if(cache != null
-                    && cache.length() == length){
-                boolean isStringEqual  = true;
-                for(int i=0; i<length; i++){
-                    if(charsBuffer[i] != cache.charAt(i)){
-                        isStringEqual = false;
-                        break;
-                    }
-                }
-                if(isStringEqual) {
-                    return cache;
-                }
-            }
-            cache = new String(charsBuffer, 0, length);
-            if(length < 64) {
-                globalStringBytesCache[globalIndex] = cache;
-            }
-            return  cache;
-        }
-
-        private final String readUTF16String(){
-            int length = readUInt()/2;
-            if(charsBuffer.length < length){
-                charsBuffer = new char[length];
-            }
-            if(IS_NATIVE_LITTLE_ENDIAN){
-                for(int i=0; i<length; i++){
-                    char ch = (char) ((buffer[position] & 0xFF) +
-                            (buffer[position + 1] << 8));
-                    charsBuffer[i] = (ch);
-                    position+=2;
-                }
-            }else{
-                for(int i=0; i<length; i++){
-                    char ch = (char) ((buffer[position + 1] & 0xFF) +
-                            (buffer[position] << 8));
-                    charsBuffer[i] = (ch);
-                    position+=2;
-                }
-            }
-            return  new String(charsBuffer, 0, length);
-        }
-
-
-
-
-
-        private   final int readVarInt(){
-            int raw = readUInt();
-            // This undoes the trick in putVarInt()
-            int num = (((raw << 31) >> 31) ^ raw) >> 1;
-            // This extra step lets us deal with the largest signed values by treating
-            // negative results from read unsigned methods as like unsigned values.
-            // Must re-flip the top bit if the original read value had it set.
-            return num ^ (raw & (1 << 31));
-        }
-
-        private final  int readUInt(){
-            int value = 0;
-            int i = 0;
-            int b;
-            while (((b = buffer[position]) & 0x80) != 0) {
-                value |= (b & 0x7F) << i;
-                i += 7;
-                position+=1;
-                if (i > 35) {
-                    throw new IllegalArgumentException("Variable length quantity is too long");
-                }
-            }
-            position+=1;
-            return value | (b << i);
-        }
-
-        private final long readLong(){
-            long number = (((buffer[position + 7] & 0xFFL)      ) +
-                    ((buffer[position + 6] & 0xFFL) <<  8) +
-                    ((buffer[position + 5] & 0xFFL) << 16) +
-                    ((buffer[position + 4] & 0xFFL) << 24) +
-                    ((buffer[position + 3] & 0xFFL) << 32) +
-                    ((buffer[position + 2] & 0xFFL) << 40) +
-                    ((buffer[position + 1] & 0xFFL) << 48) +
-                    (((long) buffer[position])      << 56));
-            position += 8;
-            return  number;
-        }
-
-        private  final Object readDouble(){
-            double number = Double.longBitsToDouble(readLong());
-            if(number > Integer.MAX_VALUE){
-                long numberLong = (long) number;
-                double doubleLong = (numberLong);
-                if(number - doubleLong < Double.MIN_NORMAL){
-                    return numberLong;
-                }
-            }
-            return  number;
-        }
-
-        private Object readFloat() {
-            int number = (((buffer[position + 3] & 0xFF)      ) +
-                    ((buffer[position + 2] & 0xFF) <<  8) +
-                    ((buffer[position + 1] & 0xFF) << 16) +
-                    ((buffer[position  ] & 0xFF) << 24));
-            position +=4;
-            return  Float.intBitsToFloat(number);
-        }
-    }
-
-    /**
-     * wson builder
-     * */
-    private static final class Builder {
-
-        private byte[] buffer;
-        private int position;
-        private ArrayList refs;
-        private final static ThreadLocal<byte[]> bufLocal = new ThreadLocal<byte[]>();
-        private final static ThreadLocal<ArrayList> refsLocal = new ThreadLocal<ArrayList>();
-
-
-
-        private Builder(){
-            buffer =  bufLocal.get();
-            if(buffer != null) {
-                bufLocal.set(null);
-            }else{
-                buffer = new byte[1024];
-            }
-            refs = refsLocal.get();
-            if(refs != null){
-                refsLocal.set(null);
-            }else{
-                refs = new ArrayList<>(16);
-            }
-        }
-
-
-        private final byte[] toWson(Object object){
-            writeObject(object);
-            byte[] bts = new byte[position];
-            System.arraycopy(buffer, 0, bts, 0, position);
-            return  bts;
-        }
-
-        private final void close(){
-            if(buffer.length <= 1024*16){
-                bufLocal.set(buffer);
-            }
-            if(refs.isEmpty()){
-                refsLocal.set(refs);
-            }else{
-                refs.clear();
-            }
-            refs = null;
-            buffer = null;
-            position = 0;
-        }
-
-        private final void writeObject(Object object) {
-            if(object instanceof  CharSequence){
-                ensureCapacity(2);
-                writeByte(STRING_TYPE);
-                writeUTF16String((CharSequence) object);
-                return;
-            }else if (object instanceof Map){
-                if(refs.contains(object)){
-                    ensureCapacity(2);
-                    writeByte(NULL_TYPE);
-                    return;
-                }
-                refs.add(object);
-                Map map = (Map) object;
-                writeMap(map);
-                refs.remove(refs.size()-1);
-                return;
-            }else if (object instanceof List){
-                if(refs.contains(object)){
-                    ensureCapacity(2);
-                    writeByte(NULL_TYPE);
-                    return;
-                }
-                refs.add(object);
-                ensureCapacity(8);
-                List list = (List) object;
-                writeByte(ARRAY_TYPE);
-                writeUInt(list.size());
-                for(Object value : list){
-                    writeObject(value);
-                }
-                refs.remove(refs.size()-1);
-                return;
-            }else if (object instanceof Number){
-                Number number = (Number) object;
-                writeNumber(number);
-                return;
-            }else if (object instanceof  Boolean){
-                ensureCapacity(2);
-                Boolean value  = (Boolean) object;
-                if(value){
-                    writeByte(BOOLEAN_TYPE_TRUE);
-                }else{
-                    writeByte(BOOLEAN_TYPE_FALSE);
-                }
-                return;
-            }else if(object == null){
-                ensureCapacity(2);
-                writeByte(NULL_TYPE);
-                return;
-            }else if (object.getClass().isArray()){
-                if(refs.contains(object)){
-                    ensureCapacity(2);
-                    writeByte(NULL_TYPE);
-                    return;
-                }
-                refs.add(object);
-                ensureCapacity(8);
-                int length = Array.getLength(object);
-                writeByte(ARRAY_TYPE);
-                writeUInt(length);
-                for(int i=0; i<length; i++){
-                    Object value = Array.get(object, i);
-                    writeObject(value);
-                }
-                refs.remove(refs.size()-1);
-                return;
-            }else  if(object instanceof  Date){
-                ensureCapacity(10);
-                double date = ((Date)object).getTime();
-                writeByte(NUMBER_DOUBLE_TYPE);
-                writeDouble(date);
-            }else  if(object instanceof  Calendar){
-                ensureCapacity(10);
-                double date = ((Calendar)object).getTime().getTime();
-                writeByte(NUMBER_DOUBLE_TYPE);
-                writeDouble(date);
-            }else  if(object instanceof  Collection){
-                if(refs.contains(object)){
-                    ensureCapacity(2);
-                    writeByte(NULL_TYPE);
-                    return;
-                }
-                refs.add(object);
-                ensureCapacity(8);
-                Collection list = (Collection) object;
-                writeByte(ARRAY_TYPE);
-                writeUInt(list.size());
-                for(Object value : list){
-                    writeObject(value);
-                }
-                refs.remove(refs.size()-1);
-            }else{
-                if(refs.contains(object)){
-                    ensureCapacity(2);
-                    writeByte(NULL_TYPE);
-                }else {
-                    refs.add(object);
-                    if(object.getClass().isEnum()){
-                        writeObject(JSON.toJSONString(object));
-                    }else{
-                        writeAdapterObject(object);
-                    }
-                    refs.remove(refs.size()-1);
-                }
-                return;
-            }
-        }
-
-        private final void writeNumber(Number number) {
-            ensureCapacity(12);
-            if(number instanceof  Integer){
-                writeByte(NUMBER_INT_TYPE);
-                writeVarInt(number.intValue());
-                return;
-            }
-
-            if(number instanceof Float){
-                writeByte(NUMBER_FLOAT_TYPE);
-                writeFloat(number.floatValue());
-                return;
-            }
-            if(number instanceof  Double){
-                writeByte(NUMBER_DOUBLE_TYPE);
-                writeDouble(number.doubleValue());
-                return;
-            }
-
-            if(number instanceof  Long){
-                writeByte(NUMBER_LONG_TYPE);
-                writeLong(number.longValue());
-                return;
-            }
-
-            if(number instanceof  Short
-                    || number instanceof  Byte){
-                writeByte(NUMBER_INT_TYPE);
-                writeVarInt(number.intValue());
-                return;
-            }
-
-            if(number instanceof BigInteger){
-                writeByte(NUMBER_BIG_INTEGER_TYPE);
-                writeUTF16String(number.toString());
-                return;
-            }
-
-            if(number instanceof BigDecimal){
-                String value = number.toString();
-                double doubleValue = number.doubleValue();
-                if(value.equals(Double.toString(doubleValue))){
-                    writeByte(NUMBER_DOUBLE_TYPE);
-                    writeDouble(doubleValue);
-                }else {
-                    writeByte(NUMBER_BIG_DECIMAL_TYPE);
-                    writeUTF16String(value);
-                }
-                return;
-            }
-            writeByte(STRING_TYPE);
-            writeUTF16String(number.toString());
-
-        }
-
-        private final  void writeMap(Map map) {
-            if(WriteMapNullValue){
-                ensureCapacity(8);
-                writeByte(MAP_TYPE);
-                writeUInt(map.size());
-                Set<Map.Entry<Object,Object>>  entries = map.entrySet();
-                for(Map.Entry<Object,Object> entry : entries){
-                    writeMapKeyUTF16(entry.getKey().toString());
-                    writeObject(entry.getValue());
-                }
-            }else{
-                Set<Map.Entry<Object,Object>>  entries = map.entrySet();
-                int nullValueSize = 0;
-                for(Map.Entry<Object,Object> entry : entries){
-                    if(entry.getValue() == null){
-                        nullValueSize++;
-                    }
-                }
-
-                ensureCapacity(8);
-                writeByte(MAP_TYPE);
-                writeUInt(map.size()-nullValueSize);
-                for(Map.Entry<Object,Object> entry : entries){
-                    if(entry.getValue() == null){
-                        continue;
-                    }
-                    writeMapKeyUTF16(entry.getKey().toString());
-                    writeObject(entry.getValue());
-                }
-            }
-        }
-
-
-        private final void writeByte(byte type){
-            buffer[position] = type;
-            position++;
-        }
-
-        private final void writeAdapterObject(Object object){
-            if(specialClass.get(object.getClass().getName()) != null){
-                writeObject(JSON.toJSON(object));
-                return;
-            }
-            try{
-                writeMap(toMap(object));
-            }catch (Exception e){
-                specialClass.put(object.getClass().getName(), true);
-                writeObject(JSON.toJSON(object));
-            }
-        }
-
-        private  final Map  toMap(Object object){
-            Map map = new JSONObject();
-            try {
-                Class<?> targetClass = object.getClass();
-                String key = targetClass.getName();
-                List<Method> methods = getBeanMethod(key, targetClass);
-                for (Method method : methods) {
-                    String methodName = method.getName();
-                    if (methodName.startsWith(METHOD_PREFIX_GET)) {
-                        Object value = method.invoke(object);
-                        if(value != null){
-                            StringBuilder builder = new StringBuilder(method.getName().substring(3));
-                            builder.setCharAt(0, Character.toLowerCase(builder.charAt(0)));
-                            map.put(builder.toString(), (Object) value);
-                        }
-                    }else if(methodName.startsWith(METHOD_PREFIX_IS)){
-                        Object value = method.invoke(object);
-                        if(value != null){
-                            StringBuilder builder = new StringBuilder(method.getName().substring(2));
-                            builder.setCharAt(0, Character.toLowerCase(builder.charAt(0)));
-                            map.put(builder.toString(), value);
-                        }
-                    }
-                }
-                List<Field> fields = getBeanFields(key, targetClass);
-                for(Field field : fields){
-                    String fieldName = field.getName();
-                    if(map.containsKey(fieldName)){
-                        continue;
-                    }
-                    Object value  = field.get(object);
-                    if(value == null){
-                        continue;
-                    }
-                    map.put(fieldName, value);
-                }
-            }catch (Exception e){
-                if(e instanceof  RuntimeException){
-                    throw  (RuntimeException)e;
-                }else{
-                    throw  new RuntimeException(e);
-                }
-            }
-            return  map;
-        }
-
-        private  final void writeMapKeyUTF16(String value){
-            writeUTF16String(value);
-        }
-
-
-
-
-        /**
-         * writeString UTF-16
-         * */
-        private  final void writeUTF16String(CharSequence value){
-            int length = value.length();
-            ensureCapacity(length*2 + 8);
-            writeUInt(length*2);
-            if(IS_NATIVE_LITTLE_ENDIAN){
-                for(int i=0; i<length; i++){
-                    char ch = value.charAt(i);
-                    buffer[position] = (byte) (ch);
-                    buffer[position+1] = (byte) (ch >>> 8);
-                    position+=2;
-                }
-            }else{
-                for(int i=0; i<length; i++){
-                    char ch = value.charAt(i);
-                    buffer[position + 1] = (byte) (ch      );
-                    buffer[position] = (byte) (ch >>> 8);
-                    position+=2;
-                }
-            }
-        }
-
-
-        private final void writeDouble(double value){
-            writeLong(Double.doubleToLongBits(value));
-        }
-
-        private final void writeFloat(float value){
-            int val = Float.floatToIntBits(value);
-            buffer[position + 3] = (byte) (val       );
-            buffer[position + 2] = (byte) (val >>>  8);
-            buffer[position + 1] = (byte) (val >>> 16);
-            buffer[position ] = (byte) (val >>> 24);
-            position += 4;
-        }
-
-        private final void writeLong(long val){
-            buffer[position + 7] = (byte) (val       );
-            buffer[position + 6] = (byte) (val >>>  8);
-            buffer[position + 5] = (byte) (val >>> 16);
-            buffer[position + 4] = (byte) (val >>> 24);
-            buffer[position + 3] = (byte) (val >>> 32);
-            buffer[position + 2] = (byte) (val >>> 40);
-            buffer[position + 1] = (byte) (val >>> 48);
-            buffer[position    ] = (byte) (val >>> 56);
-            position += 8;
-        }
-
-        private final void writeVarInt(int value){
-            writeUInt((value << 1) ^ (value >> 31));
-        }
-
-        private final void  writeUInt(int value){
-            while ((value & 0xFFFFFF80) != 0) {
-                buffer[position] = (byte)((value & 0x7F) | 0x80);
-                position++;
-                value >>>= 7;
-            }
-            buffer[position] = (byte)(value & 0x7F);
-            position++;
-        }
-
-
-        private final void ensureCapacity(int minCapacity) {
-            minCapacity += position;
-            // overflow-conscious code
-            if (minCapacity - buffer.length > 0){
-                int oldCapacity = buffer.length;
-                int newCapacity = oldCapacity << 1;
-                if(newCapacity < 1024*16){
-                    newCapacity = 1024*16;
-                }
-                if (newCapacity - minCapacity < 0) {
-                    newCapacity = minCapacity;
-                }
-                buffer = Arrays.copyOf(buffer, newCapacity);
-            }
-        }
-    }
-
-
-    /**
-     * cache json property key, most of them all same
-     * */
-    private static final int GLOBAL_STRING_CACHE_SIZE = 2*1024;
-    private static final ThreadLocal<char[]> localCharsBufferCache = new ThreadLocal<>();
-    private static final String[] globalStringBytesCache = new String[GLOBAL_STRING_CACHE_SIZE];
-
-
-
-
-    /**
-     * lru cache, to map helper
-     * */
-    private static final String METHOD_PREFIX_GET = "get";
-    private static final String METHOD_PREFIX_IS = "is";
-    private static LruCache<String, List<Method>> methodsCache = new LruCache<>(128);
-    private static LruCache<String, List<Field>> fieldsCache = new LruCache<>(128);
-    private static LruCache<String, Boolean> specialClass = new LruCache<>(16);
-
-
-    private static final List<Method> getBeanMethod(String key, Class targetClass){
-        List<Method> methods = methodsCache.get(key);
-        if(methods == null){
-            methods = new ArrayList<>();
-            Method[]  allMethods = targetClass.getMethods();
-            for(Method method : allMethods){
-                if(method.getDeclaringClass() == Object.class){
-                    continue;
-                }
-                if( (method.getModifiers() & Modifier.STATIC) != 0){
-                    continue;
-                }
-                String methodName = method.getName();
-                if(methodName.startsWith(METHOD_PREFIX_GET)
-                        || methodName.startsWith(METHOD_PREFIX_IS)) {
-                    if(method.getAnnotation(JSONField.class) != null){
-                        throw new UnsupportedOperationException("getBeanMethod JSONField Annotation Not Handled, Use toJSON");
-                    }
-                    methods.add(method);
-                }
-            }
-            methodsCache.put(key, methods);
-        }
-        return methods;
-    }
-
-
-
-    private static  final List<Field> getBeanFields(String key, Class targetClass){
-        List<Field> fieldList = fieldsCache.get(key);
-        if(fieldList == null) {
-            Field[] fields = targetClass.getFields();
-            fieldList = new ArrayList<>(fields.length);
-            for(Field field : fields){
-                if((field.getModifiers() & Modifier.STATIC) != 0){
-                    continue;
-                }
-                if(field.getAnnotation(JSONField.class) != null){
-                    throw new UnsupportedOperationException("getBeanMethod JSONField Annotation Not Handled, Use toJSON");
-                }
-                fieldList.add(field);
-            }
-            fieldsCache.put(key, fieldList);
-        }
-        return  fieldList;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/WXSDKEngineTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/WXSDKEngineTest.java b/android/sdk/src/test/java/com/taobao/weex/WXSDKEngineTest.java
index 3d21b4c..0864653 100644
--- a/android/sdk/src/test/java/com/taobao/weex/WXSDKEngineTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/WXSDKEngineTest.java
@@ -18,15 +18,9 @@
  */
 package com.taobao.weex;
 
-import android.app.Application;
-import android.content.pm.ApplicationInfo;
-import android.test.mock.MockApplication;
-import com.taobao.weex.adapter.IWXHttpAdapter;
 import com.taobao.weex.bridge.WXBridgeManagerTest;
 import com.taobao.weex.common.TestModule;
 import com.taobao.weex.common.TestModuleFactory;
-import com.taobao.weex.dom.TestDomObject;
-import com.taobao.weex.http.WXStreamModule;
 import com.taobao.weex.ui.component.TestComponent;
 import com.taobao.weex.ui.component.WXComponent;
 
@@ -35,7 +29,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/WXSDKInstanceTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/WXSDKInstanceTest.java b/android/sdk/src/test/java/com/taobao/weex/WXSDKInstanceTest.java
index 051ba9e..6be97ae 100644
--- a/android/sdk/src/test/java/com/taobao/weex/WXSDKInstanceTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/WXSDKInstanceTest.java
@@ -30,7 +30,6 @@ import com.taobao.weex.bridge.WXBridgeManagerTest;
 import com.taobao.weex.common.WXPerformance;
 import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.dom.WXDomManagerTest;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXComponentFactory;
 import com.taobao.weex.ui.component.WXDivTest;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/adapter/DefaultUriAdapterTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/adapter/DefaultUriAdapterTest.java b/android/sdk/src/test/java/com/taobao/weex/adapter/DefaultUriAdapterTest.java
index 967199e..3c4d84b 100644
--- a/android/sdk/src/test/java/com/taobao/weex/adapter/DefaultUriAdapterTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/adapter/DefaultUriAdapterTest.java
@@ -110,7 +110,7 @@ public class DefaultUriAdapterTest {
     assertEquals(Uri.parse(host + "/test2"), uri);
 
     uri = adapter.rewrite(instance, URIAdapter.IMAGE, Uri.parse(""));
-    assertEquals(Uri.parse(""), uri);
+    assertEquals(Uri.parse(bundleUrl), uri);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeManagerTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeManagerTest.java b/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeManagerTest.java
index 43f0f16..61a3f14 100644
--- a/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeManagerTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeManagerTest.java
@@ -19,12 +19,9 @@
 package com.taobao.weex.bridge;
 
 import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
 
 import android.os.Handler;
 import android.os.Message;
-
-import com.alibaba.fastjson.JSON;
 import com.taobao.weappplus_sdk.BuildConfig;
 import com.taobao.weex.InitConfig;
 import com.taobao.weex.WXSDKEngine;
@@ -33,7 +30,6 @@ import com.taobao.weex.WXSDKInstanceTest;
 import com.taobao.weex.WXSDKManagerTest;
 import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXJSBridgeMsgType;
-import com.taobao.weex.dom.WXDomModule;
 import com.taobao.weex.ui.WXRenderManager;
 import org.junit.After;
 import org.junit.Before;
@@ -108,12 +104,12 @@ public class WXBridgeManagerTest {
   public void testCallNative() throws Exception {
     getInstance()
         .callNative(instance.getInstanceId(),
-            JSON.parseArray("[{\"module\":\"testModule\",\"method\":\"test\"}]"),
+            "[{\"module\":\"testModule\",\"method\":\"test\"}]",
             null);
 
     getInstance()
         .callNative(instance.getInstanceId(),
-                JSON.parseArray("[{\"module\":\""+WXDomModule.WXDOM+"\",\"method\":\"test\"}]"),
+            "[{\"module\":\""+WXDomModule.WXDOM+"\",\"method\":\"test\"}]",
             null);
 
   }
@@ -130,7 +126,7 @@ public class WXBridgeManagerTest {
 
   @Test
   public void testCallback() throws Exception {
-//    getInstance().callbackJavascript(instance.getInstanceId(),"test",null,false);
+    getInstance().callbackJavascript(instance.getInstanceId(),"test",null,false);
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeTest.java b/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeTest.java
index 198a90d..13feaf6 100644
--- a/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/bridge/WXBridgeTest.java
@@ -18,7 +18,6 @@
  */
 package com.taobao.weex.bridge;
 
-import com.alibaba.fastjson.JSON;
 import com.taobao.weappplus_sdk.BuildConfig;
 import org.junit.After;
 import org.junit.Before;
@@ -47,12 +46,12 @@ public class WXBridgeTest {
 
   @Test
   public void testCallNative() throws Exception {
-    bridge.callNative("1", JSON.parseArray("[]"),"100");
+    bridge.callNative("1","{}","100");
   }
 
   @Test
   public void testCallAddElement() throws Exception {
-    bridge.callAddElement("1","1", JSON.parseObject("{}"),"0","100");
+    bridge.callAddElement("1","1","{}","0","100");
   }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java b/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
deleted file mode 100644
index f290191..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/dom/TestDomObject.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.dom;
-
-import com.taobao.weex.dom.flex.CSSLayout;
-
-import static com.taobao.weex.common.Constants.Event;
-
-/**
- * Created by sospartan on 7/27/16.
- */
-public class TestDomObject extends WXDomObject {
-  public static void setRef(WXDomObject dom,String ref){
-    dom.mRef = ref;
-  }
-
-  public static void setAttribute(WXDomObject dom,WXAttr attr){
-    dom.mAttributes = attr;
-  }
-
-  public TestDomObject(){
-    mStyles = new WXStyle();
-    csslayout.dimensions[0] = 100;
-    csslayout.dimensions[0] = 50;
-    csslayout.position[CSSLayout.POSITION_LEFT] = 10;
-    csslayout.position[CSSLayout.POSITION_RIGHT] = 20;
-    csslayout.position[CSSLayout.POSITION_TOP] = 20;
-    csslayout.position[CSSLayout.POSITION_BOTTOM] = 30;
-    mAttributes = new WXAttr();
-
-    mEvents = new WXEvent();
-    mEvents.add(Event.DISAPPEAR);
-    mEvents.add(Event.APPEAR);
-    mEvents.add(Event.CHANGE);
-    mEvents.add(Event.BLUR);
-    mEvents.add(Event.INPUT);
-    mEvents.add(Event.FOCUS);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/WXDomModuleTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXDomModuleTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXDomModuleTest.java
deleted file mode 100644
index 0d18a41..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/dom/WXDomModuleTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.dom;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.taobao.weappplus_sdk.BuildConfig;
-import com.taobao.weex.WXSDKInstanceTest;
-import com.taobao.weex.bridge.WXBridgeManager;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
-import static com.taobao.weex.dom.WXDomModule.*;
-
-/**
- * Created by sospartan on 7/29/16.
- */
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class, sdk = 19)
-@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*","org.json.*" })
-@PrepareForTest()
-public class WXDomModuleTest {
-
-  static final String[] METHODS  = {
-    CREATE_BODY,
-    UPDATE_ATTRS ,
-    UPDATE_STYLE ,
-    REMOVE_ELEMENT,
-    ADD_ELEMENT ,
-    MOVE_ELEMENT,
-    ADD_EVENT ,
-    REMOVE_EVENT,
-    CREATE_FINISH ,
-    REFRESH_FINISH,
-      UPDATE_FINISH,
-    SCROLL_TO_ELEMENT,
-    null,
-    "unknown_method"
-  };
-
-  static JSONObject data;
-  static{
-    data = new JSONObject();
-    data.put("a","b");
-  }
-
-  static final Object[][] ARGS_CASES = {
-    null,
-    {new JSONObject()},
-    {"",new JSONObject()},
-    {"test",data},
-    {"test"},
-    {"",new JSONObject(),1},
-    {"test",new JSONObject(),1},
-    {"","",1},
-    {"test","test",1},
-    {"","test"},
-    {"test","test"},
-  };
-
-
-
-  WXDomModule module;
-
-  @Before
-  public void setUp() throws Exception {
-    module = new WXDomModule(WXSDKInstanceTest.createInstance());
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    WXDomManagerTest.getLooper().idle();
-  }
-
-  @Test
-  public void testCallDomMethod() throws Exception {
-    module.callDomMethod(null);
-
-    JSONObject obj = new JSONObject();
-    for (String m :
-      METHODS) {
-      obj.put(WXBridgeManager.METHOD,m);
-      module.callDomMethod(obj);
-    }
-
-
-    obj = new JSONObject();
-    for (Object[] args:ARGS_CASES
-         ) {
-      JSONArray ary = new JSONArray();
-      if(args == null){
-        ary = null;
-      }else {
-        for (Object arg : args
-          ) {
-          ary.add(arg);
-        }
-      }
-      obj.put(WXBridgeManager.ARGS,ary);
-      for (String m :
-        METHODS) {
-        obj.put(WXBridgeManager.METHOD,m);
-        module.callDomMethod(obj);
-      }
-    }
-  }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/WXDomObjectTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXDomObjectTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXDomObjectTest.java
deleted file mode 100644
index 7d23d95..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/dom/WXDomObjectTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.dom;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.taobao.weappplus_sdk.BuildConfig;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
-import static org.junit.Assert.*;
-
-/**
- * Created by sospartan on 8/29/16.
- */
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class, sdk = 19)
-@PowerMockIgnore( {"org.mockito.*", "org.robolectric.*", "android.*"})
-public class WXDomObjectTest {
-
-  WXDomObject dom;
-
-  @Before
-  public void setUp() throws Exception {
-    dom = new TestDomObject();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    dom.destroy();
-  }
-
-  @Test
-  public void testParseFromJson() throws Exception {
-    dom.parseFromJson(JSONObject.parseObject("{\"ref\":\"100\",\"type\":\"div\",\"attr\":{},\"style\":{\"backgroundColor\":\"rgb(40,96,144)\",\"fontSize\":40,\"color\":\"#ffffff\",\"paddingRight\":30,\"paddingLeft\":30,\"paddingBottom\":20,\"paddingTop\":20}}"));
-    assertEquals(dom.getRef(),"100");
-    assertEquals(dom.getType(),"div");
-
-    dom.applyStyleToNode();
-  }
-
-  @Test
-  public void testAdd() throws Exception {
-    JSONObject obj = new JSONObject();
-    obj.put("ref","100");
-    obj.put("type","div");
-    dom.parseFromJson(obj);
-
-    JSONObject child = new JSONObject();
-    child.put("ref","101");
-    child.put("type","test");
-    WXDomObject childDom = new WXDomObject();
-    childDom.parseFromJson(child);
-
-    dom.add(childDom,0);
-    assertEquals(dom.getChildCount(),1);
-    assertEquals(dom.getChild(0),childDom);
-
-    dom.removeChildAt(0);
-    assertEquals(dom.getChildCount(),0);
-
-    dom.add(childDom,0);
-    assertEquals(dom.getChildCount(),1);
-    assertEquals(dom.getChild(0),childDom);
-
-    dom.remove(childDom);
-
-  }
-
-  @Test
-  public void testClone() throws Exception {
-    JSONObject.parseObject("{\"ref\":\"100\",\"type\":\"div\",\"attr\":{},\"style\":{\"backgroundColor\":\"rgb(40,96,144)\",\"fontSize\":40,\"color\":\"#ffffff\",\"paddingRight\":30,\"paddingLeft\":30,\"paddingBottom\":20,\"paddingTop\":20}}");
-    JSONObject obj = new JSONObject();
-    obj.put("ref","101");
-    obj.put("type","test");
-
-    JSONArray event = new JSONArray();
-    event.add("click");
-    obj.put("event",event);
-    dom.parseFromJson(obj);
-
-    WXDomObject clone = dom.clone();
-    assertEquals(clone.getRef(),"101");
-    assertEquals(clone.getType(),"test");
-
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/WXDomStatementTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXDomStatementTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXDomStatementTest.java
index 1cdcf70..4bdd77a 100644
--- a/android/sdk/src/test/java/com/taobao/weex/dom/WXDomStatementTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/dom/WXDomStatementTest.java
@@ -27,7 +27,6 @@ import com.taobao.weex.WXSDKInstanceTest;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.WXSDKManagerTest;
 import com.taobao.weex.bridge.WXBridgeManagerTest;
-import com.taobao.weex.dom.action.TestActions;
 import com.taobao.weex.ui.WXRenderManager;
 
 import org.junit.After;
@@ -269,10 +268,10 @@ public class WXDomStatementTest {
 
   @Test
   public void testCreateFinish() throws Exception {
-//    createBody();
-//    createFinish();
-//
-//    stmt.batch();
+    createBody();
+    createFinish();
+
+    stmt.batch();
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
index fbd00cb..c01259a 100644
--- a/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/dom/WXTextDomObjectTest.java
@@ -19,16 +19,13 @@
 package com.taobao.weex.dom;
 
 import com.taobao.weappplus_sdk.BuildConfig;
-import com.taobao.weex.common.Constants;
+
 import static com.taobao.weex.common.Constants.Name.*;
 
-import com.taobao.weex.dom.flex.MeasureOutput;
-import com.taobao.weex.ui.component.WXComponent;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mockito;
 import org.powermock.api.mockito.PowerMockito;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/action/TestActions.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/action/TestActions.java b/android/sdk/src/test/java/com/taobao/weex/dom/action/TestActions.java
deleted file mode 100644
index f41bdff..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/dom/action/TestActions.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.dom.action;
-
-import com.alibaba.fastjson.JSONObject;
-import com.taobao.weex.dom.DOMAction;
-
-/**
- * Created by sospartan on 01/03/2017.
- */
-
-public class TestActions {
-  public static DOMAction body(JSONObject data){
-    return new CreateBodyAction(data);
-  }
-
-
-  public static DOMAction addDom(JSONObject obj, String parentRef, int index) {
-    return new AddElementAction(obj,parentRef,index);
-  }
-
-  public static DOMAction remove(String ref) {
-    return new RemoveElementAction(ref);
-  }
-
-  public static DOMAction updateAttr(String ref, JSONObject data) {
-    return new UpdateAttributeAction(ref,data);
-  }
-
-  public static DOMAction updateStyle(String ref, JSONObject data, boolean byPesudo) {
-    return new UpdateStyleAction(ref,data,byPesudo);
-  }
-
-  public static DOMAction moveDom(String ref, String parent, int index) {
-    return new MoveElementAction(ref,parent,index);
-  }
-
-  public static DOMAction scrollTo(String ref,JSONObject data){
-    return new ScrollToElementAction(ref,data);
-  }
-
-  public static DOMAction addEvent(String ref,String event){
-    return new AddEventAction(ref,event);
-  }
-
-  public static DOMAction removeEvent(String ref,String event){
-    return new RemoveEventAction(ref,event);
-  }
-
-  public static DOMAction createFinish(){
-    return new CreateFinishAction();
-  }
-
-  public static DOMAction updateFinish(){
-    return new UpdateFinishAction();
-  }
-
-  public static DOMAction refreshFinish(){
-    return new RefreshFinishAction();
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java
deleted file mode 100644
index 7374026..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/dom/transition/WXTransitionTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.dom.transition;
-
-import android.app.Application;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.taobao.weappplus_sdk.BuildConfig;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.utils.WXViewUtils;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created by furture on 2017/10/18.
- */
-@RunWith(RobolectricTestRunner.class)
-@Config(constants = BuildConfig.class, sdk = 19)
-@PowerMockIgnore( {"org.mockito.*", "org.robolectric.*", "android.*"})
-public class WXTransitionTest extends Application{
-
-
-
-    @Test
-    public void  testFrom(){
-        WXViewUtils.setScreenWidth(750);
-        WXDomObject domObject = new WXDomObject();
-        domObject.setViewPortWidth(750);
-        JSONObject map = JSON.parseObject("{\n" +
-                "    \"style\": {\n" +
-                "        \"width\": 600, \n" +
-                "        \"marginLeft\": 75, \n" +
-                "        \"marginTop\": 35, \n" +
-                "        \"marginBottom\": 35, \n" +
-                "        \"flexDirection\": \"column\", \n" +
-                "        \"justifyContent\": \"center\", \n" +
-                "        \"borderWidth\": 2, \n" +
-                "        \"borderStyle\": \"solid\", \n" +
-                "        \"borderColor\": \"rgb(0,180,255)\", \n" +
-                "        \"backgroundColor\": \"rgba(0,180,255,0.2)\", \n" +
-                "        \"transitionProperty\": \"height\", \n" +
-                "        \"transitionDuration\": 300, \n" +
-                "        \"transitionDelay\": 50, \n" +
-                "        \"transitionTimingFunction\": \"ease-in-out\"\n" +
-                "    }\n" +
-                "}");
-        domObject.parseFromJson(map);
-        Assert.assertNotNull("transition success",domObject.getTransition());
-        WXTransition transition = domObject.getTransition();
-        Map<String, Object> updates = new HashMap();
-        updates.put("height", "1000");
-        Assert.assertTrue(transition.hasTransitionProperty(updates));
-        transition.startTransition(updates);
-
-
-
-    }
-
-    @Test
-    public void testSplit(){
-
-        Assert.assertTrue(Arrays.equals(new String[]{"height", "width"}, WXTransition.PROPERTY_SPLIT_PATTERN.split("height|width")));
-        Assert.assertTrue(Arrays.equals(new String[]{"height", "width"}, WXTransition.PROPERTY_SPLIT_PATTERN.split("height,width")));
-
-
-        System.out.println(Arrays.toString(WXTransition.PROPERTY_SPLIT_PATTERN.split("height|width")));
-        System.out.println(Arrays.toString(WXTransition.PROPERTY_SPLIT_PATTERN.split("height,width")));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/el/FailedCaseTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/el/FailedCaseTest.java b/android/sdk/src/test/java/com/taobao/weex/el/FailedCaseTest.java
deleted file mode 100644
index f887dca..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/el/FailedCaseTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.el;
-
-import com.alibaba.fastjson.JSONObject;
-import com.taobao.weex.el.parse.ArrayStack;
-import com.taobao.weex.el.parse.Parser;
-import com.taobao.weex.el.parse.Token;
-
-import junit.framework.TestCase;
-
-/**
- * Created by furture on 2018/1/25.
- */
-
-public class FailedCaseTest extends TestCase {
-
-
-    public void testVElseIf0(){
-        JSONObject data = new JSONObject();
-        JSONObject item = new JSONObject();
-        item.put("number", 0.0);
-        data.put("item", item);
-        ArrayStack stack = new ArrayStack();
-        stack.push(data);
-
-        Token token = Parser.parse("!(item.number%3 === 0) && (item.number%3 === 1)");
-
-        System.out.println(token.toString() + "  " + token.execute(stack));
-
-        Token if2 = Parser.parse("!(!(item.number%3 === 0) && (item.number%3 === 1))");
-        System.out.println(if2 + "   " + if2.execute(stack));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/el/IfStatementTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/el/IfStatementTest.java b/android/sdk/src/test/java/com/taobao/weex/el/IfStatementTest.java
deleted file mode 100644
index 3ba24f9..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/el/IfStatementTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.el;
-
-import com.alibaba.fastjson.JSONObject;
-import com.taobao.weex.el.parse.ArrayStack;
-import com.taobao.weex.el.parse.Operators;
-import com.taobao.weex.el.parse.Parser;
-import com.taobao.weex.el.parse.Token;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-
-/**
- * Created by furture on 2017/8/29.
- */
-
-public class IfStatementTest extends TestCase {
-
-    public void  testVIfFront(){
-        Assert.assertTrue(isIfTrue("((true) && 2 > 1) && 1", createContext()));
-        Assert.assertTrue(isIfTrue("(3 == 3)  === (3 === 3)", createContext()));
-        Assert.assertFalse(isIfTrue("1 ?  false : true", createContext()));
-        Assert.assertTrue(isIfTrue("1 ?  true : false", createContext()));
-        Assert.assertFalse(isIfTrue("!(source)", createContext()));
-        Assert.assertTrue(isIfTrue("(source)", createContext()));
-    }
-
-
-    public void  testVIfMath(){
-        Assert.assertFalse(isIfTrue("1 ?  false : true", createContext()));
-        Assert.assertTrue(isIfTrue("1 ?  true : false", createContext()));
-        Assert.assertTrue(isIfTrue("1 >= 1", createContext()));
-        Assert.assertFalse(isIfTrue("1 >= 2", createContext()));
-        Assert.assertTrue(isIfTrue("1 && 1 >= 0", createContext()));
-        Assert.assertFalse(isIfTrue("false && 1 >= 0", createContext()));
-        Assert.assertTrue(isIfTrue("1 >= '1'", createContext()));
-        Assert.assertTrue(isIfTrue("0 >= '-1'", createContext()));
-        Assert.assertTrue(isIfTrue("0 >= '-1", createContext()));
-        Assert.assertFalse(isIfTrue("!(source)", createContext()));
-        Assert.assertTrue(isIfTrue("(source)", createContext()));
-
-
-
-
-
-        Assert.assertFalse(isIfTrue("1 > 1", createContext()));
-        Assert.assertFalse(isIfTrue("-1 > 1", createContext()));
-        Assert.assertTrue(isIfTrue("1 > -1", createContext()));
-
-
-        Assert.assertTrue(isIfTrue("1 <= 1", createContext()));
-        Assert.assertTrue(isIfTrue("1 <= '1'", createContext()));
-
-        Assert.assertFalse(isIfTrue("1 < 1", createContext()));
-
-        Assert.assertFalse(isIfTrue("1 <= -1", createContext()));
-        Assert.assertFalse(isIfTrue("1 < -2 ", createContext()));
-        Assert.assertTrue(isIfTrue("1 > 0", createContext()));
-        Assert.assertTrue(isIfTrue("1 >= 0.1", createContext()));
-        Assert.assertFalse(isIfTrue("0 >= 1", createContext()));
-        Assert.assertFalse(isIfTrue(" -1 > 1", createContext()));
-        Assert.assertTrue(isIfTrue("0 < 1", createContext()));
-        Assert.assertTrue(isIfTrue(" -1 <= 1", createContext()));
-    }
-
-
-
-    public void  testVIfAndOr(){
-        Assert.assertTrue(isIfTrue("1 && 1", createContext()));
-        Assert.assertTrue(isIfTrue("1 && true", createContext()));
-        Assert.assertFalse(isIfTrue("1 && false", createContext()));
-
-        Assert.assertTrue(isIfTrue("true || false", createContext()));
-        Assert.assertTrue(isIfTrue("1 || false", createContext()));
-        Assert.assertFalse(isIfTrue("false && false", createContext()));
-        Assert.assertFalse(isIfTrue("1 && false", createContext()));
-        Assert.assertFalse(isIfTrue(" && 1", createContext()));
-        Assert.assertTrue(isIfTrue("1 && 1 && 1 && true && true", createContext()));
-        Assert.assertFalse(isIfTrue("false && 1 && 1 && true && true", createContext()));
-        Assert.assertTrue(isIfTrue("1===1  && 1===1", createContext()));
-
-    }
-
-    public void  testVIfBracket(){
-        Assert.assertTrue(isIfTrue("((true) && 2 > 1) && 1", createContext()));
-        Assert.assertFalse(isIfTrue("((true) && 2 < 1) && 1", createContext()));
-        Assert.assertTrue(isIfTrue("((true) && 2 < 1) || 1", createContext()));
-        Assert.assertTrue(isIfTrue("((true && 2 > 1 && 1", createContext()));
-        Assert.assertTrue(isIfTrue("true && 2 > 1 && 1", createContext()));
-        Assert.assertTrue(isIfTrue("(('true') && 2 > 1) && 1", createContext()));
-        Assert.assertTrue(isIfTrue("(('true') && 2 > 1) && 1 ()()", createContext()));
-        Assert.assertTrue(isIfTrue("(('true') && 2 > 1) && 1 (   )", createContext()));
-
-
-        Assert.assertTrue(isIfTrue("((true) && 2 > 1) && (1)", createContext()));
-        Assert.assertTrue(isIfTrue("((true) && 2 > 1) && (1) && (1)", createContext()));
-        Assert.assertTrue(isIfTrue("((true) && 2 > 1) && (1) || (3)", createContext()));
-
-        Assert.assertTrue(isIfTrue("1", createContext()));
-        Assert.assertTrue(isIfTrue("true && 2 > 1 && 1", createContext()));
-    }
-
-    public void  testDebug(){
-        //System.out.println("isIfTrue" + isIfTrue("((true) && 2 > 1) && 1", createContext()));
-        Assert.assertFalse(isIfTrue("1 <= 0", createContext()));
-        Assert.assertTrue(isIfTrue("1 > -1 + 1", createContext()));
-        Assert.assertFalse(isIfTrue("1 < -1", createContext()));
-        //Assert.assertTrue(isIfTrue("-1", createContext()));
-    }
-
-    public void  testVIf(){
-        Assert.assertTrue(isIfTrue("((true) && 2 > 1) && 1", createContext()));
-        Assert.assertTrue(isIfTrue("'hello' === 'hello'", createContext()));
-        Assert.assertTrue(isIfTrue("'3 ' === 3", createContext()));
-        Assert.assertTrue(isIfTrue("'3 ' == 3", createContext()));
-        Assert.assertFalse(isIfTrue("'3 ' != 3", createContext()));
-        Assert.assertTrue(isIfTrue("(3 === 3)  === true", createContext()));
-        Assert.assertTrue(isIfTrue("(3 == 3)  === (3 === 3)", createContext()));
-    }
-
-    private boolean isIfTrue(String code, Object context){
-        Token block = Parser.parse(code);
-        System.out.println( code + " ==> " + block);
-        return Operators.isTrue(block.execute(context));
-    }
-    private ArrayStack createContext(){
-        JSONObject data = new JSONObject();
-        data.put("item", new JSONObject());
-        data.put("index", 20);
-        data.put("source", true);
-        data.getJSONObject("item").put("name", "hello world");
-
-        ArrayStack context = new ArrayStack();
-        context.push(data);
-        return context;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/el/ParserTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/el/ParserTest.java b/android/sdk/src/test/java/com/taobao/weex/el/ParserTest.java
deleted file mode 100644
index b95e85a..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/el/ParserTest.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.el;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.parser.Feature;
-import com.taobao.weex.el.parse.ArrayStack;
-import com.taobao.weex.el.parse.Operators;
-import com.taobao.weex.el.parse.Parser;
-import com.taobao.weex.el.parse.Token;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-
-/**
- * Created by furture on 2017/8/28.
- */
-
-public class ParserTest extends TestCase {
-
-
-
-    public void  testParseString(){
-        Assert.assertEquals("hello world", Parser.parse("\"hello world\"").execute(null));
-        Assert.assertEquals("hello 'world",  Parser.parse("\"hello \'world\"").execute(null));
-        Assert.assertEquals("hello \"world", Parser.parse("\"hello \\\"world\"").execute(null));
-        Assert.assertEquals("hello world", Parser.parse("'hello world'").execute(null));
-        Assert.assertEquals("hello \"world", Parser.parse("'hello \"world'").execute(null));
-        Assert.assertEquals("hello 'world", Parser.parse("'hello \\'world'").execute(null));
-    }
-
-    public void  testMath(){
-        Assert.assertEquals(5.0, Parser.parse("1+4").execute(null));
-        Assert.assertEquals(4000001.0, Parser.parse("1+4e6").execute(null));
-        Assert.assertEquals(400001.0, Parser.parse("1+.4e6").execute(null));
-        Assert.assertEquals(1.4, Parser.parse("1+.4").execute(null));
-        Assert.assertEquals(11.0, Parser.parse("1+e6").execute(createContext()));
-        Assert.assertEquals("1e7hello", Parser.parse("1+e7").execute(createContext()));
-        Assert.assertEquals(9.0, Parser.parse("1+4*2").execute(null));
-        Assert.assertEquals(5.0, Parser.parse("1+4*2/2").execute(null));
-        Assert.assertEquals(3.0, Parser.parse("1+4/2").execute(null));
-        Assert.assertEquals(2.0, Parser.parse("1+4/4").execute(null));
-        Assert.assertEquals(2.0, Parser.parse("1+4%3").execute(null));
-        Assert.assertEquals(1.0, Parser.parse("1+4%4").execute(null));
-        Assert.assertTrue(Double.isInfinite((double)Parser.parse("1+4/0").execute(null)));
-        Assert.assertTrue(Double.isNaN((double)Parser.parse("4%0").execute(null)));
-
-        Assert.assertEquals(Parser.parse("1").execute(null), Parser.parse("1++*").execute(null));
-        Assert.assertEquals(3.0, Parser.parse("1+2+*").execute(null));
-        Assert.assertEquals(3.0, Parser.parse("1+(2*+*)").execute(null));
-    }
-
-    public void testCondition(){
-        Assert.assertEquals(1, Parser.parse("0 ? 2 : 1").execute(null));
-        Assert.assertEquals(2, Parser.parse("1 ? 2 : 1").execute(null));
-        Assert.assertEquals(3, Parser.parse("0 ? 1 : (2 ? 3 : 4)").execute(null));
-        Assert.assertEquals(3, Parser.parse("0 ? 1 : 2 ? 3 : 4").execute(null));
-        Assert.assertEquals(4, Parser.parse("0 ? 1 : 0 ? 3 : 4").execute(null));
-        Assert.assertEquals(5, Parser.parse("1 ? 5 : (2 ? 3 : 4)").execute(null));
-        Assert.assertEquals(1, Parser.parse("0?2:1").execute(null));
-        Assert.assertEquals(1, Parser.parse("0?2:1").execute(null));
-        Assert.assertEquals(4, Parser.parse("0?1:0?3:4").execute(null));
-        Assert.assertEquals(3, Parser.parse("0?1:0+1?3:4").execute(null));
-        Assert.assertEquals("hello world", Parser.parse("item.name ? item.name : false").execute(this.createContext()));
-        Assert.assertEquals(10, Parser.parse("item.name ? item[1] : false").execute(this.createContext()));
-        Assert.assertEquals("hello world", Parser.parse("item.name == null ? false : item.name").execute(this.createContext()));
-        Assert.assertEquals(false, Parser.parse("true ? false : item.name").execute(this.createContext()));
-        Assert.assertEquals(false, Parser.parse("true ? false : item.name.work").execute(this.createContext()));
-        Assert.assertEquals("hello world", Parser.parse("item.name ? item.name : false").execute(this.createContext()));
-        Assert.assertEquals(null, Parser.parse("item.name ? item.name.not : false").execute(this.createContext()));
-        Assert.assertEquals("hello world", Parser.parse("item.name == null ? false : (item.name)").execute(this.createContext()));
-
-
-    }
-
-    public void testDebug(){
-        System.out.println("execute " + Parser.parse("true ? false : item.name").execute(this.createContext()));
-        show("true ? false : true xxxx");
-        show("true ? false : ((item.name))");
-        Parser.parse("item[1]").execute(this.createContext());
-        Token block = Parser.parse("{{{item.name}}}");
-        show("true ? item.name : false");
-        show("((true) && 2 > 1) && (1) && (1)");
-        System.out.println(block.execute(createContext())
-        + "  " + Double.parseDouble(".0e6"));
-        show("1 > -1");
-
-    }
-
-
-    public void  testBracket(){
-       // Assert.assertEquals(Parser.parse("(item.name)").toString(), Parser.parse("(((item.name)))").toString());
-       // Assert.assertEquals(Parser.parse("((item.name))").toString(), Parser.parse("(((item.name)))").toString());
-        Assert.assertEquals("hello world", Parser.parse("(((item.name)))").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("((item.name))").execute(createContext()));
-    }
-
-    public void  testEl(){
-        Assert.assertEquals(true, Parser.parse("${item.name.length == 11}").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("${{{item.name}}}").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("${{item.name}}").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("${{{item.name}}}").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("{{item.name}}").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("{{{item.name}}}").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("{{{{item.name}}}}").execute(createContext()));
-        Assert.assertEquals(1, Parser.parse("1").execute(createContext()));
-        Assert.assertEquals(30.0, Parser.parse("item[1] + index").execute(createContext()));
-        Assert.assertEquals("hello world20", Parser.parse("item.name + index").execute(createContext()));
-        Assert.assertEquals("hello world20", Parser.parse("item[name] + index").execute(createContext()));
-        Assert.assertEquals(21.0, Parser.parse("1 + index").execute(createContext()));
-        Assert.assertEquals(11.0, Parser.parse("1 + index/2").execute(createContext()));
-        Assert.assertEquals(20.0, Parser.parse("item.name/10 + index").execute(createContext()));
-
-        Assert.assertEquals(31.0, Parser.parse("item.name.length + index").execute(createContext()));
-        Assert.assertEquals(22.0, Parser.parse("item.length + index").execute(createContext()));
-        Assert.assertEquals(36.0, Parser.parse("count * ${ratio}").execute(createContext()));
-        Assert.assertEquals(36.0, Parser.parse("count * ${ratio}").execute(createContext()));
-        Assert.assertEquals(36.0, Parser.parse("count * ${{ratio}}").execute(createContext()));
-        Assert.assertEquals(36.0, Parser.parse("count * ${{{ratio}}}").execute(createContext()));
-        Assert.assertEquals(36.0, Parser.parse("count * $ratio").execute(createContext()));
-    }
-
-    public void testIf(){
-        Assert.assertTrue(Operators.isTrue(Parser.parse("1 ?  true : false").execute(createContext())));
-        Assert.assertFalse(Operators.isTrue(Parser.parse("1 ?  false : true").execute(createContext())));
-        Assert.assertFalse(Operators.isTrue(Parser.parse("1 ?  null : true").execute(createContext())));
-        Assert.assertFalse(Operators.isTrue(Parser.parse("1 ?  undefined : true").execute(createContext())));
-        Assert.assertFalse(Operators.isTrue(Parser.parse("1 ?  \"\" : true").execute(createContext())));
-        Assert.assertEquals("hello world", Parser.parse("true ? item.name : false").execute(createContext()));
-        Assert.assertEquals("hello world", Parser.parse("item.name ? item.name : false").execute(createContext()));
-        Assert.assertEquals(true, Parser.parse("true").execute(createContext()));
-        Assert.assertEquals(false, Parser.parse("false").execute(createContext()));
-        Assert.assertEquals(null, Parser.parse("null").execute(createContext()));
-        Assert.assertEquals(null, Parser.parse("undefined").execute(createContext()));
-
-    }
-
-
-    public void testParse(){
-        Assert.assertEquals(1, Parser.parse("0?2:1").execute(null));
-        Assert.assertEquals(4, Parser.parse("0?1:0?3:4").execute(null));
-        Assert.assertEquals(3, Parser.parse("0?1:0+1?3:4").execute(null));
-        Parser.parse("item.code  \"string test \" ( item.ddd)  .item  1000  ccc ? ddd : 0");
-        Parser.parse("1+e6");
-        show(null);
-
-        show("()++++");
-
-        show("item");
-    }
-
-
-    private void show(String code){
-        Token block = Parser.parse(code);
-        System.out.println( code + " ==> " + block);
-    }
-
-    public void  testArray(){
-        int disableDecimalFeature = JSON.DEFAULT_PARSER_FEATURE &= ~Feature.UseBigDecimal.getMask();
-        Assert.assertEquals(JSONArray.parse("[2, 3, 3]", disableDecimalFeature), Parser.parse("[2, 3, 3]").execute(null));
-        Assert.assertEquals(JSONArray.parse("[2.0, 3, 3]", disableDecimalFeature), Parser.parse("[1+1, 3, 3]").execute(null));
-        Assert.assertEquals(JSONArray.parse("[2.0, 3,[3, 3], 3]", disableDecimalFeature), Parser.parse("[1+1, 3, [3, 3], 3]").execute(null));
-        Assert.assertEquals(JSONArray.parse("['hello world', 3,[3, 3], 3]", disableDecimalFeature), Parser.parse("[item.name, 3, [3, 3], 3]").execute(this.createContext()));
-        Assert.assertEquals(JSONArray.parse("[10, 3,[3, 3], 3]", disableDecimalFeature), Parser.parse("[item[1], 3, [3, 3], 3]").execute(this.createContext()));
-        Assert.assertEquals(JSONArray.parse("[1, 3,[3, 3], 3]", disableDecimalFeature), Parser.parse("[1, 3, [3, 3], 3]").execute(this.createContext()));
-        Assert.assertEquals(JSONArray.parse("[1, 3,['hello world', 3], 3]", disableDecimalFeature), Parser.parse("[1, 3, [item.name, 3], 3]").execute(this.createContext()));
-        Assert.assertEquals(JSONArray.parse("[1, [1, 2],[3, 3], 3]", disableDecimalFeature), Parser.parse("[1, [1, 2], [3, 3], 3]").execute(this.createContext()));
-        Assert.assertEquals(null,  Parser.parse("item[name + index]").execute(this.createContext()));
-        Assert.assertEquals("hello world", Parser.parse("item[name]").execute(this.createContext()));
-        Assert.assertEquals("hello world", Parser.parse("item['name']").execute(this.createContext()));
-        Assert.assertEquals(10, Parser.parse("item[1]").execute(this.createContext()));
-        Assert.assertEquals(JSONArray.parse("[false, [1, 2],[3, 3], 3]", disableDecimalFeature), Parser.parse("[!true, [1, 2], [3, 3], 3]").execute(this.createContext()));
-        Assert.assertEquals(JSONArray.parse("[2, 3, 3]", disableDecimalFeature), Parser.parse("[(2), 3, 3]").execute(null));
-        Assert.assertEquals(JSONArray.parse("[2, 3, 3]", disableDecimalFeature), Parser.parse("([2, 3, 3])").execute(null));
-        Assert.assertEquals(JSONArray.parse("[2, 3, 3]", disableDecimalFeature), Parser.parse("([2, 3, (3)])").execute(null));
-
-    }
-
-
-    public void testOperator(){
-        Parser parser = new Parser("(1 + 3)/3*3");
-        Token block = parser.parse();
-
-        System.out.println(block.execute(null));
-
-        System.out.println(block);
-
-        Parser parser2 = new Parser("1 + +++");
-        block = parser2.parse();
-
-
-        System.out.println(block);
-
-
-        String[] values = {null, null};
-        for (Object value : values) {
-            System.out.println(value + "ddd");
-        }
-
-    }
-
-    private ArrayStack createContext(){
-        JSONObject data = new JSONObject();
-        data.put("item", new JSONObject());
-        data.put("index", 20);
-        data.put("1", 10);
-        data.put("source", true);
-        data.put("e6", 10);
-        data.put("e7", "e7hello");
-        data.put("ratio", 6);
-        data.put("count", 6);
-        data.getJSONObject("item").put("name", "hello world");
-        data.getJSONObject("item").put("1", 10);
-
-        ArrayStack context = new ArrayStack();
-        context.push(data);
-        return context;
-    }
-
-
-
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/http/WXStreamModuleTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/http/WXStreamModuleTest.java b/android/sdk/src/test/java/com/taobao/weex/http/WXStreamModuleTest.java
index f4643ec..e0a2aa3 100644
--- a/android/sdk/src/test/java/com/taobao/weex/http/WXStreamModuleTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/http/WXStreamModuleTest.java
@@ -21,7 +21,6 @@ package com.taobao.weex.http;
 import android.os.Looper;
 import android.telecom.Call;
 
-import com.alibaba.fastjson.JSON;
 import com.taobao.weex.WXSDKInstanceTest;
 import com.taobao.weex.adapter.DefaultWXHttpAdapter;
 import com.taobao.weex.adapter.IWXHttpAdapter;
@@ -95,7 +94,7 @@ public class WXStreamModuleTest {
 
     WXStreamModule streamModule = new WXStreamModule(adapter);
     Callback cb = new Callback();
-    streamModule.fetch(JSON.parseObject("{}"),cb,null);
+    streamModule.fetch("",cb,null);
 
     assert   !(boolean)cb.mData.get("ok");
   }
@@ -117,7 +116,7 @@ public class WXStreamModuleTest {
 
     WXStreamModule streamModule = createModule(adapter);
     Callback cb = new Callback();
-    streamModule.fetch(JSON.parseObject("{'url':'http://www.taobao.com'}"),cb,null);
+    streamModule.fetch("{'url':'http://www.taobao.com'}",cb,null);
 
     assert   (boolean)cb.mData.get("ok");
   }
@@ -136,7 +135,7 @@ public class WXStreamModuleTest {
 
     WXStreamModule streamModule = createModule(adapter);
     Callback cb = new Callback();
-    streamModule.fetch(JSON.parseObject("{'url':'http://www.taobao.com'}"),null,cb);
+    streamModule.fetch("{'url':'http://www.taobao.com'}",null,cb);
 
     assert   ((Map<String,String>)cb.mData.get("headers")).get("key").equals("someval");
   }
@@ -147,7 +146,7 @@ public class WXStreamModuleTest {
     JSCallback progress = mock(JSCallback.class);
     JSCallback finish = mock(JSCallback.class);
     System.out.print("request start "+System.currentTimeMillis());
-    streamModule.fetch(JSON.parseObject("{method: 'POST',url: 'http://httpbin.org/post',type:'json'}"),finish,progress);
+    streamModule.fetch("{method: 'POST',url: 'http://httpbin.org/post',type:'json'}",finish,progress);
     verify(progress,timeout(10*1000).atLeastOnce()).invokeAndKeepAlive(anyMapOf(String.class, Object.class));
     verify(finish,timeout(10*1000).times(1)).invoke(anyMapOf(String.class, Object.class));
     System.out.print("\nrequest finish"+System.currentTimeMillis());
@@ -166,10 +165,10 @@ public class WXStreamModuleTest {
     });
     Callback finish = new Callback();
 
-    streamModule.fetch(JSON.parseObject("{}"),finish,null);
+    streamModule.fetch("",finish,null);
     assertEquals(finish.mData.get(WXStreamModule.STATUS_TEXT),Status.ERR_INVALID_REQUEST);
 
-    streamModule.fetch(JSON.parseObject("{method: 'POST',url: 'http://httpbin.org/post',type:'json'}"),finish,null);
+    streamModule.fetch("{method: 'POST',url: 'http://httpbin.org/post',type:'json'}",finish,null);
     assertEquals(finish.mData.get(WXStreamModule.STATUS_TEXT),Status.ERR_CONNECT_FAILED);
 
     streamModule = createModule(new IWXHttpAdapter() {
@@ -180,7 +179,7 @@ public class WXStreamModuleTest {
         listener.onHttpFinish(response);
       }
     });
-    streamModule.fetch(JSON.parseObject("{method: 'POST',url: 'http://httpbin.org/post',type:'json'}"),finish,null);
+    streamModule.fetch("{method: 'POST',url: 'http://httpbin.org/post',type:'json'}",finish,null);
     assertEquals(finish.mData.get(WXStreamModule.STATUS),302);
     assertEquals(finish.mData.get(WXStreamModule.STATUS).getClass(),Integer.class);
     assertEquals(finish.mData.get(WXStreamModule.STATUS_TEXT),Status.getStatusText("302"));

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/ui/ComponentHolderTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/ComponentHolderTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/ComponentHolderTest.java
index fb9e85a..1ddb122 100644
--- a/android/sdk/src/test/java/com/taobao/weex/ui/ComponentHolderTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/ComponentHolderTest.java
@@ -20,14 +20,11 @@ package com.taobao.weex.ui;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.bridge.Invoker;
-import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXVContainer;
 
 import java.lang.reflect.InvocationTargetException;
 
-import static org.junit.Assert.*;
-
 /**
  * Created by sospartan on 8/4/16.
  */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/ui/WXRenderStatementTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/WXRenderStatementTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/WXRenderStatementTest.java
index 044c92c..1c4fef9 100644
--- a/android/sdk/src/test/java/com/taobao/weex/ui/WXRenderStatementTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/WXRenderStatementTest.java
@@ -42,7 +42,7 @@ import org.robolectric.annotation.Config;
 @PrepareForTest({WXSoInstallMgrSdk.class, TextUtils.class,WXComponentFactory.class})
 public class WXRenderStatementTest {
 
-    RenderActionContextImpl mWXRenderStatement;
+    RenderContextImpl mWXRenderStatement;
 
     @Before
     public void setUp() throws Exception {
@@ -52,7 +52,7 @@ public class WXRenderStatementTest {
         PowerMockito.when(TextUtils.isEmpty("124")).thenReturn(true);
         PowerMockito.when(WXSoInstallMgrSdk.initSo(null, 1, null)).thenReturn(true);
         WXSDKInstance instance = Mockito.mock(WXSDKInstance.class);
-        mWXRenderStatement = new RenderActionContextImpl(instance);
+        mWXRenderStatement = new RenderContextImpl(instance);
     }
 
     public void testCreateBody() throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java
deleted file mode 100644
index 28b94ab..0000000
--- a/android/sdk/src/test/java/com/taobao/weex/ui/animation/TransformParserTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex.ui.animation;
-
-import android.util.Property;
-import android.view.View;
-
-import junit.framework.TestCase;
-
-import java.util.Map;
-
-/**
- * Created by furture on 2017/10/24.
- */
-
-public class TransformParserTest extends TestCase {
-
-    public void testParseTransform(){
-        Map<Property<View,Float>, Float> transforms =  TransformParser.parseTransForm("rotate(7deg) translate(1, 2)", 100, 100, 750);
-        System.out.println(transforms.size());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/test/java/com/taobao/weex/ui/animation/WXAnimationModuleTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/ui/animation/WXAnimationModuleTest.java b/android/sdk/src/test/java/com/taobao/weex/ui/animation/WXAnimationModuleTest.java
index 52e52fa..7dd4858 100644
--- a/android/sdk/src/test/java/com/taobao/weex/ui/animation/WXAnimationModuleTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/ui/animation/WXAnimationModuleTest.java
@@ -18,7 +18,6 @@
  */
 package com.taobao.weex.ui.animation;
 
-import com.alibaba.fastjson.JSONObject;
 import com.taobao.weappplus_sdk.BuildConfig;
 import com.taobao.weex.WXSDKInstanceTest;
 
@@ -51,8 +50,8 @@ public class WXAnimationModuleTest {
 
   @Test
   public void testTransition() throws Exception {
-    module.transition("", JSONObject.parseObject("{}"),"");
-    module.transition("test", JSONObject.parseObject("{\"test\":\"test\"}"),"");
+    module.transition("","","");
+    module.transition("test","test","");
   }
 
   @Test