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 / TestCreateFunction.java @ 47063

History | View | Annotate | Download (7.8 KB)

1
package org.gvsig.expresionevaluator.impl;
2

    
3
import java.net.URL;
4
import java.text.ParseException;
5
import junit.framework.TestCase;
6
import static junit.framework.TestCase.assertEquals;
7
import org.gvsig.expressionevaluator.LexicalAnalyzer;
8
import org.gvsig.expressionevaluator.Compiler;
9
import org.gvsig.expressionevaluator.SymbolTable;
10
import org.gvsig.expressionevaluator.Interpreter;
11
import org.gvsig.expressionevaluator.Code;
12
import org.gvsig.expressionevaluator.ExpressionEvaluatorLocator;
13
import org.gvsig.expressionevaluator.ExpressionEvaluatorManager;
14
import org.gvsig.expressionevaluator.MutableSymbolTable;
15
import org.gvsig.tools.library.impl.DefaultLibrariesInitializer;
16
import org.gvsig.tools.resourcesstorage.AbstractResourcesStorage;
17
import org.gvsig.tools.resourcesstorage.URLResource;
18

    
19
public class TestCreateFunction extends TestCase {
20

    
21
    private static class Test1ResourcesStorage extends AbstractResourcesStorage {
22

    
23
        public Test1ResourcesStorage() {
24
            
25
        }
26
        
27
        @Override
28
        public Resource getResource(String resourceName) {
29
            URL url = this.getClass().getResource("/org/gvsig/expressionevaluator/impl/"+resourceName+".cosa");
30
            if( url == null ) {
31
                return null;
32
            }
33
            Resource res = new URLResource(resourceName+".cosa", url);
34
            return res;
35
        }        
36
    }
37
    
38
    public TestCreateFunction(String testName) {
39
        super(testName);
40
    }
41
    
42
    @Override
43
    protected void setUp() throws Exception {
44
        super.setUp();
45
        new DefaultLibrariesInitializer().fullInitialize();
46
    }
47
    
48
    @Override
49
    protected void tearDown() throws Exception {
50
        super.tearDown();
51
    }
52

    
53
    // TODO add test methods here. The name must begin with 'test'. For example:
54
    // public void testHello() {}
55

    
56
    
57
    protected LexicalAnalyzer createLexicalAnalyzer() {
58
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
59
        LexicalAnalyzer lexer = manager.createLexicalAnalyzer();
60
        return lexer;
61
    }
62

    
63
    protected org.gvsig.expressionevaluator.Compiler createCompiler() {
64
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
65
        Compiler compiler = manager.createCompiler();
66
        compiler.setLexicalAnalyzer(createLexicalAnalyzer());
67
        return compiler;
68
    }
69

    
70
    
71
    protected SymbolTable createSymbolTable() {
72
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
73
        MutableSymbolTable symbolTable = manager.createSymbolTable();
74
        symbolTable.setVar("precio", 200);
75
        symbolTable.setVar("1990", 0.168873933773767);
76
        return symbolTable;
77
    }
78
    
79
    protected Interpreter createInterpreter(SymbolTable symbolTable) {
80
        ExpressionEvaluatorManager manager = ExpressionEvaluatorLocator.getManager();
81
        manager.setScriptsResourcesStorage(new Test1ResourcesStorage());
82
        Interpreter interpreter = manager.createInterpreter();
83
        interpreter.setSymbolTable(symbolTable);
84
        return interpreter;
85
    }
86
    
87
    public void testStringUtilsCapitalize() {
88
        SymbolTable symbolTable = createSymbolTable();
89
        Compiler compiler = createCompiler();
90
        Interpreter interpreter = createInterpreter(symbolTable);
91
        
92
        String source = "BEGIN "
93
                + "CREATE FUNCTION CAPITALIZE(s) AS "
94
                + "'org.apache.commons.lang3.StringUtils', 'capitalize' "
95
                + "LANGUAGE 'java';"
96
                + "CAPITALIZE('hola');"
97
                + "END";
98
        
99
        Code code = compiler.compileExpression(source);
100
        assertEquals("BLOCK(CREATE_FUNCTION('CAPITALIZE', LIST('s'), NULL, 'org.apache.commons.lang3.StringUtils', 'capitalize', 'java', NULL), CAPITALIZE('hola'))", code.toString());
101
                      
102
        Object v = interpreter.run(code);
103
        assertEquals("Hola", v.toString());
104
    }
105
    
106
    public void testSQRT() {
107
        SymbolTable symbolTable = createSymbolTable();
108
        Compiler compiler = createCompiler();
109
        Interpreter interpreter = createInterpreter(symbolTable);
110
        
111
        String source = "BEGIN "
112
                + "CREATE FUNCTION SQUARE(num) AS BEGIN RETURN num*num; END; "
113
                + "SQUARE(4);"
114
                + "END";
115
        
116
        Code code = compiler.compileExpression(source);
117
        assertEquals("BLOCK(CREATE_FUNCTION('SQUARE', LIST('num'), RETURN((\"num\" * \"num\")), NULL, NULL, NULL, NULL), SQUARE(4))", code.toString());
118
        Object v = interpreter.run(code);
119
        assertEquals(16, ((Number)v).intValue());
120
    }
121
    
122
    public void testCreateFunctionWithExcept1() {
123
        SymbolTable symbolTable = createSymbolTable();
124
        Compiler compiler = createCompiler();
125
        Interpreter interpreter = createInterpreter(symbolTable);
126
        
127
        String source = "BEGIN "
128
                + "CREATE FUNCTION SQUARE(num) AS BEGIN RETURN num*num; EXCEPT -1; END; "
129
                + "SQUARE(4);"
130
                + "END";
131
        
132
        Code code = compiler.compileExpression(source);
133
        assertEquals("BLOCK(CREATE_FUNCTION('SQUARE', LIST('num'), RETURN((\"num\" * \"num\")), NULL, NULL, NULL, -1), SQUARE(4))", code.toString());
134
        Object v = interpreter.run(code);
135
        assertEquals(16, ((Number)v).intValue());
136
    }
137
    
138
    public void testCreateFunctionWithExcept2() {
139
        SymbolTable symbolTable = createSymbolTable();
140
        Compiler compiler = createCompiler();
141
        Interpreter interpreter = createInterpreter(symbolTable);
142
        
143
        String source = "BEGIN "
144
                + "CREATE FUNCTION SQUARE(num) AS BEGIN RETURN 1/0; EXCEPT -1; END; "
145
                + "SQUARE(4);"
146
                + "END";
147
        
148
        Code code = compiler.compileExpression(source);
149
        assertEquals("BLOCK(CREATE_FUNCTION('SQUARE', LIST('num'), RETURN((1 / 0)), NULL, NULL, NULL, -1), SQUARE(4))", code.toString());
150
        Object v = interpreter.run(code);
151
        assertEquals(-1, ((Number)v).intValue());
152
    }
153
    
154
    public void testSQRTScriptEngine() {
155
        SymbolTable symbolTable = createSymbolTable();
156
        Compiler compiler = createCompiler();
157
        Interpreter interpreter = createInterpreter(symbolTable);
158
        
159
        String source = "BEGIN "
160
                + "CREATE FUNCTION SQUARE(num) AS 'testlib', 'SQUARE';"
161
                + "SQUARE(4);"
162
                + "END";
163
        
164
        Code code = compiler.compileExpression(source);
165
        assertEquals("BLOCK(CREATE_FUNCTION('SQUARE', LIST('num'), NULL, 'testlib', 'SQUARE', NULL, NULL), SQUARE(4))", code.toString());
166
        Object v = interpreter.run(code);
167
        assertEquals(16, ((Number)v).intValue());
168
    }
169

    
170
    public void testLambda1() throws ParseException {
171
        SymbolTable symbolTable = createSymbolTable();
172
        Compiler compiler = createCompiler();
173
        Interpreter interpreter = createInterpreter(symbolTable);
174
        
175
        String source = "begin set x to 10 ; set fn = lambda : x * 2; fn(); end";
176

    
177
        Code code = compiler.compileExpression(source);
178
        assertEquals("BLOCK(LET('x', 10), LET('fn', CREATE_FUNCTION(NULL, (\"x\" * 2))), fn())", code.toString());
179

    
180
        Object v = interpreter.run(code);
181
        assertEquals(20, ((Number)v).intValue());
182
    }
183

    
184
    public void testLambda1WithArgs() throws ParseException {
185
        SymbolTable symbolTable = createSymbolTable();
186
        Compiler compiler = createCompiler();
187
        Interpreter interpreter = createInterpreter(symbolTable);
188
        
189
        String source = "begin set x to 10 ; set fn = lambda n : (x * 2) + n; fn(3); end";
190

    
191
        Code code = compiler.compileExpression(source);
192
        assertEquals("BLOCK(LET('x', 10), LET('fn', CREATE_FUNCTION(LIST('n'), ((\"x\" * 2) + \"n\"))), fn(3))", code.toString());
193

    
194
        Object v = interpreter.run(code);
195
        assertEquals(23, ((Number)v).intValue());
196
    }
197
    
198
}