v2 / vlib / v / transformer / tests / const_infix_expr_test.v
58 lines · 52 sloc · 1.67 KB · ea22f6c9447ec6e6f3b3b2fe459ae343a9d8b55f
Raw
1import math
2import v.ast
3import v.pref
4import v.parser
5import v.checker
6import v.transformer
7
8fn test_const_par_expr_and_infix_expr() {
9 println(@LOCATION)
10 source_text := '
11const k = 2
12fn main() {
13 x := [(k+1)-2+(2*(k))]int{}
14}
15'
16 mut table := ast.new_table()
17 vpref := &pref.Preferences{}
18 mut prog := parser.parse_text(source_text, '', mut table, .skip_comments, vpref)
19 mut checker_ := checker.new_checker(table, vpref)
20 checker_.check(mut prog)
21 mut t := transformer.new_transformer_with_table(table, vpref)
22
23 // get the `InfixExpr`(`(k+1)-2+(2*(k))`) from table
24 main_fn := table.cur_fn
25 assign_stmt := main_fn.stmts[0] as ast.AssignStmt
26 array_init_expr := assign_stmt.right[0] as ast.ArrayInit
27 mut dim_expr := array_init_expr.exprs[0] as ast.InfixExpr
28 dump(dim_expr)
29
30 // verify `infix_expr` and `par_expr` work as expected
31 folded_expr := t.infix_expr(mut dim_expr)
32 dump(folded_expr)
33 assert '${folded_expr}' == '5'
34}
35
36fn test_float_infix_expr_keeps_roundtrip_precision() {
37 println(@LOCATION)
38 source_text := '
39fn main() {
40 x := 9.765625000000004e-04 + 0.0
41}
42'
43 mut table := ast.new_table()
44 vpref := &pref.Preferences{}
45 mut prog := parser.parse_text(source_text, '', mut table, .skip_comments, vpref)
46 mut checker_ := checker.new_checker(table, vpref)
47 checker_.check(mut prog)
48 mut t := transformer.new_transformer_with_table(table, vpref)
49
50 main_fn := table.cur_fn
51 assign_stmt := main_fn.stmts[0] as ast.AssignStmt
52 mut infix_expr := assign_stmt.right[0] as ast.InfixExpr
53 folded_expr := t.infix_expr(mut infix_expr)
54
55 assert folded_expr is ast.FloatLiteral
56 literal := folded_expr as ast.FloatLiteral
57 assert math.f64_bits(literal.val.f64()) == math.f64_bits('9.765625000000004e-04'.f64())
58}
59