fix(v2): money 去 float 进制 + 溢出防护 + 补 Format/负数/溢出测试

- money.go: 用纯 int64 循环乘法替代 int64(math.Pow10(exp)) 计算进制因子
- Parse: whole*mult+frac 前加溢出检查(math.MaxInt64 仅作整型常量参与比较,无 float 参与)
- money_test.go: 补 Format 未知币种错误分支(errors.Is ErrUnknownCurrency)、
  Parse 溢出(整数部分过大)、负数往返测试
This commit is contained in:
wangjia
2026-07-10 08:10:36 +08:00
parent 8555368785
commit 7da15c00a1
2 changed files with 58 additions and 2 deletions
+42
View File
@@ -1,6 +1,7 @@
package money_test
import (
"errors"
"testing"
"github.com/wangjia/pay/internal/money"
@@ -45,3 +46,44 @@ func TestParseErrors(t *testing.T) {
t.Fatal("非数字应报错")
}
}
func TestFormatUnknownCurrency(t *testing.T) {
_, err := money.Format(123, "JPYX")
if err == nil {
t.Fatal("未知币种应报错")
}
if !errors.Is(err, money.ErrUnknownCurrency) {
t.Fatalf("want ErrUnknownCurrency, got %v", err)
}
}
func TestParseOverflow(t *testing.T) {
// whole part fits int64 on its own, but whole*mult(+frac) overflows int64.
if _, err := money.Parse("92233720368547759", "CNY"); err == nil {
t.Fatal("整数部分过大导致 minor 溢出 int64 应报错")
}
if _, err := money.Parse("92233720368547758.07", "CNY"); err != nil {
t.Fatalf("恰好等于 int64 上限不应报错: %v", err)
}
}
func TestParseFormatNegative(t *testing.T) {
minor, err := money.Parse("-12.34", "CNY")
if err != nil {
t.Fatalf("Parse(-12.34): %v", err)
}
if minor != -1234 {
t.Fatalf("Parse(-12.34)=%d want -1234", minor)
}
back, err := money.Format(-1234, "CNY")
if err != nil {
t.Fatalf("Format(-1234): %v", err)
}
again, err := money.Parse(back, "CNY")
if err != nil {
t.Fatalf("Parse(%q): %v", back, err)
}
if again != -1234 {
t.Fatalf("round-trip -1234 → %q → %d", back, again)
}
}