| 1 | import math |
| 2 | import v.ast |
| 3 | import v.pref |
| 4 | import v.parser |
| 5 | import v.checker |
| 6 | import v.transformer |
| 7 | |
| 8 | fn test_const_par_expr_and_infix_expr() { |
| 9 | println(@LOCATION) |
| 10 | source_text := ' |
| 11 | const k = 2 |
| 12 | fn 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 | |
| 36 | fn test_float_infix_expr_keeps_roundtrip_precision() { |
| 37 | println(@LOCATION) |
| 38 | source_text := ' |
| 39 | fn 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 | |