v / vlib / v2 / ast / flat_string_inter_test.v
83 lines · 77 sloc · 2.15 KB · f3c5760b8838272e4789c38a1be9e03f9ceac351
Raw
1// Copyright (c) 2026 Alexander Medvednikov. All rights reserved.
2// Use of this source code is governed by an MIT license
3// that can be found in the LICENSE file.
4module ast
5
6import v2.token
7
8fn string_inter_test_expr() Expr {
9 return Expr(Ident{
10 name: 'value'
11 })
12}
13
14fn string_inter_test_literal(width int, precision int) Expr {
15 return Expr(StringInterLiteral{
16 kind: .v
17 values: ['value=', '']
18 inters: [
19 StringInter{
20 format: .decimal
21 width: width
22 precision: precision
23 expr: string_inter_test_expr()
24 format_expr: empty_expr
25 resolved_fmt: '%d'
26 },
27 ]
28 })
29}
30
31fn assert_string_inter_roundtrip(files []File, width int, precision int) {
32 assert files.len == 1
33 assert files[0].stmts.len == 2
34 assert files[0].stmts[1] is ExprStmt
35 expr_stmt := files[0].stmts[1] as ExprStmt
36 assert expr_stmt.expr is StringInterLiteral
37 lit := expr_stmt.expr as StringInterLiteral
38 assert lit.inters.len == 1
39 assert lit.inters[0].width == width
40 assert lit.inters[0].precision == precision
41}
42
43fn test_string_inter_width_precision_survive_flat_roundtrip_losslessly() {
44 width := 1_000_000
45 precision := -1_000_000
46 mut b := new_flat_builder()
47 b.append_file(File{
48 name: 'string_inter.v'
49 mod: 'string_inter'
50 stmts: [
51 Stmt(ModuleStmt{
52 name: 'string_inter'
53 }),
54 Stmt(ExprStmt{
55 expr: string_inter_test_literal(width, precision)
56 }),
57 ]
58 })
59 assert_string_inter_roundtrip(b.flat.to_files(), width, precision)
60}
61
62fn test_emit_string_inter_by_ids_preserves_large_width_precision() {
63 width := 900_000
64 precision := -900_000
65 mut b := new_flat_builder()
66 b.append_file(File{
67 name: 'string_inter_direct.v'
68 mod: 'string_inter'
69 stmts: [
70 Stmt(ModuleStmt{
71 name: 'string_inter'
72 }),
73 ]
74 })
75 expr_id := b.emit_expr(string_inter_test_expr())
76 format_expr_id := b.emit_expr(empty_expr)
77 inter_id :=
78 b.emit_string_inter_by_ids(.decimal, width, precision, expr_id, format_expr_id, '%d')
79 lit_id := b.emit_string_inter_literal_by_ids(.v, ['value=', ''], [inter_id], token.Pos{})
80 stmt_id := b.emit_expr_stmt_by_id(lit_id)
81 b.append_file_stmts(0, [stmt_id])
82 assert_string_inter_roundtrip(b.flat.to_files(), width, precision)
83}
84