| /** |
| * 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; |
| } |
| |
| |
| |
| |
| |
| |
| } |