currency_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package unit
  2. import (
  3. "strings"
  4. "testing"
  5. )
  6. func TestParseCurrency(t *testing.T) {
  7. tests := []struct {
  8. name string
  9. input string
  10. expect Currency
  11. expectErr bool
  12. }{
  13. // Valid currencies - exact case
  14. {name: "AUD", input: "AUD", expect: AUD, expectErr: false},
  15. {name: "BRL", input: "BRL", expect: BRL, expectErr: false},
  16. {name: "CAD", input: "CAD", expect: CAD, expectErr: false},
  17. {name: "CHF", input: "CHF", expect: CHF, expectErr: false},
  18. {name: "CNY", input: "CNY", expect: CNY, expectErr: false},
  19. {name: "DKK", input: "DKK", expect: DKK, expectErr: false},
  20. {name: "EUR", input: "EUR", expect: EUR, expectErr: false},
  21. {name: "GBP", input: "GBP", expect: GBP, expectErr: false},
  22. {name: "IDR", input: "IDR", expect: IDR, expectErr: false},
  23. {name: "INR", input: "INR", expect: INR, expectErr: false},
  24. {name: "JPY", input: "JPY", expect: JPY, expectErr: false},
  25. {name: "NOK", input: "NOK", expect: NOK, expectErr: false},
  26. {name: "PLN", input: "PLN", expect: PLN, expectErr: false},
  27. {name: "SEK", input: "SEK", expect: SEK, expectErr: false},
  28. {name: "USD", input: "USD", expect: USD, expectErr: false},
  29. // Case insensitive tests
  30. {name: "lowercase usd", input: "usd", expect: USD, expectErr: false},
  31. {name: "lowercase eur", input: "eur", expect: EUR, expectErr: false},
  32. {name: "lowercase gbp", input: "gbp", expect: GBP, expectErr: false},
  33. {name: "mixed case Usd", input: "Usd", expect: USD, expectErr: false},
  34. {name: "mixed case eUr", input: "eUr", expect: EUR, expectErr: false},
  35. // Invalid currencies
  36. {name: "invalid empty", input: "", expect: "", expectErr: true},
  37. {name: "invalid unknown", input: "XYZ", expect: "", expectErr: true},
  38. {name: "invalid number", input: "123", expect: "", expectErr: true},
  39. {name: "invalid partial", input: "US", expect: "", expectErr: true},
  40. {name: "invalid too long", input: "USDD", expect: "", expectErr: true},
  41. {name: "invalid with space", input: "U SD", expect: "", expectErr: true},
  42. {name: "invalid symbol", input: "$", expect: "", expectErr: true},
  43. {name: "invalid symbol euro", input: "€", expect: "", expectErr: true},
  44. }
  45. for _, tt := range tests {
  46. t.Run(tt.name, func(t *testing.T) {
  47. got, err := ParseCurrency(tt.input)
  48. if (err != nil) != tt.expectErr {
  49. t.Errorf("ParseCurrency(%q) error = %v, expectErr %v", tt.input, err, tt.expectErr)
  50. return
  51. }
  52. if got != tt.expect {
  53. t.Errorf("ParseCurrency(%q) = %v, expect %v", tt.input, got, tt.expect)
  54. }
  55. })
  56. }
  57. }
  58. func TestParseCurrency_AllConstants(t *testing.T) {
  59. // Ensure all defined currency constants can be parsed
  60. allCurrencies := []Currency{
  61. AUD, BRL, CAD, CHF, CNY, DKK, EUR, GBP,
  62. IDR, INR, JPY, NOK, PLN, SEK, USD,
  63. }
  64. for _, currency := range allCurrencies {
  65. t.Run(string(currency), func(t *testing.T) {
  66. parsed, err := ParseCurrency(string(currency))
  67. if err != nil {
  68. t.Errorf("ParseCurrency(%q) unexpected error: %v", currency, err)
  69. }
  70. if parsed != currency {
  71. t.Errorf("ParseCurrency(%q) = %v, expected %v", currency, parsed, currency)
  72. }
  73. })
  74. }
  75. }
  76. func TestParseCurrency_CaseInsensitiveAllConstants(t *testing.T) {
  77. // Ensure all defined currency constants can be parsed in lowercase
  78. allCurrencies := []Currency{
  79. AUD, BRL, CAD, CHF, CNY, DKK, EUR, GBP,
  80. IDR, INR, JPY, NOK, PLN, SEK, USD,
  81. }
  82. for _, currency := range allCurrencies {
  83. lowercase := strings.ToLower(string(currency))
  84. t.Run(lowercase, func(t *testing.T) {
  85. parsed, err := ParseCurrency(lowercase)
  86. if err != nil {
  87. t.Errorf("ParseCurrency(%q) unexpected error: %v", lowercase, err)
  88. }
  89. if parsed != currency {
  90. t.Errorf("ParseCurrency(%q) = %v, expect %v", lowercase, parsed, currency)
  91. }
  92. })
  93. }
  94. }