| 1 | import strconv |
| 2 | |
| 3 | fn 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 | |
| 112 | fn 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 | |
| 117 | fn 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 | |
| 123 | struct SprintfPromotedValue { |
| 124 | mut: |
| 125 | x u8 |
| 126 | } |
| 127 | |
| 128 | fn 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 | |
| 138 | fn 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 | |
| 145 | fn 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 | |