1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
-- Expressions unit tests
context("Rspamd expressions", function()
local rspamd_expression = require "rspamd_expression"
local rspamd_mempool = require "rspamd_mempool"
local rspamd_regexp = require "rspamd_regexp"
local split_re = rspamd_regexp.create('/\\s+|\\)|\\(/')
local function parse_func(str)
-- extract token till the first space character
local token = str
local t = split_re:split(str)
if t then
token = t[1]
end
-- Return token name
return token
end
test("Expression creation function", function()
local function process_func(token, task)
-- Do something using token and task
end
local pool = rspamd_mempool.create()
local cases = {
{'A & B | !C', 'A B & C ! |'},
{'A & (B | !C)', 'A B C ! | &'},
-- Unbalanced braces
{'(((A))', nil},
-- Balanced braces
{'(((A)))', 'A'},
-- Plus and comparision operators
{'A + B + C + D > 2', 'A B C D + + + 2 >'},
-- Plus and logic operators
{'((A + B + C + D) > 2) & D', 'A B C D + + + 2 > D &'},
-- Associativity
{'A | B | C & D & E', 'A B C D E & & | |'},
-- More associativity
{'1 | 0 & 0 | 0', '1 0 0 & 0 | |'},
-- Extra space
{'A & B | ! C', 'A B & C ! |'},
}
for _,c in ipairs(cases) do
local expr,err = rspamd_expression.create(c[1],
{parse_func, process_func}, pool)
if not c[2] then
assert_nil(expr, "Should not be able to parse " .. c[1])
else
assert_not_nil(expr, "Cannot parse " .. c[1])
assert_equal(expr:to_string(), c[2], string.format("Evaluated expr to '%s', expected: '%s'",
expr:to_string(), c[2]))
end
end
-- Expression is destroyed when the corresponding pool is destroyed
pool:destroy()
end)
end)
|