svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.library / org.gvsig.expressionevaluator / org.gvsig.expressionevaluator.lib / org.gvsig.expressionevaluator.lib.impl / src / test / java / org / gvsig / expresionevaluator / impl / TestJsonInterpreter.java @ 45025
History | View | Annotate | Download (10.4 KB)
1 | 44139 | jjdelcerro | package org.gvsig.expresionevaluator.impl; |
---|---|---|---|
2 | |||
3 | 44761 | jjdelcerro | import java.text.ParseException; |
4 | 45011 | jjdelcerro | import java.util.List; |
5 | import java.util.Map; |
||
6 | import javax.json.JsonArray; |
||
7 | import javax.json.JsonObject; |
||
8 | 44139 | jjdelcerro | import junit.framework.TestCase; |
9 | import org.gvsig.expressionevaluator.Code; |
||
10 | import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator; |
||
11 | import org.gvsig.expressionevaluator.ExpressionEvaluatorManager; |
||
12 | import org.gvsig.expressionevaluator.Interpreter; |
||
13 | import org.gvsig.expressionevaluator.LexicalAnalyzer; |
||
14 | import org.gvsig.expressionevaluator.SymbolTable; |
||
15 | import org.gvsig.expressionevaluator.Compiler; |
||
16 | import org.gvsig.expressionevaluator.MutableSymbolTable; |
||
17 | import org.gvsig.tools.library.impl.DefaultLibrariesInitializer; |
||
18 | |||
19 | /**
|
||
20 | *
|
||
21 | * @author jjdelcerro
|
||
22 | */
|
||
23 | 45011 | jjdelcerro | public class TestJsonInterpreter extends TestCase { |
24 | 44139 | jjdelcerro | |
25 | 45011 | jjdelcerro | public TestJsonInterpreter(String testName) { |
26 | 44139 | jjdelcerro | super(testName);
|
27 | } |
||
28 | |||
29 | @Override
|
||
30 | protected void setUp() throws Exception { |
||
31 | super.setUp();
|
||
32 | new DefaultLibrariesInitializer().fullInitialize();
|
||
33 | } |
||
34 | |||
35 | @Override
|
||
36 | protected void tearDown() throws Exception { |
||
37 | super.tearDown();
|
||
38 | } |
||
39 | |||
40 | // TODO add test methods here. The name must begin with 'test'. For example:
|
||
41 | // public void testHello() {}
|
||
42 | |||
43 | protected LexicalAnalyzer createLexicalAnalyzer() {
|
||
44 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
45 | LexicalAnalyzer lexer = manager.createLexicalAnalyzer(); |
||
46 | return lexer;
|
||
47 | } |
||
48 | |||
49 | protected org.gvsig.expressionevaluator.Compiler createCompiler() {
|
||
50 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
51 | Compiler compiler = manager.createCompiler();
|
||
52 | compiler.setLexicalAnalyzer(createLexicalAnalyzer()); |
||
53 | return compiler;
|
||
54 | } |
||
55 | |||
56 | protected MutableSymbolTable createSymbolTable() {
|
||
57 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
58 | MutableSymbolTable symbolTable = manager.createSymbolTable(); |
||
59 | symbolTable.setVar("precio", 200); |
||
60 | symbolTable.setVar("1990", 0.168873933773767); |
||
61 | return symbolTable;
|
||
62 | } |
||
63 | |||
64 | protected Interpreter createInterpreter(SymbolTable symbolTable) {
|
||
65 | ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager(); |
||
66 | Interpreter interpreter = manager.createInterpreter(); |
||
67 | interpreter.setSymbolTable(symbolTable); |
||
68 | return interpreter;
|
||
69 | } |
||
70 | 44761 | jjdelcerro | |
71 | 45011 | jjdelcerro | public void testSimpleList() throws ParseException { |
72 | 44139 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
73 | Compiler compiler = createCompiler();
|
||
74 | Interpreter interpreter = createInterpreter(symbolTable); |
||
75 | |||
76 | 45011 | jjdelcerro | String source = "[ 10, 20, 'adios' ]"; |
77 | 44761 | jjdelcerro | |
78 | 44139 | jjdelcerro | Code code = compiler.compileExpression(source); |
79 | Object v = interpreter.run(code);
|
||
80 | 45011 | jjdelcerro | |
81 | assertEquals("[ 10, 20, 'adios' ]", code.toString());
|
||
82 | assertTrue("List expected", v instanceof List); |
||
83 | assertEquals(3, ((List)v).size()); |
||
84 | assertEquals(10, ((List)v).get(0)); |
||
85 | assertEquals(20, ((List)v).get(1)); |
||
86 | assertEquals("adios", ((List)v).get(2)); |
||
87 | 44139 | jjdelcerro | } |
88 | |||
89 | 45011 | jjdelcerro | public void testSimpleDict() throws ParseException { |
90 | 44139 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
91 | Compiler compiler = createCompiler();
|
||
92 | Interpreter interpreter = createInterpreter(symbolTable); |
||
93 | |||
94 | 45011 | jjdelcerro | String source = "{ diez:10, 'veinte':20, saludo:'hola', 'despedida':'adios' }"; |
95 | 44139 | jjdelcerro | |
96 | Code code = compiler.compileExpression(source); |
||
97 | Object v = interpreter.run(code);
|
||
98 | 45011 | jjdelcerro | |
99 | assertEquals("{ 'diez':10, 'veinte':20, 'saludo':'hola', 'despedida':'adios' }", code.toString());
|
||
100 | assertTrue("Map expected", v instanceof Map); |
||
101 | assertEquals(4, ((Map)v).size()); |
||
102 | assertEquals(10, ((Map)v).get("diez")); |
||
103 | assertEquals(20, ((Map)v).get("veinte")); |
||
104 | assertEquals("hola", ((Map)v).get("saludo")); |
||
105 | assertEquals("adios", ((Map)v).get("despedida")); |
||
106 | 44139 | jjdelcerro | } |
107 | |||
108 | 45011 | jjdelcerro | public void testSimpleToJsonObjectFromString() throws ParseException { |
109 | 44761 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
110 | 44139 | jjdelcerro | Compiler compiler = createCompiler();
|
111 | Interpreter interpreter = createInterpreter(symbolTable); |
||
112 | |||
113 | 45011 | jjdelcerro | String source = "to_json('{ \"diez\":10, \"veinte\":20, \"despedida\":\"adios\" }')"; |
114 | 44139 | jjdelcerro | |
115 | Code code = compiler.compileExpression(source); |
||
116 | Object v = interpreter.run(code);
|
||
117 | |||
118 | 45011 | jjdelcerro | assertEquals("to_json('{ \"diez\":10, \"veinte\":20, \"despedida\":\"adios\" }')", code.toString());
|
119 | assertTrue("JsonObject expected", v instanceof JsonObject); |
||
120 | assertEquals(3, ((JsonObject)v).size());
|
||
121 | assertEquals(10, ((JsonObject)v).getInt("diez")); |
||
122 | assertEquals(20, ((JsonObject)v).getInt("veinte")); |
||
123 | assertEquals("adios", ((JsonObject)v).getString("despedida")); |
||
124 | 44139 | jjdelcerro | } |
125 | |||
126 | 45011 | jjdelcerro | public void testSimpleToJsonObjectFromMap() throws ParseException { |
127 | 44761 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
128 | 44139 | jjdelcerro | Compiler compiler = createCompiler();
|
129 | Interpreter interpreter = createInterpreter(symbolTable); |
||
130 | |||
131 | 45011 | jjdelcerro | String source = "to_json({ diez:10, veinte:20, despedida:'adios' })"; |
132 | 44139 | jjdelcerro | |
133 | Code code = compiler.compileExpression(source); |
||
134 | Object v = interpreter.run(code);
|
||
135 | |||
136 | 45011 | jjdelcerro | assertEquals("to_json({ 'diez':10, 'veinte':20, 'despedida':'adios' })", code.toString());
|
137 | assertTrue("JsonObject expected", v instanceof JsonObject); |
||
138 | assertEquals(3, ((JsonObject)v).size());
|
||
139 | assertEquals(10, ((JsonObject)v).getInt("diez")); |
||
140 | assertEquals(20, ((JsonObject)v).getInt("veinte")); |
||
141 | assertEquals("adios", ((JsonObject)v).getString("despedida")); |
||
142 | 44384 | jjdelcerro | } |
143 | |||
144 | 45011 | jjdelcerro | public void testSimpleToJsonArrayFromString() throws ParseException { |
145 | 44761 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
146 | 44139 | jjdelcerro | Compiler compiler = createCompiler();
|
147 | Interpreter interpreter = createInterpreter(symbolTable); |
||
148 | |||
149 | 45011 | jjdelcerro | String source = "to_json('[ 10, 20, \"adios\" ]')"; |
150 | 44139 | jjdelcerro | |
151 | Code code = compiler.compileExpression(source); |
||
152 | Object v = interpreter.run(code);
|
||
153 | 45011 | jjdelcerro | |
154 | assertEquals("to_json('[ 10, 20, \"adios\" ]')", code.toString());
|
||
155 | |||
156 | assertTrue("JsonArray expected", v instanceof JsonArray); |
||
157 | assertEquals(3, ((JsonArray)v).size());
|
||
158 | assertEquals(10, ((JsonArray)v).getInt(0)); |
||
159 | assertEquals(20, ((JsonArray)v).getInt(1)); |
||
160 | assertEquals("adios", ((JsonArray)v).getString(2)); |
||
161 | 44139 | jjdelcerro | } |
162 | |||
163 | 45011 | jjdelcerro | public void testSimpleToJsonArrayFromList() throws ParseException { |
164 | 44761 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
165 | 44139 | jjdelcerro | Compiler compiler = createCompiler();
|
166 | Interpreter interpreter = createInterpreter(symbolTable); |
||
167 | |||
168 | 45011 | jjdelcerro | String source = "to_json([ 10, 20, 'adios' ])"; |
169 | 44139 | jjdelcerro | |
170 | Code code = compiler.compileExpression(source); |
||
171 | Object v = interpreter.run(code);
|
||
172 | 45011 | jjdelcerro | |
173 | assertEquals("to_json([ 10, 20, 'adios' ])", code.toString());
|
||
174 | |||
175 | assertTrue("JsonArray expected", v instanceof JsonArray); |
||
176 | assertEquals(3, ((JsonArray)v).size());
|
||
177 | assertEquals(10, ((JsonArray)v).getInt(0)); |
||
178 | assertEquals(20, ((JsonArray)v).getInt(1)); |
||
179 | assertEquals("adios", ((JsonArray)v).getString(2)); |
||
180 | 44139 | jjdelcerro | } |
181 | |||
182 | 45011 | jjdelcerro | public void testComplexToJsonArrayFromList() throws ParseException { |
183 | 44761 | jjdelcerro | SymbolTable symbolTable = createSymbolTable(); |
184 | 44139 | jjdelcerro | Compiler compiler = createCompiler();
|
185 | Interpreter interpreter = createInterpreter(symbolTable); |
||
186 | |||
187 | 45011 | jjdelcerro | String source = "to_json([ 10, 20, { diez:10, veinte:20, despedida:'adios' }, 'adios' ])"; |
188 | 44139 | jjdelcerro | |
189 | Code code = compiler.compileExpression(source); |
||
190 | Object v = interpreter.run(code);
|
||
191 | 45011 | jjdelcerro | |
192 | assertEquals("to_json([ 10, 20, { 'diez':10, 'veinte':20, 'despedida':'adios' }, 'adios' ])", code.toString());
|
||
193 | |||
194 | assertTrue("JsonArray expected", v instanceof JsonArray); |
||
195 | assertEquals(4, ((JsonArray)v).size());
|
||
196 | assertEquals(10, ((JsonArray)v).getInt(0)); |
||
197 | assertEquals(20, ((JsonArray)v).getInt(1)); |
||
198 | assertEquals("adios", ((JsonArray)v).getString(3)); |
||
199 | 44139 | jjdelcerro | |
200 | 45011 | jjdelcerro | assertTrue("JsonObject expected", ((JsonArray)v).getJsonObject(2) instanceof JsonObject); |
201 | JsonObject jsonobj = ((JsonArray)v).getJsonObject(2);
|
||
202 | assertEquals(3, jsonobj.size());
|
||
203 | assertEquals(10, jsonobj.getInt("diez")); |
||
204 | assertEquals(20, jsonobj.getInt("veinte")); |
||
205 | assertEquals("adios", jsonobj.getString("despedida")); |
||
206 | 44139 | jjdelcerro | |
207 | 45011 | jjdelcerro | } |
208 | 45025 | jjdelcerro | |
209 | public void testLambda1() throws ParseException { |
||
210 | SymbolTable symbolTable = createSymbolTable(); |
||
211 | Compiler compiler = createCompiler();
|
||
212 | Interpreter interpreter = createInterpreter(symbolTable); |
||
213 | |||
214 | String source = "begin set x to 10 ; set fn = lambda : x * 2; fn(); end"; |
||
215 | |||
216 | Code code = compiler.compileExpression(source); |
||
217 | assertEquals("BLOCK(LET('x', 10), LET('fn', CREATE_FUNCTION(NULL, (\"x\" * 2))), fn())", code.toString());
|
||
218 | |||
219 | Object v = interpreter.run(code);
|
||
220 | assertEquals(20, ((Number)v).intValue()); |
||
221 | } |
||
222 | |||
223 | public void testLambda1WithArgs() throws ParseException { |
||
224 | SymbolTable symbolTable = createSymbolTable(); |
||
225 | Compiler compiler = createCompiler();
|
||
226 | Interpreter interpreter = createInterpreter(symbolTable); |
||
227 | |||
228 | String source = "begin set x to 10 ; set fn = lambda n : (x * 2) + n; fn(3); end"; |
||
229 | |||
230 | Code code = compiler.compileExpression(source); |
||
231 | assertEquals("BLOCK(LET('x', 10), LET('fn', CREATE_FUNCTION(LIST('n'), ((\"x\" * 2) + \"n\"))), fn(3))", code.toString());
|
||
232 | |||
233 | Object v = interpreter.run(code);
|
||
234 | assertEquals(23, ((Number)v).intValue()); |
||
235 | } |
||
236 | |||
237 | public void testMap1() throws ParseException { |
||
238 | SymbolTable symbolTable = createSymbolTable(); |
||
239 | Compiler compiler = createCompiler();
|
||
240 | Interpreter interpreter = createInterpreter(symbolTable); |
||
241 | |||
242 | String source = "begin " + |
||
243 | "set data to [ { a:10, b:'primero'}, { a:20, b:'segundo'} ] ; "+
|
||
244 | "set data2 to map( lambda x: { label:x['b'], value:x['a'] }, data); "+
|
||
245 | "cast(to_json(data2) as String); " +
|
||
246 | "end";
|
||
247 | |||
248 | Code code = compiler.compileExpression(source); |
||
249 | assertEquals("BLOCK(LET('data', LIST(DICT('a', 10, 'b', 'primero'), DICT('a', 20, 'b', 'segundo'))), LET('data2', map(CREATE_FUNCTION(LIST('x'), DICT('label', GETITEM(\"x\", 'b'), 'value', GETITEM(\"x\", 'a'))), \"data\")), CAST(to_json(\"data2\"), 'String'))", code.toString());
|
||
250 | |||
251 | Object v = interpreter.run(code);
|
||
252 | assertEquals("[{\"label\":\"primero\",\"value\":10},{\"label\":\"segundo\",\"value\":20}]", (String)v); |
||
253 | } |
||
254 | 44139 | jjdelcerro | } |