unit_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package unit
  2. import (
  3. "testing"
  4. )
  5. func TestParseUnit_Strings(t *testing.T) {
  6. tests := []struct {
  7. name string
  8. input string
  9. expect Unit
  10. expectErr bool
  11. }{
  12. // Duration units
  13. {name: "millisecond", input: "ms", expect: Millisecond, expectErr: false},
  14. {name: "second", input: "s", expect: Second, expectErr: false},
  15. {name: "minute", input: "min", expect: Minute, expectErr: false},
  16. {name: "hour", input: "hr", expect: Hour, expectErr: false},
  17. // Data storage units - decimal
  18. {name: "byte", input: "B", expect: Byte, expectErr: false},
  19. {name: "kilobyte", input: "KB", expect: KB, expectErr: false},
  20. {name: "megabyte", input: "MB", expect: MB, expectErr: false},
  21. {name: "gigabyte", input: "GB", expect: GB, expectErr: false},
  22. {name: "terabyte", input: "TB", expect: TB, expectErr: false},
  23. {name: "petabyte", input: "PB", expect: PB, expectErr: false},
  24. // Data storage units - binary
  25. {name: "kibibyte", input: "KiB", expect: KiB, expectErr: false},
  26. {name: "mebibyte", input: "MiB", expect: MiB, expectErr: false},
  27. {name: "gibibyte", input: "GiB", expect: GiB, expectErr: false},
  28. {name: "tebibyte", input: "TiB", expect: TiB, expectErr: false},
  29. {name: "pebibyte", input: "PiB", expect: PiB, expectErr: false},
  30. // Compute resources
  31. {name: "mCPU", input: "mCPU", expect: MCPU, expectErr: false},
  32. {name: "vCPU", input: "vCPU", expect: VCPU, expectErr: false},
  33. {name: "GPU", input: "GPU", expect: GPU, expectErr: false},
  34. // Compute resources over time
  35. {name: "vCPU-hr", input: "vCPU-hr", expect: VCPUHour, expectErr: false},
  36. {name: "RAM-GiB-hr", input: "RAM-GiB-hr", expect: RAMGiBHour, expectErr: false},
  37. {name: "GPU-hr", input: "GPU-hr", expect: GPUHour, expectErr: false},
  38. {name: "storage-GiB-hr", input: "storage-GiB-hr", expect: StorageGiBHour, expectErr: false},
  39. // Case insensitive tests
  40. {name: "uppercase ms", input: "MS", expect: Millisecond, expectErr: false},
  41. {name: "uppercase kb", input: "kb", expect: KB, expectErr: false},
  42. {name: "mixed case GiB", input: "gib", expect: GiB, expectErr: false},
  43. {name: "mixed case mCPU", input: "Mcpu", expect: MCPU, expectErr: false},
  44. {name: "mixed case vCPU-hr", input: "VCPU-HR", expect: VCPUHour, expectErr: false},
  45. // Invalid units
  46. {name: "invalid empty", input: "", expect: "", expectErr: true},
  47. {name: "invalid unknown", input: "xyz", expect: "", expectErr: true},
  48. {name: "invalid number", input: "123", expect: "", expectErr: true},
  49. {name: "invalid partial", input: "G", expect: "", expectErr: true},
  50. {name: "invalid with space", input: "G B", expect: "", expectErr: true},
  51. }
  52. for _, tt := range tests {
  53. t.Run(tt.name, func(t *testing.T) {
  54. got, err := ParseUnit(tt.input)
  55. if (err != nil) != tt.expectErr {
  56. t.Errorf("ParseUnit(%q) error = %v, expectErr %v", tt.input, err, tt.expectErr)
  57. return
  58. }
  59. if got != tt.expect {
  60. t.Errorf("ParseUnit(%q) = %v, expected %v", tt.input, got, tt.expect)
  61. }
  62. })
  63. }
  64. }
  65. func TestParseUnit_Constants(t *testing.T) {
  66. for _, unit := range validUnits {
  67. t.Run(string(unit), func(t *testing.T) {
  68. parsed, err := ParseUnit(string(unit))
  69. if err != nil {
  70. t.Errorf("ParseUnit(%q) unexpected error: %v", unit, err)
  71. }
  72. if parsed != unit {
  73. t.Errorf("ParseUnit(%q) = %v, expected %v", unit, parsed, unit)
  74. }
  75. })
  76. }
  77. }