@@ -2,7 +2,11 @@ import type { FiatBalance } from "@ledgerhq/ledger-wallet-provider-core";
22import { describe , expect , it } from "vitest" ;
33
44import { DEFAULT_LOCALE } from "../context/constants/languages.js" ;
5- import { formatFiatBalance , formatFiatValue } from "./format-fiat.js" ;
5+ import {
6+ formatFiatBalance ,
7+ formatFiatValue ,
8+ formatTokenBalance ,
9+ } from "./format-fiat.js" ;
610
711describe ( "formatFiatValue" , ( ) => {
812 describe ( "ISO 4217 currency codes (en-US)" , ( ) => {
@@ -60,6 +64,92 @@ describe("formatFiatValue", () => {
6064 } ) ;
6165} ) ;
6266
67+ describe ( "formatTokenBalance" , ( ) => {
68+ describe ( "locale formatting" , ( ) => {
69+ it ( "uses dot as decimal separator in en-US" , ( ) => {
70+ expect ( formatTokenBalance ( "0.01" , "en-US" ) ) . toBe ( "0.01" ) ;
71+ } ) ;
72+
73+ it ( "uses comma as decimal separator in fr-FR" , ( ) => {
74+ expect ( formatTokenBalance ( "0.01" , "fr-FR" ) ) . toBe ( "0,01" ) ;
75+ } ) ;
76+
77+ it ( "uses grouping separator in en-US for large numbers" , ( ) => {
78+ expect ( formatTokenBalance ( "1234567.89" , "en-US" ) ) . toBe ( "1,234,567.89" ) ;
79+ } ) ;
80+
81+ it ( "uses grouping separator in fr-FR for large numbers" , ( ) => {
82+ expect ( formatTokenBalance ( "1234567.89" , "fr-FR" ) ) . toBe (
83+ "1\u202f234\u202f567,89" ,
84+ ) ;
85+ } ) ;
86+ } ) ;
87+
88+ describe ( "precision display" , ( ) => {
89+ it ( "preserves up to 8 decimal places" , ( ) => {
90+ expect ( formatTokenBalance ( "0.12345678" , "en-US" ) ) . toBe ( "0.12345678" ) ;
91+ } ) ;
92+
93+ it ( "trims trailing zeros beyond significant digits" , ( ) => {
94+ expect ( formatTokenBalance ( "1.10000000" , "en-US" ) ) . toBe ( "1.1" ) ;
95+ } ) ;
96+
97+ it ( "formats zero" , ( ) => {
98+ expect ( formatTokenBalance ( "0" , "en-US" ) ) . toBe ( "0" ) ;
99+ } ) ;
100+
101+ it ( "rounds fractional digits beyond 8 decimal places" , ( ) => {
102+ expect ( formatTokenBalance ( "1.123456789" , "en-US" ) ) . toBe ( "1.12345679" ) ;
103+ } ) ;
104+
105+ it ( "rounds small fractional values to 8 decimal places" , ( ) => {
106+ expect ( formatTokenBalance ( "0.000000093229707264" , "en-US" ) ) . toBe (
107+ "0.00000009" ,
108+ ) ;
109+ } ) ;
110+ } ) ;
111+
112+ describe ( "negative numbers" , ( ) => {
113+ it ( "uses dot as decimal separator in en-US" , ( ) => {
114+ expect ( formatTokenBalance ( "-0.01" , "en-US" ) ) . toBe ( "-0.01" ) ;
115+ } ) ;
116+
117+ it ( "uses comma as decimal separator in fr-FR" , ( ) => {
118+ expect ( formatTokenBalance ( "-0.01" , "fr-FR" ) ) . toBe ( "-0,01" ) ;
119+ } ) ;
120+
121+ it ( "uses grouping separator in en-US for large numbers" , ( ) => {
122+ expect ( formatTokenBalance ( "-1234567.89" , "en-US" ) ) . toBe ( "-1,234,567.89" ) ;
123+ } ) ;
124+
125+ it ( "uses grouping separator in fr-FR for large numbers" , ( ) => {
126+ expect ( formatTokenBalance ( "-1234567.89" , "fr-FR" ) ) . toBe (
127+ "-1\u202f234\u202f567,89" ,
128+ ) ;
129+ } ) ;
130+
131+ it ( "preserves up to 8 decimal places" , ( ) => {
132+ expect ( formatTokenBalance ( "-0.12345678" , "en-US" ) ) . toBe ( "-0.12345678" ) ;
133+ } ) ;
134+
135+ it ( "trims trailing zeros beyond significant digits" , ( ) => {
136+ expect ( formatTokenBalance ( "-1.10000000" , "en-US" ) ) . toBe ( "-1.1" ) ;
137+ } ) ;
138+ } ) ;
139+
140+ describe ( "edge cases" , ( ) => {
141+ it ( "returns the raw string when value is not a valid number" , ( ) => {
142+ expect ( formatTokenBalance ( "not-a-number" , "en-US" ) ) . toBe ( "not-a-number" ) ;
143+ } ) ;
144+
145+ it ( "uses DEFAULT_LOCALE when locale is omitted" , ( ) => {
146+ expect ( formatTokenBalance ( "1.5" ) ) . toBe (
147+ formatTokenBalance ( "1.5" , DEFAULT_LOCALE ) ,
148+ ) ;
149+ } ) ;
150+ } ) ;
151+ } ) ;
152+
63153describe ( "formatFiatBalance" , ( ) => {
64154 it ( "returns empty string when balance is undefined" , ( ) => {
65155 expect ( formatFiatBalance ( undefined , "en-US" ) ) . toBe ( "" ) ;
0 commit comments