Statistics
| Revision:

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
package org.gvsig.expresionevaluator.impl;
2

    
3
import java.text.ParseException;
4
import java.util.List;
5
import java.util.Map;
6
import javax.json.JsonArray;
7
import javax.json.JsonObject;
8
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
public class TestJsonInterpreter extends TestCase {
24

    
25
    public TestJsonInterpreter(String testName) {
26
        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
    
71
    public void testSimpleList() throws ParseException {
72
        SymbolTable symbolTable = createSymbolTable();
73
        Compiler compiler = createCompiler();
74
        Interpreter interpreter = createInterpreter(symbolTable);
75

    
76
        String source = "[ 10, 20, 'adios' ]";
77

    
78
        Code code = compiler.compileExpression(source);
79
        Object v = interpreter.run(code);
80
        
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
    }
88

    
89
    public void testSimpleDict() throws ParseException {
90
        SymbolTable symbolTable = createSymbolTable();
91
        Compiler compiler = createCompiler();
92
        Interpreter interpreter = createInterpreter(symbolTable);
93

    
94
        String source = "{ diez:10, 'veinte':20, saludo:'hola', 'despedida':'adios' }";
95

    
96
        Code code = compiler.compileExpression(source);
97
        Object v = interpreter.run(code);
98
        
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
    }
107

    
108
    public void testSimpleToJsonObjectFromString() throws ParseException {
109
        SymbolTable symbolTable = createSymbolTable();
110
        Compiler compiler = createCompiler();
111
        Interpreter interpreter = createInterpreter(symbolTable);
112

    
113
        String source = "to_json('{ \"diez\":10, \"veinte\":20, \"despedida\":\"adios\" }')";
114

    
115
        Code code = compiler.compileExpression(source);
116
        Object v = interpreter.run(code);
117

    
118
        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
    }
125

    
126
    public void testSimpleToJsonObjectFromMap() throws ParseException {
127
        SymbolTable symbolTable = createSymbolTable();
128
        Compiler compiler = createCompiler();
129
        Interpreter interpreter = createInterpreter(symbolTable);
130

    
131
        String source = "to_json({ diez:10, veinte:20, despedida:'adios' })";
132

    
133
        Code code = compiler.compileExpression(source);
134
        Object v = interpreter.run(code);
135

    
136
        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
    }
143

    
144
    public void testSimpleToJsonArrayFromString() throws ParseException {
145
        SymbolTable symbolTable = createSymbolTable();
146
        Compiler compiler = createCompiler();
147
        Interpreter interpreter = createInterpreter(symbolTable);
148

    
149
        String source = "to_json('[ 10, 20, \"adios\" ]')";
150

    
151
        Code code = compiler.compileExpression(source);
152
        Object v = interpreter.run(code);
153
        
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
    }
162

    
163
    public void testSimpleToJsonArrayFromList() throws ParseException {
164
        SymbolTable symbolTable = createSymbolTable();
165
        Compiler compiler = createCompiler();
166
        Interpreter interpreter = createInterpreter(symbolTable);
167

    
168
        String source = "to_json([ 10, 20, 'adios' ])";
169

    
170
        Code code = compiler.compileExpression(source);
171
        Object v = interpreter.run(code);
172
        
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
    }
181

    
182
    public void testComplexToJsonArrayFromList() throws ParseException {
183
        SymbolTable symbolTable = createSymbolTable();
184
        Compiler compiler = createCompiler();
185
        Interpreter interpreter = createInterpreter(symbolTable);
186

    
187
        String source = "to_json([ 10, 20, { diez:10, veinte:20, despedida:'adios' }, 'adios' ])";
188

    
189
        Code code = compiler.compileExpression(source);
190
        Object v = interpreter.run(code);
191
        
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

    
200
        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

    
207
    }
208
    
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
}