v / vlib / strconv / format_test.v
162 lines · 144 sloc · 4.85 KB · 927b23997afb45d960cdb4180dce2fa98b4609ee
Raw
1import strconv
2
3fn test_format() {
4 mut temp_s := ''
5 mut tmp_str := ''
6 a0 := u32(10)
7 b0 := 200
8 c0 := u8(12)
9 s0 := 'ciAo'
10 ch0 := `B`
11 f0 := 0.312345
12 f1 := 200000.0
13 f2 := -1234.300e6
14 f3 := 1234.300e-6
15
16 sc0 := 'ciao: [%-08u] %d %hhd [%8s] [%08X] [%-20.4f] [%-20.4f] [%c]'
17 temp_s = unsafe { strconv.v_sprintf(sc0, a0, b0, c0, s0, b0, f0, f1, ch0) }
18 tmp_str = 'ciao: [10 ] 200 12 [ ciAo] [000000C8] [0.3123 ] [200000.0000 ] [B]'
19 // C.printf(sc0.str,a0 ,b0 ,c0 ,s0.str ,b0 ,f0, f1, ch0)
20 // println("\n${temp_s}")
21 assert tmp_str == temp_s
22
23 a := u8(12)
24 b := i16(13)
25 c := 14
26 d := i64(15)
27 sc1 := '==>%hhd %hd %d %ld'
28 temp_s = unsafe { strconv.v_sprintf(sc1, a, b, c, d) }
29 tmp_str = '==>12 13 14 15'
30 // C.printf(sc1.str, a ,b ,c, d)
31 // println("\n${temp_s}")
32 assert tmp_str == temp_s
33
34 a1 := u8(0xff)
35 b1 := i16(u16(0xffff))
36 c1 := u32(0xffff_ffff)
37 d1 := u64(-1)
38 sc2 := '%hhu %hu %u %lu'
39 temp_s = unsafe { strconv.v_sprintf(sc2, a1, b1, c1, d1) }
40 tmp_str = '255 65535 4294967295 18446744073709551615'
41 // C.printf(sc2.str, a1 ,b1 ,c1, d1)
42 // println("\n${temp_s}")
43 assert tmp_str == temp_s
44
45 sc3 := '%hhx %hx %x %lx'
46 temp_s = unsafe { strconv.v_sprintf(sc3, a1, b1, c1, d1) }
47 tmp_str = 'ff ffff ffffffff ffffffffffffffff'
48 // C.printf(sc3.str, a1 ,b1 ,c1, d1)
49 // println("\n${temp_s}")
50 assert tmp_str == temp_s
51
52 sc4 := '[%-20.3e] [%20.3e] [%-020.3e] [%-020.3E] [%-020.3e] [%-020.3e]'
53 temp_s = unsafe { strconv.v_sprintf(sc4, f0, f1, f1, f1, f2, f3) }
54 tmp_str = '[3.123e-01 ] [ 2.000e+05] [2.000e+05 ] [2.000E+05 ] [-1.234e+09 ] [1.234e-03 ]'
55 // C.printf(sc4.str, f0, f1, f1, f1, f2, f3)
56 // println("\n${temp_s}")
57 assert tmp_str == temp_s
58
59 sc5 := '[%.3f] [%0.3f] [%0.3F] [%0.3f] [%0.3F]'
60 temp_s = unsafe { strconv.v_sprintf(sc5, f0, f1, f1, f2, f3) }
61 tmp_str = '[0.312] [200000.000] [200000.000] [-1234300000.000] [0.001]'
62 // C.printf(sc5.str, f0, f1, f1, f2, f3, f3)
63 // println("\n${temp_s}")
64 assert tmp_str == temp_s
65
66 ml := 3
67 sc6 := '%.*s [%05hhX]'
68 temp_s = unsafe { strconv.v_sprintf(sc6, ml, s0, a) }
69 tmp_str = 'ciA [0000C]'
70 // C.printf(sc6.str, ml, s0.str, a)
71 // println("\n${temp_s}")
72 assert tmp_str == temp_s
73
74 a2 := 125
75 sc7 := '[%9x] [%9X] [%-9x] [%-9X] [%09x] [%09X]'
76 temp_s = unsafe { strconv.v_sprintf(sc7, a2, a2, a2, a2, a2, a2) }
77 tmp_str = '[ 7d] [ 7D] [7d ] [7D ] [00000007d] [00000007D]'
78 // C.printf(sc7.str, a2, a2, a2, a2, a2, a2)
79 // println("\n${temp_s}")
80 assert tmp_str == temp_s
81
82 g_test := [
83 '[ -1e-07][ -1E-07]|',
84 '[ -1e-06][ -1E-06]|',
85 '[ -1e-05][ -1E-05]|',
86 '[ -0.0001][ -0.0001]|',
87 '[ -0.001][ -0.001]|',
88 '[ -0.01][ -0.01]|',
89 '[ -0.1][ -0.1]|',
90 '[ -1][ -1]|',
91 '[ -10][ -10]|',
92 '[ -100][ -100]|',
93 '[ -1000][ -1000]|',
94 '[ -10000][ -10000]|',
95 ]
96
97 mut ft := -1e-7
98 mut x := 0
99 mut cnt := 0
100 sc8 := '[%20g][%20G]|'
101 for x < 12 {
102 temp_s = unsafe { strconv.v_sprintf(sc8, ft, ft) }
103 // C.printf(sc8.str, ft, ft)
104 // println("\n${temp_s}")
105 assert temp_s == g_test[cnt]
106 ft = ft * 10.0
107 x++
108 cnt++
109 }
110}
111
112fn test_sprintf_does_not_double_free_on_g() {
113 x := 3.141516
114 assert unsafe { strconv.v_sprintf('aaa %G', x) } == 'aaa 3.141516'
115}
116
117fn test_sprintf_with_escape() {
118 n := 69
119 s := unsafe { strconv.v_sprintf('%d is 100%% awesome', n) }
120 assert s == '69 is 100% awesome'
121}
122
123struct SprintfPromotedValue {
124mut:
125 x u8
126}
127
128fn test_sprintf_promoted_variadic_values() {
129 mut value := SprintfPromotedValue{
130 x: 1
131 }
132 assert unsafe { strconv.v_sprintf('x=%02d', value.x) } == 'x=01'
133 assert unsafe { strconv.v_sprintf('x=%02d', int(value.x)) } == 'x=01'
134 assert unsafe { strconv.v_sprintf('%s', 'abc') } == 'abc'
135 assert unsafe { strconv.v_sprintf('%.1f', f32(1.5)) } == '1.5'
136}
137
138fn test_remove_tail_zeros() {
139 assert strconv.remove_tail_zeros('1.234000000000') == '1.234'
140 assert strconv.remove_tail_zeros('1.0000000') == '1'
141 assert strconv.remove_tail_zeros('1234') == '1234'
142 assert strconv.remove_tail_zeros('1.00000000007') == '1.00000000007'
143}
144
145fn test_g_format() {
146 a := 1234.56789000e10
147 assert '${a:1.0g}' == '1e+13'
148 assert '${a:1.1g}' == '1e+13'
149 assert '${a:1.2g}' == '1.2e+13'
150 assert '${a:1.3g}' == '1.23e+13'
151 assert '${a:1.4g}' == '1.235e+13'
152 assert '${a:1.5g}' == '1.2346e+13'
153 assert '${a:1.6g}' == '1.23457e+13'
154 assert '${a:1.7g}' == '1.234568e+13'
155 assert '${a:1.8g}' == '1.2345679e+13'
156 assert '${a:1.9g}' == '1.23456789e+13'
157 assert '${a:1.10g}' == '1.23456789e+13'
158 assert '${a:1.11g}' == '1.23456789e+13'
159 assert '${a:1.12g}' == '1.23456789e+13'
160
161 // TODO: e format not support due to issue #22429
162}
163