diff --git a/store/tokens_test.go b/store/tokens_test.go index fbcca9d..625a65d 100644 --- a/store/tokens_test.go +++ b/store/tokens_test.go @@ -7,6 +7,109 @@ import ( "github.com/alecthomas/assert/v2" ) +func TestTruncateDecimalString(t *testing.T) { + tests := []struct { + name string + input string + decimalPlaces int + want string + expectError bool + }{ + { + name: "whole number", + input: "4", + decimalPlaces: 2, + want: "4.00", + expectError: false, + }, + { + name: "single decimal", + input: "4.1", + decimalPlaces: 2, + want: "4.10", + expectError: false, + }, + { + name: "one decimal place", + input: "4.19", + decimalPlaces: 1, + want: "4.1", + expectError: false, + }, + { + name: "truncates to 2 dp", + input: "0.149", + decimalPlaces: 2, + want: "0.14", + expectError: false, + }, + { + name: "does not round", + input: "1.8599999999", + decimalPlaces: 2, + want: "1.85", + expectError: false, + }, + { + name: "high precision input", + input: "123.456789", + decimalPlaces: 4, + want: "123.4567", + expectError: false, + }, + { + name: "zero", + input: "0", + decimalPlaces: 2, + want: "0.00", + expectError: false, + }, + { + name: "invalid input string", + input: "abc", + decimalPlaces: 2, + want: "", + expectError: true, + }, + { + name: "edge rounding case", + input: "4.99999999", + decimalPlaces: 2, + want: "4.99", + expectError: false, + }, + { + name: "small value", + input: "0.0001", + decimalPlaces: 2, + want: "0.00", + expectError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := TruncateDecimalString(tt.input, tt.decimalPlaces) + + if tt.expectError { + if err == nil { + t.Errorf("TruncateDecimalString(%q, %d) expected error, got nil", tt.input, tt.decimalPlaces) + } + return + } + + if err != nil { + t.Errorf("TruncateDecimalString(%q, %d) unexpected error: %v", tt.input, tt.decimalPlaces, err) + return + } + + if got != tt.want { + t.Errorf("TruncateDecimalString(%q, %d) = %q, want %q", tt.input, tt.decimalPlaces, got, tt.want) + } + }) + } +} + func TestParseAndScaleAmount(t *testing.T) { tests := []struct { name string